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]

Reply via email to