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