[
https://issues.apache.org/jira/browse/CASSANDRA-15958?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17185693#comment-17185693
]
Yifan Cai commented on CASSANDRA-15958:
---------------------------------------
Nice finding!
I am able to reproduce the race, as long as the
{{nextExpirationDeadlineUpdater}} that sets {{earliestExpiresAt}} to
{{Long.MAX_VALUE}} in {{pruneInternalQueueWithLock}} happens after the updater
in the *last* {{add()}} message call in the test.
The impact is that the prune task might not be able to prune the queue when
there is no new message with expiration time that can trigger
{{pruneWithLock()}} enqueued. But in an operating system, there should be new
messages enqueued continuously. Therefore, the chance that messages not being
pruned should be low.
In the worst case that an expired message is not pruned in the queue, the
message is still discarded when outbound connection sends the message. It
checks {{shouldSend()}} when polling from the queue.
Therefore, it seems a special case in the test. It should not harm in
production.
Regarding the third alternative, if I understand correctly, without updating
the {{nextExpirationDeadline}} in the {{add()}} message method, no prune task
will be scheduled. Because the {{nextExpirationDeadline}} remains
{{Long.MAX_VALUE}} and {{clock.isAfter(nowNanos, nextExpirationDeadline)}}
always returns false in the {{maybePruneExpired()}} method.
> org.apache.cassandra.net.ConnectionTest testMessagePurging
> ----------------------------------------------------------
>
> Key: CASSANDRA-15958
> URL: https://issues.apache.org/jira/browse/CASSANDRA-15958
> Project: Cassandra
> Issue Type: Bug
> Components: Test/unit
> Reporter: David Capwell
> Assignee: Adam Holmberg
> Priority: Normal
> Fix For: 4.0-beta
>
>
> Build:
> https://ci-cassandra.apache.org/job/Cassandra-trunk-test/196/testReport/junit/org.apache.cassandra.net/ConnectionTest/testMessagePurging/
> Build:
> https://ci-cassandra.apache.org/job/Cassandra-trunk-test/194/testReport/junit/org.apache.cassandra.net/ConnectionTest/testMessagePurging/
> java.util.concurrent.TimeoutException
> at org.apache.cassandra.net.AsyncPromise.get(AsyncPromise.java:258)
> at org.apache.cassandra.net.FutureDelegate.get(FutureDelegate.java:143)
> at
> org.apache.cassandra.net.ConnectionTest.doTestManual(ConnectionTest.java:268)
> at
> org.apache.cassandra.net.ConnectionTest.testManual(ConnectionTest.java:236)
> at
> org.apache.cassandra.net.ConnectionTest.testMessagePurging(ConnectionTest.java:679)
--
This message was sent by Atlassian Jira
(v8.3.4#803005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]