Johnny Miller created CASSANDRA-21718:
-----------------------------------------
Summary: Ref.release can throw IllegalStateException when racing
the reference reaper
Key: CASSANDRA-21718
URL: https://issues.apache.org/jira/browse/CASSANDRA-21718
Project: Apache Cassandra
Issue Type: Bug
Components: Local/Other
Reporter: Johnny Miller
Ref.release() calls state.release(false) without keeping the Ref reachable for
the duration of the call (Ref.java line 131 on cassandra-5.0, line 166 on
trunk). Ref.State is a PhantomReference to the Ref, so if the caller drops its
last strong reference around the same time, the JIT is allowed to treat the Ref
as unreachable while release() is still running. The reference reaper can then
process the phantom reference concurrently and mark the state released. The
caller's release then finds the state already released and throws
IllegalStateException("Attempted to release a reference that has already been
released") on what was a perfectly correct release.
The DataStax fork fixed this by adding a reachability fence in release,
datastax/cassandra@f5af71fa62 (their CNDB-15967). The commit also carries a
regression test (GlobalTidyConcurrencyTest) that does not exist in this tree. I
could not find an equivalent fix or an existing ticket here.
Verified on cassandra-5.0 and trunk. The code is much older so earlier branches
are likely affected too.
Happy to port it the same way as CASSANDRA-21615 if wanted.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]