maedhroz commented on code in PR #1796:
URL: https://github.com/apache/cassandra/pull/1796#discussion_r950403192
##########
src/java/org/apache/cassandra/service/TruncateResponseHandler.java:
##########
@@ -61,24 +63,34 @@ public TruncateResponseHandler(int responseCount)
public void get() throws TimeoutException
{
long timeoutNanos = getTruncateRpcTimeout(NANOSECONDS) - (nanoTime() -
start);
- boolean completedInTime;
+ boolean signaled;
try
{
- completedInTime = condition.await(timeoutNanos, NANOSECONDS); //
TODO truncate needs a much longer timeout
+ signaled = condition.await(timeoutNanos, NANOSECONDS); // TODO
truncate needs a much longer timeout
}
catch (InterruptedException e)
{
throw new UncheckedInterruptedException(e);
}
- if (!completedInTime)
- {
+ if (!signaled)
throw new TimeoutException("Truncate timed out - received only " +
responses.get() + " responses");
- }
- if (truncateFailingReplica != null)
+ if (!failureReasonByEndpoint.isEmpty())
{
- throw new TruncateException("Truncate failed on replica " +
truncateFailingReplica);
+ // clone to make sure no race condition happens
+ Map<InetAddressAndPort, RequestFailureReason>
failureReasonByEndpoint = new HashMap<>(this.failureReasonByEndpoint);
+ int size = failureReasonByEndpoint.size();
+ long timeouts =
failureReasonByEndpoint.values().stream().filter(RequestFailureReason.TIMEOUT::equals).count();
+ long nonTimeout = size - timeouts;
+ if (nonTimeout <= timeouts)
+ throw new TimeoutException("Truncate timed out - received only
" + responses.get() + " responses");
Review Comment:
What if instead of throwing a `TimeoutException` when there are more
timeouts than non-timeouts (okay >=), we just get rid of what's between lines
83 and 88 here? (i.e. We just throw a `TruncateException` with the per-endpoint
failure summary snapshot, unless perhaps every single one of the failure
reasons is TIMEOUT? Even then, we might want to be able to tell the difference
between "all the replicas failed on TIMEOUT" and "we waited too long at the
coordinator".)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]