You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by "Sylvain Lebresne (JIRA)" <ji...@apache.org> on 2012/11/08 15:33:12 UTC

[jira] [Updated] (CASSANDRA-4402) Atomicity violation bugs because of misusing concurrent collections

     [ https://issues.apache.org/jira/browse/CASSANDRA-4402?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Sylvain Lebresne updated CASSANDRA-4402:
----------------------------------------

    Fix Version/s: 1.2.0
    
> Atomicity violation bugs because of misusing concurrent collections
> -------------------------------------------------------------------
>
>                 Key: CASSANDRA-4402
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-4402
>             Project: Cassandra
>          Issue Type: Bug
>    Affects Versions: 1.1.1
>            Reporter: Yu Lin
>             Fix For: 1.2.0
>
>         Attachments: 4402-v2.txt, cassandra-1.1.1-4402.txt
>
>   Original Estimate: 504h
>  Remaining Estimate: 504h
>
> My name is Yu Lin. I'm a Ph.D. student in the CS department at
> UIUC. I'm currently doing research on mining Java concurrent library
> misusages. I found some misusages of ConcurrentHashMap in Cassandra
> 1.1.1, which may result in potential atomicity violation bugs or harm
> the performance.
> The code below is a snapshot of the code in file
> src/java/org/apache/cassandra/db/Table.java from line 348 to 369
> L348        if (columnFamilyStores.containsKey(cfId))
> L349        {
> L350            // this is the case when you reset local schema
> L351            // just reload metadata
> L352            ColumnFamilyStore cfs = columnFamilyStores.get(cfId);
> L353            assert cfs.getColumnFamilyName().equals(cfName);
>             ...
> L364        }
> L365        else
> L366        {
> L367            columnFamilyStores.put(cfId, ColumnFamilyStore.createColumnFamilyStore(this, cfName));
> L368        }
> In the code above, an atomicity violation may occur between line 348
> and 352. Suppose thread T1 executes line 348 and finds that the
> concurrent hashmap "columnFamilyStores" contains the key
> "cfId". Before thread T1 executes line 352, another thread T2 removes
> the "cfId" key from "columnFamilyStores". Now thread T1 resumes
> execution at line 352 and will get a null value for "cfs". Then the
> next line will throw a NullPointerException when invoking the method
> on "cfs".
> Second, the snapshot above has another atomicity violation. Let's look
> at lines 348 and 367. Suppose a thread T1 executes line 348 and finds
> out the concurrent hashmap does not contain the key "cfId". Before it
> gets to execute line 367, another thread T2 puts a pair <cfid, v> in
> the concurrent hashmap "columnFamilyStores". Now thread T1 resumes
> execution and it will overwrite the value written by thread T2. Thus,
> the code no longer preserves the "put-if-absent" semantics.
> I found some similar misusages in other files:
> In src/java/org/apache/cassandra/gms/Gossiper.java, similar atomicity
> violation may occur if thread T2 puts a value to map
> "endpointStateMap" between lines <1094 and 1099>, <1173 and 1178>. Another
> atomicity violation may occur if thread T2 removes the value on key
> "endpoint" between lines <681 and 683>.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira