You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2010/08/17 23:15:56 UTC

svn commit: r986486 - in /cassandra/trunk: src/java/org/apache/cassandra/db/Table.java test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java

Author: jbellis
Date: Tue Aug 17 21:15:44 2010
New Revision: 986486

URL: http://svn.apache.org/viewvc?rev=986486&view=rev
Log:
fix sharded lock hashing on index write path.  patch by jbellis; reviewed by eevans for CASSANDRA-1402

Modified:
    cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
    cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java?rev=986486&r1=986485&r2=986486&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/Table.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/Table.java Tue Aug 17 21:15:44 2010
@@ -386,7 +386,7 @@ public class Table
                 }
                 else
                 {
-                    synchronized (indexLocks[Arrays.hashCode(mutation.key()) % indexLocks.length])
+                    synchronized (indexLockFor(mutation.key()))
                     {
                         // read old indexed values
                         QueryFilter filter = QueryFilter.getNamesFilter(key, new QueryPath(cfs.getColumnFamilyName()), mutatedIndexedColumns);
@@ -443,7 +443,7 @@ public class Table
         flusherLock.readLock().lock();
         try
         {
-            synchronized (indexLocks[Arrays.hashCode(rowKey.key) % indexLocks.length])
+            synchronized (indexLockFor(rowKey.key))
             {
                 memtableToFlush = indexedCfs.apply(indexedKey, indexedColumnFamily);
             }
@@ -456,7 +456,12 @@ public class Table
         if (memtableToFlush != null)
             indexedCfs.maybeSwitchMemtable(memtableToFlush, false);
     }
-    
+
+    private Object indexLockFor(byte[] key)
+    {
+        return indexLocks[Math.abs(Arrays.hashCode(key) % indexLocks.length)];
+    }
+
     private static void applyCF(ColumnFamilyStore cfs, DecoratedKey key, ColumnFamily columnFamily, HashMap<ColumnFamilyStore, Memtable> memtablesToFlush)
     {
         Memtable memtableToFlush = cfs.apply(key, columnFamily);

Modified: cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java?rev=986486&r1=986485&r2=986486&view=diff
==============================================================================
--- cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java (original)
+++ cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java Tue Aug 17 21:15:44 2010
@@ -173,6 +173,11 @@ public class ColumnFamilyStoreTest exten
         rm.add(new QueryPath("Indexed1", null, "notbirthdate".getBytes("UTF8")), FBUtilities.toByteArray(1L), new TimestampClock(0));
         rm.add(new QueryPath("Indexed1", null, "birthdate".getBytes("UTF8")), FBUtilities.toByteArray(1L), new TimestampClock(0));
         rm.apply();
+        
+        rm = new RowMutation("Keyspace1", "k4aaaa".getBytes());
+        rm.add(new QueryPath("Indexed1", null, "notbirthdate".getBytes("UTF8")), FBUtilities.toByteArray(2L), new TimestampClock(0));
+        rm.add(new QueryPath("Indexed1", null, "birthdate".getBytes("UTF8")), FBUtilities.toByteArray(3L), new TimestampClock(0));
+        rm.apply();
 
         IndexExpression expr = new IndexExpression("birthdate".getBytes("UTF8"), IndexOperator.EQ, FBUtilities.toByteArray(1L));
         IndexClause clause = new IndexClause(Arrays.asList(expr), ArrayUtils.EMPTY_BYTE_ARRAY, 100);