[
https://issues.apache.org/jira/browse/CASSANDRA-6912?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13955313#comment-13955313
]
Benedict commented on CASSANDRA-6912:
-------------------------------------
Sure: basically instead of a boolean isReplaced flag, we build a linked-list
chain of replacement, which we synchronise using a shared object to make
maintenance of the list across multiple threads simple. Then on close we check
if any of the closeable resources differ between any chains either side of us,
and any that are in neither of the adjacent links (if any) are closed. It's
worth pointing out that as of this patch only one of those resources can
possibly differ, but I think it is more correct to test all of them even
knowing this, since it is not expensive and is future proof. Once we've made
this decision we remove ourselves from the linked list, so that anybody
behind/ahead will compare against only other still opened resources.
I've also folded the close() and releaseReferences() tidying up into one tidy()
method with a boolean flag for the kind of release we're doing, as this seemed
more explicit to me.
> SSTableReader.isReplaced does not allow for safe resource cleanup
> -----------------------------------------------------------------
>
> Key: CASSANDRA-6912
> URL: https://issues.apache.org/jira/browse/CASSANDRA-6912
> Project: Cassandra
> Issue Type: Bug
> Reporter: Benedict
> Assignee: Benedict
> Fix For: 2.1 beta2
>
>
> There are a number of possible race conditions on resource cleanup from the
> use of cloneWithNewSummarySamplingLevel, because the replacement sstable can
> be itself replaced/obsoleted while the prior sstable is still referenced
> (this is actually quite easy with compaction, but can happen in other
> circumstances less commonly).
--
This message was sent by Atlassian JIRA
(v6.2#6252)