[ 
https://issues.apache.org/jira/browse/CASSANDRA-15526?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17061600#comment-17061600
 ] 

ZhaoYang commented on CASSANDRA-15526:
--------------------------------------

{quote}The issue is that in v11 there's a potential race condition in which the 
head node may have been initialized, but the LongAdder hasn't been incremented 
yet, which leaves it briefly in an inconsistent state.
{quote}
{quote}I confirmed that's the case by logging the value of keys.size() in 
TrieMemIndex#search right before and after the keys.isEmpty() check. The size 
is 0 at runtime, but when the IDE debugger inspects the value, it has changed 
to 1 already.
{quote}

Good catch! Should we fix {{SkipListMemIndex}} as well? we can also pass the 
size via {{KeyRangeIterator}} constructor, so that it's computed once.

In jdk 11 {{ConcurrentSkipListMap#size()}} javadoc:
{quote} * <p>Beware that, unlike in most collections, this method is
 * <em>NOT</em> a constant-time operation. Because of the
 * asynchronous nature of these sets, determining the current
 * number of elements requires traversing them all to count them.
 * Additionally, it is possible for the size to change during
 * execution of this method, in which case the returned result
 * will be inaccurate. Thus, this method is typically not very
 * useful in concurrent applications.{quote}
I think it's safe not to include keys when size()=0 but isEmpty()=false, as 
write is not considered successful from client POV.

> Fix flakey test - org.apache.cassandra.index.sasi.SASIIndexTest 
> testConcurrentMemtableReadsAndWrites
> ----------------------------------------------------------------------------------------------------
>
>                 Key: CASSANDRA-15526
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-15526
>             Project: Cassandra
>          Issue Type: Bug
>          Components: Test/unit
>            Reporter: David Capwell
>            Assignee: Gianluca Righetto
>            Priority: Normal
>              Labels: pull-request-available
>             Fix For: 4.0-alpha
>
>         Attachments: 15526-trunk-4.0.txt, jvm_15526.zip, unit_tests_15526
>
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> {code}
> junit.framework.AssertionFailedError
>   at 
> org.apache.cassandra.index.sasi.utils.RangeIterator.<init>(RangeIterator.java:46)
>   at 
> org.apache.cassandra.index.sasi.memory.KeyRangeIterator.<init>(KeyRangeIterator.java:42)
>   at 
> org.apache.cassandra.index.sasi.memory.TrieMemIndex$ConcurrentTrie.search(TrieMemIndex.java:150)
>   at 
> org.apache.cassandra.index.sasi.memory.TrieMemIndex.search(TrieMemIndex.java:102)
>   at 
> org.apache.cassandra.index.sasi.memory.IndexMemtable.search(IndexMemtable.java:70)
>   at 
> org.apache.cassandra.index.sasi.conf.ColumnIndex.searchMemtable(ColumnIndex.java:138)
>   at org.apache.cassandra.index.sasi.TermIterator.build(TermIterator.java:91)
>   at 
> org.apache.cassandra.index.sasi.plan.QueryController.getIndexes(QueryController.java:145)
>   at 
> org.apache.cassandra.index.sasi.plan.Operation$Builder.complete(Operation.java:434)
>   at org.apache.cassandra.index.sasi.plan.QueryPlan.analyze(QueryPlan.java:57)
>   at org.apache.cassandra.index.sasi.plan.QueryPlan.execute(QueryPlan.java:68)
>   at 
> org.apache.cassandra.index.sasi.SASIIndex.lambda$searcherFor$2(SASIIndex.java:301)
>   at org.apache.cassandra.db.ReadCommand.executeLocally(ReadCommand.java:455)
>   at 
> org.apache.cassandra.index.sasi.SASIIndexTest.getIndexed(SASIIndexTest.java:2576)
>   at 
> org.apache.cassandra.index.sasi.SASIIndexTest.getPaged(SASIIndexTest.java:2537)
>   at 
> org.apache.cassandra.index.sasi.SASIIndexTest.testConcurrentMemtableReadsAndWrites(SASIIndexTest.java:1108)
>   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native 
> Method)
>   at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>   at 
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to