public abstract class KetchReplica extends Object
LocalReplica
or RemoteGitReplica
.
Replicas can be either a stock Git replica, or a Ketch-aware replica.
A stock Git replica has no special knowledge of Ketch and simply stores
objects and references. Ketch communicates with the stock Git replica using
the Git push wire protocol. The
KetchLeader
commits an agreed upon
state by pushing all references to the Git replica, for example
"refs/heads/master"
is pushed during commit. Stock Git replicas use
KetchReplica.CommitMethod.ALL_REFS
to
record the final state.
Ketch-aware replicas understand the RefTree
sent during the proposal
and during commit are able to update their own reference space to match the
state represented by the RefTree
. Ketch-aware replicas typically use
a RefTreeDatabase
and
KetchReplica.CommitMethod.TXN_COMMITTED
to record the final state.
KetchReplica instances are tightly coupled with a single
KetchLeader
. Some state may be
accessed by the leader thread and uses the leader's own
KetchLeader.lock
to protect shared
data.
Modifier and Type | Class and Description |
---|---|
static class |
KetchReplica.CommitMethod
How this replica wants to receive Ketch commit operations.
|
static class |
KetchReplica.CommitSpeed
Delay before committing to a replica.
|
static class |
KetchReplica.Participation
Participation of a replica in establishing consensus.
|
static class |
KetchReplica.State
Current state of a replica.
|
Modifier | Constructor and Description |
---|---|
protected |
KetchReplica(KetchLeader leader,
String name,
ReplicaConfig cfg)
Configure a replica representation.
|
Modifier and Type | Method and Description |
---|---|
protected abstract void |
blockingFetch(Repository repo,
ReplicaFetchRequest req)
Fetch objects from the remote using the calling thread.
|
protected String |
describeForLog()
Get description of this replica for error/debug logging purposes.
|
KetchReplica.CommitMethod |
getCommitMethod()
Get how Ketch will commit to the repository.
|
KetchReplica.CommitSpeed |
getCommitSpeed()
Get when Ketch will commit to the repository.
|
KetchLeader |
getLeader()
Get leader instance this replica follows.
|
String |
getName()
Get unique-ish name for debugging.
|
KetchReplica.Participation |
getParticipation()
Get how the replica participates in this Ketch system.
|
KetchSystem |
getSystem()
Get system configuration.
|
protected Collection<ReceiveCommand> |
prepareCommit(Repository git,
Map<String,Ref> current,
ObjectId committed)
Build a list of commands to commit
KetchReplica.CommitMethod.ALL_REFS . |
protected void |
shutdown()
Called by leader to perform graceful shutdown.
|
protected abstract void |
startPush(ReplicaPushRequest req)
Begin executing a single push.
|
protected KetchReplica(KetchLeader leader, String name, ReplicaConfig cfg)
leader
- instance this replica follows.name
- unique-ish name identifying this replica for debugging.cfg
- how Ketch should treat the replica.public KetchSystem getSystem()
public KetchLeader getLeader()
public String getName()
protected String describeForLog()
public KetchReplica.Participation getParticipation()
public KetchReplica.CommitMethod getCommitMethod()
public KetchReplica.CommitSpeed getCommitSpeed()
protected void shutdown()
Default implementation cancels any scheduled retry. Subclasses may add
additional logic before or after calling super.shutdown()
.
Called with KetchLeader.lock
held
by caller.
protected abstract void startPush(ReplicaPushRequest req)
This method must move processing onto another thread. Called with
KetchLeader.lock
held by caller.
req
- the request to send to the replica.protected abstract void blockingFetch(Repository repo, ReplicaFetchRequest req) throws IOException
Called without KetchLeader.lock
.
repo
- local repository to fetch objects into.req
- the request to fetch from a replica.IOException
- communication with the replica was not possible.protected Collection<ReceiveCommand> prepareCommit(Repository git, Map<String,Ref> current, ObjectId committed) throws IOException
KetchReplica.CommitMethod.ALL_REFS
.git
- local leader repository to read committed state from.current
- all known references in the replica's repository. Typically
this comes from a push advertisement.committed
- state being pushed to refs/txn/committed
.IOException
- cannot read the committed state.Copyright © 2020 Eclipse JGit Project. All rights reserved.