You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sl...@apache.org on 2011/11/23 09:02:34 UTC
svn commit: r1205317 - in /cassandra/branches/cassandra-1.0: ./ contrib/
interface/thrift/gen-java/org/apache/cassandra/thrift/
src/java/org/apache/cassandra/db/context/
test/unit/org/apache/cassandra/db/context/
Author: slebresne
Date: Wed Nov 23 08:02:32 2011
New Revision: 1205317
URL: http://svn.apache.org/viewvc?rev=1205317&view=rev
Log:
merge from 0.8
Modified:
cassandra/branches/cassandra-1.0/ (props changed)
cassandra/branches/cassandra-1.0/CHANGES.txt
cassandra/branches/cassandra-1.0/contrib/ (props changed)
cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java (props changed)
cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java (props changed)
cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java (props changed)
cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java (props changed)
cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java (props changed)
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/context/CounterContext.java
cassandra/branches/cassandra-1.0/test/unit/org/apache/cassandra/db/context/CounterContextTest.java
Propchange: cassandra/branches/cassandra-1.0/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Nov 23 08:02:32 2011
@@ -1,7 +1,7 @@
/cassandra/branches/cassandra-0.6:922689-1052356,1052358-1053452,1053454,1053456-1131291
/cassandra/branches/cassandra-0.7:1026516-1183000
/cassandra/branches/cassandra-0.7.0:1053690-1055654
-/cassandra/branches/cassandra-0.8:1090934-1125013,1125019-1205232
+/cassandra/branches/cassandra-0.8:1090934-1125013,1125019-1205232,1205316
/cassandra/branches/cassandra-0.8.0:1125021-1130369
/cassandra/branches/cassandra-0.8.1:1101014-1125018
/cassandra/branches/cassandra-1.0:1167106,1167185
Modified: cassandra/branches/cassandra-1.0/CHANGES.txt
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/CHANGES.txt?rev=1205317&r1=1205316&r2=1205317&view=diff
==============================================================================
--- cassandra/branches/cassandra-1.0/CHANGES.txt (original)
+++ cassandra/branches/cassandra-1.0/CHANGES.txt Wed Nov 23 08:02:32 2011
@@ -9,6 +9,7 @@
* fix incorrect query results due to invalid max timestamp (CASSANDRA-3510)
Merged from 0.8:
* fix concurrence issue in the FailureDetector (CASSANDRA-3519)
+ * fix array out of bounds error in counter shard removal (CASSANDRA-3514)
1.0.3
* revert name-based query defragmentation aka CASSANDRA-2503 (CASSANDRA-3491)
Propchange: cassandra/branches/cassandra-1.0/contrib/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Nov 23 08:02:32 2011
@@ -1,7 +1,7 @@
/cassandra/branches/cassandra-0.6/contrib:922689-1052356,1052358-1053452,1053454,1053456-1068009
/cassandra/branches/cassandra-0.7/contrib:1026516-1183000
/cassandra/branches/cassandra-0.7.0/contrib:1053690-1055654
-/cassandra/branches/cassandra-0.8/contrib:1090934-1125013,1125019-1205232
+/cassandra/branches/cassandra-0.8/contrib:1090934-1125013,1125019-1205232,1205316
/cassandra/branches/cassandra-0.8.0/contrib:1125021-1130369
/cassandra/branches/cassandra-0.8.1/contrib:1101014-1125018
/cassandra/branches/cassandra-1.0/contrib:1167106,1167185
Propchange: cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Nov 23 08:02:32 2011
@@ -1,7 +1,7 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1183000
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1090934-1125013,1125019-1205232
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1090934-1125013,1125019-1205232,1205316
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1125021-1130369
/cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1101014-1125018
/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1167106,1167185
Propchange: cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Nov 23 08:02:32 2011
@@ -1,7 +1,7 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1183000
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1090934-1125013,1125019-1205232
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1090934-1125013,1125019-1205232,1205316
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1125021-1130369
/cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1101014-1125018
/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1167106,1167185
Propchange: cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Nov 23 08:02:32 2011
@@ -1,7 +1,7 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1183000
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1090934-1125013,1125019-1205232
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1090934-1125013,1125019-1205232,1205316
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1125021-1130369
/cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1101014-1125018
/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1167106,1167185
Propchange: cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Nov 23 08:02:32 2011
@@ -1,7 +1,7 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1183000
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1090934-1125013,1125019-1205232
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1090934-1125013,1125019-1205232,1205316
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1125021-1130369
/cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1101014-1125018
/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1167106,1167185
Propchange: cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Nov 23 08:02:32 2011
@@ -1,7 +1,7 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1183000
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1090934-1125013,1125019-1205232
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1090934-1125013,1125019-1205232,1205316
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1125021-1130369
/cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1101014-1125018
/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1167106,1167185
Modified: cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/context/CounterContext.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/context/CounterContext.java?rev=1205317&r1=1205316&r2=1205317&view=diff
==============================================================================
--- cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/context/CounterContext.java (original)
+++ cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/context/CounterContext.java Wed Nov 23 08:02:32 2011
@@ -657,6 +657,7 @@ public class CounterContext implements I
int hlength = headerLength(context);
ContextState state = new ContextState(context, hlength);
int removedShards = 0;
+ int removedDelta = 0;
while (state.hasRemaining())
{
long clock = state.getClock();
@@ -684,7 +685,11 @@ public class CounterContext implements I
}
if (-((int)(clock / 1000)) < gcBefore)
+ {
removedShards++;
+ if (state.isDelta())
+ removedDelta++;
+ }
}
state.moveToNext();
}
@@ -692,9 +697,9 @@ public class CounterContext implements I
if (removedShards == 0)
return context;
-
- int removedHeaderSize = removedShards * HEADER_ELT_LENGTH;
- int newSize = context.remaining() - removedHeaderSize - (removedShards * STEP_LENGTH);
+ int removedHeaderSize = removedDelta * HEADER_ELT_LENGTH;
+ int removedBodySize = removedShards * STEP_LENGTH;
+ int newSize = context.remaining() - removedHeaderSize - removedBodySize;
int newHlength = hlength - removedHeaderSize;
ByteBuffer cleanedContext = HeapAllocator.instance.allocate(newSize);
cleanedContext.putShort(cleanedContext.position(), (short) ((newHlength - HEADER_SIZE_LENGTH) / HEADER_ELT_LENGTH));
@@ -704,10 +709,11 @@ public class CounterContext implements I
while (state.hasRemaining())
{
long clock = state.getClock();
- if (!(clock < 0 && state.getCount() == 0))
+ if (clock >= 0 || state.getCount() != 0 || -((int)(clock / 1000)) >= gcBefore)
{
state.copyTo(cleaned);
}
+
state.moveToNext();
}
return cleanedContext;
Modified: cassandra/branches/cassandra-1.0/test/unit/org/apache/cassandra/db/context/CounterContextTest.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/test/unit/org/apache/cassandra/db/context/CounterContextTest.java?rev=1205317&r1=1205316&r2=1205317&view=diff
==============================================================================
--- cassandra/branches/cassandra-1.0/test/unit/org/apache/cassandra/db/context/CounterContextTest.java (original)
+++ cassandra/branches/cassandra-1.0/test/unit/org/apache/cassandra/db/context/CounterContextTest.java Wed Nov 23 08:02:32 2011
@@ -423,4 +423,81 @@ public class CounterContextTest
assert cc.total(ctx.context) == cc.total(cleaned);
assert cleaned.remaining() == ctx.context.remaining() - stepLength - 2;
}
+
+ @Test
+ public void testRemoveOldShardsNotAllExpiring()
+ {
+ runRemoveOldShardsNotAllExpiring(HeapAllocator.instance);
+ runRemoveOldShardsNotAllExpiring(bumpedSlab());
+ }
+
+ private void runRemoveOldShardsNotAllExpiring(Allocator allocator)
+ {
+ NodeId id1 = NodeId.fromInt(1);
+ NodeId id3 = NodeId.fromInt(3);
+ NodeId id6 = NodeId.fromInt(6);
+ List<NodeId.NodeIdRecord> records = new ArrayList<NodeId.NodeIdRecord>();
+ records.add(new NodeId.NodeIdRecord(id1, 2L));
+ records.add(new NodeId.NodeIdRecord(id3, 4L));
+ records.add(new NodeId.NodeIdRecord(id6, 10L));
+
+ ContextState ctx = ContextState.allocate(6, 3, allocator);
+ ctx.writeElement(id1, 0L, 1L, true);
+ ctx.writeElement(NodeId.fromInt(2), 0L, 2L);
+ ctx.writeElement(id3, 0L, 3L, true);
+ ctx.writeElement(NodeId.fromInt(4), 0L, 3L);
+ ctx.writeElement(NodeId.fromInt(5), 0L, 3L, true);
+ ctx.writeElement(id6, 0L, 6L);
+
+ int timeFirstMerge = (int)(System.currentTimeMillis() / 1000);
+
+ // First, only merge the first id
+ ByteBuffer merger = cc.computeOldShardMerger(ctx.context, records, 3L);
+ ByteBuffer merged = cc.merge(ctx.context, merger, allocator);
+ assert cc.total(ctx.context) == cc.total(merged);
+
+ try
+ {
+ Thread.sleep(2000);
+ }
+ catch (InterruptedException e)
+ {
+ throw new AssertionError();
+ }
+
+ // merge the second one
+ ByteBuffer merger2 = cc.computeOldShardMerger(merged, records, 7L);
+ ByteBuffer merged2 = cc.merge(merged, merger2, allocator);
+ assert cc.total(ctx.context) == cc.total(merged2);
+
+ ByteBuffer cleaned = cc.removeOldShards(merged2, timeFirstMerge + 1);
+ assert cc.total(ctx.context) == cc.total(cleaned);
+ assert cleaned.remaining() == ctx.context.remaining();
+
+ // We should have cleaned id1 but not id3
+ ContextState m = new ContextState(cleaned);
+ m.moveToNext();
+ assert m.getNodeId().equals(id3);
+
+ }
+
+ @Test
+ public void testRemoveNotDeltaOldShards()
+ {
+ runRemoveNotDeltaOldShards(HeapAllocator.instance);
+ runRemoveNotDeltaOldShards(bumpedSlab());
+ }
+
+ private void runRemoveNotDeltaOldShards(Allocator allocator)
+ {
+ ContextState ctx = ContextState.allocate(4, 1, allocator);
+ ctx.writeElement(NodeId.fromInt(1), 1L, 1L, true);
+ ctx.writeElement(NodeId.fromInt(2), -System.currentTimeMillis(), 0L);
+ ctx.writeElement(NodeId.fromInt(3), -System.currentTimeMillis(), 0L);
+ ctx.writeElement(NodeId.fromInt(4), -System.currentTimeMillis(), 0L);
+
+ ByteBuffer cleaned = cc.removeOldShards(ctx.context, (int)(System.currentTimeMillis() / 1000) + 1);
+ assert cc.total(ctx.context) == cc.total(cleaned);
+ assert cleaned.remaining() == ctx.context.remaining() - 3 * stepLength;
+ }
}