Class PaxosRepair
- java.lang.Object
-
- org.apache.cassandra.service.paxos.AbstractPaxosRepair
-
- org.apache.cassandra.service.paxos.PaxosRepair
-
public class PaxosRepair extends AbstractPaxosRepair
Facility to finish any in-progress paxos transaction, and ensure that a quorum of nodes agree on the most recent operation. Semantically, we simply ensure that any side effects that were "decided" before repair was initiated have been committed to a quorum of nodes. This means: - any prepare that has _possibly_ reached a quorum of nodes will be invalidated - any proposal that has been accepted by at least one node, but not known to be committed to any, will be proposed again - any proposal that has been committed to at least one node, but not committed to all, will be committed to a quorum Note that once started, this continues to try to repair any ongoing operations for the partition up to 4 times. In a functioning cluster this should always be possible, but during a network partition this might cause the repair to fail. Requirements for correction: - If performed during a range movement, we depend on a quorum (of the new topology) have been informed of the new topology _prior_ to initiating this repair, and this node to have been a member of a quorum of nodes verifying - If a quorum of nodes is unaware of the new topology prior to initiating repair, an operation could simply occur after repair completes that permits a linearization failure, such as with CASSANDRA-15745. their topology is up-to-date. - Paxos prepare rounds must also verify the topology being used with their peers - If prepare rounds do not verify their topology, a node that is not a member of the quorum who have agreed the latest topology could still perform an operation without being aware of the topology change, and permit a linearization failure, such as with CASSANDRA-15745. With these issues addressed elsewhere, our algorithm is fairly simple. In brief: 1) Query all replicas for any promises or proposals they have witnessed that have not been committed, and their most recent commit. Wait for a quorum of responses. 2) If this is the first time we have queried other nodes, we take a note of the most recent ballot we see; If this is not the first time we have queried other nodes, and we have committed a newer ballot than the one we previously recorded, we terminate (somebody else has done the work for us). 3) If we see an in-progress operation that is very recent, we wait for it to complete and try again 4) If we see a previously accepted operation, we attempt to complete it, or if we see a prepare with no proposal, we propose an empty update to invalidate it; otherwise we have nothing to do, as there is no operation that can have produced a side-effect before we began. 5) We prepare a paxos round to agree the new commit using a higher ballot than the one witnessed, but a lower than one we would propose a new operation with. This permits newer operations to "beat" us so that we do not interfere with normal paxos operations. 6) If we are "beaten" we start again (without delay, as (2) manages delays where necessary)
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classPaxosRepair.RequestHandlerThe proposal request handler, i.e.static classPaxosRepair.RequestSerializerstatic classPaxosRepair.ResponseSerializer-
Nested classes/interfaces inherited from class org.apache.cassandra.service.paxos.AbstractPaxosRepair
AbstractPaxosRepair.Failure, AbstractPaxosRepair.Listener, AbstractPaxosRepair.Result, AbstractPaxosRepair.State, AbstractPaxosRepair.StateUpdater<S,I,T extends java.lang.Throwable>
-
-
Field Summary
Fields Modifier and Type Field Description static PaxosRepair.RequestHandlerrequestHandlerstatic PaxosRepair.RequestSerializerrequestSerializerstatic PaxosRepair.ResponseSerializerresponseSerializer-
Fields inherited from class org.apache.cassandra.service.paxos.AbstractPaxosRepair
CANCELLED, DONE
-
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description static PaxosRepaircreate(ConsistencyLevel consistency, DecoratedKey partitionKey, Ballot incompleteBallot, TableMetadata table)static booleangetSkipPaxosRepairCompatibilityCheck()static booleanhasSufficientLiveNodesForTopologyChange(Keyspace keyspace, Range<Token> range, java.util.Collection<InetAddressAndPort> liveEndpoints)checks if we have enough live nodes to perform a paxos repair for topology repair.AbstractPaxosRepair.Staterestart(AbstractPaxosRepair.State state, long waitUntil)static voidsetSkipPaxosRepairCompatibilityCheck(boolean v)static voidshutdownAndWait(long timeout, java.util.concurrent.TimeUnit units)java.lang.StringtoString()static booleanvalidatePeerCompatibility(TableMetadata table, java.util.Collection<Range<Token>> ranges)-
Methods inherited from class org.apache.cassandra.service.paxos.AbstractPaxosRepair
addListener, addListener, await, cancel, cancelUnexceptionally, incompleteBallot, isComplete, isStarted, partitionKey, restart, set, start, startedNanos, state, updateState
-
-
-
-
Field Detail
-
requestSerializer
public static final PaxosRepair.RequestSerializer requestSerializer
-
responseSerializer
public static final PaxosRepair.ResponseSerializer responseSerializer
-
requestHandler
public static final PaxosRepair.RequestHandler requestHandler
-
-
Method Detail
-
toString
public java.lang.String toString()
- Overrides:
toStringin classjava.lang.Object
-
create
public static PaxosRepair create(ConsistencyLevel consistency, DecoratedKey partitionKey, Ballot incompleteBallot, TableMetadata table)
-
restart
public AbstractPaxosRepair.State restart(AbstractPaxosRepair.State state, long waitUntil)
- Specified by:
restartin classAbstractPaxosRepair
-
hasSufficientLiveNodesForTopologyChange
public static boolean hasSufficientLiveNodesForTopologyChange(Keyspace keyspace, Range<Token> range, java.util.Collection<InetAddressAndPort> liveEndpoints)
checks if we have enough live nodes to perform a paxos repair for topology repair. Generally, this means that we need enough live participants to reach EACH_QUORUM, with a few exceptions. The EACH_QUORUM requirement is meant to support workload using either SERIAL or LOCAL_SERIAL if paxos_topology_repair_strict_each_quorum is set to false (the default), we will accept either a quorum or n-1 live nodes in the cluster and per dc. If paxos_topology_repair_no_dc_checks is true, we only check the live nodes in the cluster, and do not do any per-dc checks.
-
setSkipPaxosRepairCompatibilityCheck
public static void setSkipPaxosRepairCompatibilityCheck(boolean v)
-
getSkipPaxosRepairCompatibilityCheck
public static boolean getSkipPaxosRepairCompatibilityCheck()
-
validatePeerCompatibility
public static boolean validatePeerCompatibility(TableMetadata table, java.util.Collection<Range<Token>> ranges)
-
shutdownAndWait
public static void shutdownAndWait(long timeout, java.util.concurrent.TimeUnit units) throws java.lang.InterruptedException, java.util.concurrent.TimeoutException- Throws:
java.lang.InterruptedExceptionjava.util.concurrent.TimeoutException
-
-