public class IdempotenceAwareRetryPolicy extends Object implements ExtendedRetryPolicy
RetryPolicy.RetryDecision.rethrow()
if the statement is deemed non-idempotent (see isIdempotent(Statement)
).
For all other cases, this policy delegates the decision to the child policy.RetryPolicy.RetryDecision
Constructor and Description |
---|
IdempotenceAwareRetryPolicy(ExtendedRetryPolicy childPolicy,
QueryOptions queryOptions)
Creates a new instance.
|
Modifier and Type | Method and Description |
---|---|
protected boolean |
isIdempotent(Statement statement)
Determines whether the given statement is idempotent or not.
|
RetryPolicy.RetryDecision |
onReadTimeout(Statement statement,
ConsistencyLevel cl,
int requiredResponses,
int receivedResponses,
boolean dataRetrieved,
int nbRetry)
Defines whether to retry and at which consistency level on a read timeout.
|
RetryPolicy.RetryDecision |
onRequestError(Statement statement,
ConsistencyLevel cl,
Exception e,
int nbRetry)
Defines whether to retry and at which consistency level on an
unexpected error.
|
RetryPolicy.RetryDecision |
onUnavailable(Statement statement,
ConsistencyLevel cl,
int requiredReplica,
int aliveReplica,
int nbRetry)
Defines whether to retry and at which consistency level on an
unavailable exception.
|
RetryPolicy.RetryDecision |
onWriteTimeout(Statement statement,
ConsistencyLevel cl,
WriteType writeType,
int requiredAcks,
int receivedAcks,
int nbRetry)
Defines whether to retry and at which consistency level on a write timeout.
|
public IdempotenceAwareRetryPolicy(ExtendedRetryPolicy childPolicy, QueryOptions queryOptions)
childPolicy
- the policy to wrap.queryOptions
- the cluster's QueryOptions
object.public RetryPolicy.RetryDecision onReadTimeout(Statement statement, ConsistencyLevel cl, int requiredResponses, int receivedResponses, boolean dataRetrieved, int nbRetry)
RetryPolicy
requiredResponses >= receivedResponses
if dataPresent
is
false
(see
ReadTimeoutException.wasDataRetrieved()
).onReadTimeout
in interface RetryPolicy
statement
- the original query that timed out.cl
- the requested consistency level of the read that timed out.
Note that this can never be a serial
consistency level.requiredResponses
- the number of responses that were required to
achieve the requested consistency level.receivedResponses
- the number of responses that had been received
by the time the timeout exception was raised.dataRetrieved
- whether actual data (by opposition to data checksum)
was present in the received responses.nbRetry
- the number of retry already performed for this operation.RetryDecision.RETHROW
is returned,
a ReadTimeoutException
will
be thrown for the operation.public RetryPolicy.RetryDecision onWriteTimeout(Statement statement, ConsistencyLevel cl, WriteType writeType, int requiredAcks, int receivedAcks, int nbRetry)
RetryPolicy
onWriteTimeout
in interface RetryPolicy
statement
- the original query that timed out.cl
- the requested consistency level of the write that timed out.
If the timeout occurred at the "paxos" phase of a
Lightweight transaction,
then cl
will actually be the requested serial
consistency level.
Beware that serial consistency levels should never be passed to a RetryDecision
as this would
invariably trigger an InvalidQueryException
.
Also, when cl
is serial
, then writeType
is always CAS
.writeType
- the type of the write that timed out.requiredAcks
- the number of acknowledgments that were required to
achieve the requested consistency level.receivedAcks
- the number of acknowledgments that had been received
by the time the timeout exception was raised.nbRetry
- the number of retry already performed for this operation.RetryDecision.RETHROW
is returned,
a WriteTimeoutException
will
be thrown for the operation.public RetryPolicy.RetryDecision onUnavailable(Statement statement, ConsistencyLevel cl, int requiredReplica, int aliveReplica, int nbRetry)
RetryPolicy
onUnavailable
in interface RetryPolicy
statement
- the original query for which the consistency level cannot
be achieved.cl
- the requested consistency level for the operation.
If the operation failed at the "paxos" phase of a
Lightweight transaction,
then cl
will actually be the requested serial
consistency level.
Beware that serial consistency levels should never be passed to a RetryDecision
as this would
invariably trigger an InvalidQueryException
.requiredReplica
- the number of replica that should have been
(known) alive for the operation to be attempted.aliveReplica
- the number of replica that were know to be alive by
the coordinator of the operation.nbRetry
- the number of retry already performed for this operation.RetryDecision.RETHROW
is returned,
an UnavailableException
will
be thrown for the operation.public RetryPolicy.RetryDecision onRequestError(Statement statement, ConsistencyLevel cl, Exception e, int nbRetry)
ExtendedRetryPolicy
SocketOptions.getReadTimeoutMillis()
);OVERLOADED
, IS_BOOTSTRAPPING
, SERVER_ERROR
, etc.onRequestError
in interface ExtendedRetryPolicy
statement
- the original query that failed.cl
- the requested consistency level for the operation.
Note that this is not necessarily the achieved consistency level (if any),
and it is never a serial
one.e
- the exception that caused this request to fail.nbRetry
- the number of retries already performed for this operation.RetryDecision.RETHROW
is returned,
the DriverException
passed to this method will be thrown for the operation.protected boolean isIdempotent(Statement statement)
idempotent flag
;
if this flag is not set, then it inspects
QueryOptions.getDefaultIdempotence()
.
Subclasses may override if they have better knowledge of
the statement being executed.statement
- The statement to execute.true
if the given statement is idempotent,
false
otherwise