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/01/19 19:38:12 UTC

svn commit: r900894 - /incubator/cassandra/trunk/src/java/org/apache/cassandra/db/HintedHandOffManager.java

Author: jbellis
Date: Tue Jan 19 18:38:11 2010
New Revision: 900894

URL: http://svn.apache.org/viewvc?rev=900894&view=rev
Log:
fix potential infinite loop.  patch by jbellis; tested by Brandon Williams for CASSANDRA-715

Modified:
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/HintedHandOffManager.java

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/HintedHandOffManager.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/HintedHandOffManager.java?rev=900894&r1=900893&r2=900894&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/HintedHandOffManager.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/HintedHandOffManager.java Tue Jan 19 18:38:11 2010
@@ -176,7 +176,7 @@
             {
                 QueryFilter filter = new SliceQueryFilter(tableName, new QueryPath(HINTS_CF), startColumn, ArrayUtils.EMPTY_BYTE_ARRAY, false, PAGE_SIZE);
                 ColumnFamily hintColumnFamily = ColumnFamilyStore.removeDeleted(hintStore.getColumnFamily(filter), Integer.MAX_VALUE);
-                if (hintColumnFamily == null)
+                if (pagingFinished(hintColumnFamily, startColumn))
                     break;
                 Collection<IColumn> keys = hintColumnFamily.getSortedColumns();
 
@@ -198,7 +198,7 @@
                         deleteHintKey(tableName, keyColumn.name());
                     }
 
-                    startColumn = keyColumn.name(); // repeating the last as the first is fine since we just deleted it
+                    startColumn = keyColumn.name();
                 }
             }
         }
@@ -216,6 +216,13 @@
           logger_.debug("Finished deliverAllHints");
     }
 
+    private static boolean pagingFinished(ColumnFamily hintColumnFamily, byte[] startColumn)
+    {
+        // done if no hints found or the start column (same as last column processed in previous iteration) is the only one
+        return hintColumnFamily == null
+               || (hintColumnFamily.getSortedColumns().size() == 1 && hintColumnFamily.getColumn(startColumn) != null);
+    }
+
     private static void deliverHintsToEndpoint(InetAddress endPoint) throws IOException, DigestMismatchException, InvalidRequestException, TimeoutException
     {
         if (logger_.isDebugEnabled())
@@ -233,7 +240,7 @@
             {
                 QueryFilter filter = new SliceQueryFilter(tableName, new QueryPath(HINTS_CF), startColumn, ArrayUtils.EMPTY_BYTE_ARRAY, false, PAGE_SIZE);
                 ColumnFamily hintColumnFamily = ColumnFamilyStore.removeDeleted(hintStore.getColumnFamily(filter), Integer.MAX_VALUE);
-                if (hintColumnFamily == null)
+                if (pagingFinished(hintColumnFamily, startColumn))
                     break;
                 Collection<IColumn> keys = hintColumnFamily.getSortedColumns();
 
@@ -253,7 +260,7 @@
                         }
                     }
 
-                    startColumn = keyColumn.name(); // repeating the last as the first is fine since we just deleted it
+                    startColumn = keyColumn.name();
                 }
             }
         }