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();
}
}
}