You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by "Jason Fager (JIRA)" <ji...@apache.org> on 2010/08/08 17:29:16 UTC

[jira] Created: (CASSANDRA-1370) TokenMetaData.getPendingRangesMM() is unnecessarily synchronized

TokenMetaData.getPendingRangesMM() is unnecessarily synchronized
----------------------------------------------------------------

                 Key: CASSANDRA-1370
                 URL: https://issues.apache.org/jira/browse/CASSANDRA-1370
             Project: Cassandra
          Issue Type: Improvement
          Components: Core
    Affects Versions: 0.6.4
            Reporter: Jason Fager
            Priority: Minor


TokenMetaData.getPendingRangesMM() is currently synchronized to avoid a race condition where multiple threads might create a multimap for the given table.  However, the pendingRanges instance variable that's the subject of the race condition is already a ConcurrentHashMap, and the race condition can be avoided by using putIfAbsent, leaving the case where the table's map is already initialized lock-free:

    private Multimap<Range, InetAddress> getPendingRangesMM(String table)
    {
        Multimap<Range, InetAddress> map = pendingRanges.get(table);
        if (map == null)
        {
            map = HashMultimap.create();
            Multimap<Range, InetAddress> fasterHorse 
            	= pendingRanges.putIfAbsent(table, map);
            if(fasterHorse != null) {
            	//another thread beat us to creating the map, oh well.
            	map = fasterHorse;
            }
        }
        return map;
    }


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.