Merge branch 'cassandra-0.8' into cassandra-1.0
Conflicts:
src/java/org/apache/cassandra/db/filter/QueryFilter.java
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/6cb4af7c
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/6cb4af7c
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/6cb4af7c
Branch: refs/heads/cassandra-1.1
Commit: 6cb4af7c66a0a034202449362968c5274619b634
Parents: 2216a3d ad80cf4
Author: Sylvain Lebresne <[email protected]>
Authored: Wed Feb 8 15:21:17 2012 +0100
Committer: Sylvain Lebresne <[email protected]>
Committed: Wed Feb 8 15:21:17 2012 +0100
----------------------------------------------------------------------
CHANGES.txt | 1 +
src/java/org/apache/cassandra/db/Column.java | 5 ++
.../org/apache/cassandra/db/ColumnFamilyStore.java | 2 +-
src/java/org/apache/cassandra/db/IColumn.java | 1 +
src/java/org/apache/cassandra/db/SuperColumn.java | 7 +++-
.../apache/cassandra/db/filter/QueryFilter.java | 2 +-
.../apache/cassandra/db/RemoveSubColumnTest.java | 34 +++++++++++++++
7 files changed, 49 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/6cb4af7c/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index a8b87f1,dc17889..4be81fc
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -64,40 -5,9 +64,41 @@@ Merged from 0.8
* use correct list of replicas for LOCAL_QUORUM reads when read repair
is disabled (CASSANDRA-3696)
* block on flush before compacting hints (may prevent OOM) (CASSANDRA-3733)
+
+
+1.0.6
+ * (CQL) fix cqlsh support for replicate_on_write (CASSANDRA-3596)
+ * fix adding to leveled manifest after streaming (CASSANDRA-3536)
+ * filter out unavailable cipher suites when using encryption (CASSANDRA-3178)
+ * (HADOOP) add old-style api support for CFIF and CFRR (CASSANDRA-2799)
+ * Support TimeUUIDType column names in Stress.java tool (CASSANDRA-3541)
+ * (CQL) INSERT/UPDATE/DELETE/TRUNCATE commands should allow CF names to
+ be qualified by keyspace (CASSANDRA-3419)
+ * always remove endpoints from delevery queue in HH (CASSANDRA-3546)
+ * fix race between cf flush and its 2ndary indexes flush (CASSANDRA-3547)
+ * fix potential race in AES when a repair fails (CASSANDRA-3548)
+ * fix default value validation usage in CLI SET command (CASSANDRA-3553)
+ * Optimize componentsFor method for compaction and startup time
+ (CASSANDRA-3532)
+ * (CQL) Proper ColumnFamily metadata validation on CREATE COLUMNFAMILY
+ (CASSANDRA-3565)
+ * fix compression "chunk_length_kb" option to set correct kb value for
+ thrift/avro (CASSANDRA-3558)
+ * fix missing response during range slice repair (CASSANDRA-3551)
+ * 'describe ring' moved from CLI to nodetool and available through JMX
(CASSANDRA-3220)
+ * add back partitioner to sstable metadata (CASSANDRA-3540)
+ * fix NPE in get_count for counters (CASSANDRA-3601)
+Merged from 0.8:
+||||||| merged common ancestors
+
+
+0.8.9
+ * avoid logging (harmless) exception when GC takes < 1ms (CASSANDRA-3656)
+=======
+ * block on flush before compacting hints (may prevent OOM) (CASSANDRA-3733)
* (Pig) fix CassandraStorage to use correct comparator in Super ColumnFamily
case (CASSANDRA-3251)
+ * Fix relevant tomstone ignored with super columns (CASSANDRA-3875)
0.8.9
* avoid logging (harmless) exception when GC takes < 1ms (CASSANDRA-3656)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/6cb4af7c/src/java/org/apache/cassandra/db/Column.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/6cb4af7c/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/6cb4af7c/src/java/org/apache/cassandra/db/IColumn.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/6cb4af7c/src/java/org/apache/cassandra/db/SuperColumn.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/SuperColumn.java
index 4301f73,4cd9ebe..75f166c
--- a/src/java/org/apache/cassandra/db/SuperColumn.java
+++ b/src/java/org/apache/cassandra/db/SuperColumn.java
@@@ -140,10 -159,15 +140,15 @@@ public class SuperColumn extends Abstra
public long mostRecentLiveChangeAt()
{
+ return mostRecentNonGCableChangeAt(Integer.MAX_VALUE);
+ }
+
+ public long mostRecentNonGCableChangeAt(int gcbefore)
+ {
long max = Long.MIN_VALUE;
- for (IColumn column : columns_.values())
+ for (IColumn column : getSubColumns())
{
- if (!column.isMarkedForDelete() && column.timestamp() > max)
- if ((!column.isMarkedForDelete() || column.getLocalDeletionTime()
> gcbefore) && column.timestamp() > max)
++ if ((!column.isMarkedForDelete() || column.getLocalDeletionTime()
>= gcbefore) && column.timestamp() > max)
{
max = column.timestamp();
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/6cb4af7c/src/java/org/apache/cassandra/db/filter/QueryFilter.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/filter/QueryFilter.java
index 3405c46,2e911b6..a2e9a95
--- a/src/java/org/apache/cassandra/db/filter/QueryFilter.java
+++ b/src/java/org/apache/cassandra/db/filter/QueryFilter.java
@@@ -154,8 -152,8 +154,8 @@@ public class QueryFilte
// the column itself must be not gc-able (it is live, or a still
relevant tombstone, or has live subcolumns), (1)
// and if its container is deleted, the column must be changed more
recently than the container tombstone (2)
// (since otherwise, the only thing repair cares about is the
container tombstone)
- long maxChange = column.mostRecentLiveChangeAt();
+ long maxChange = column.mostRecentNonGCableChangeAt(gcBefore);
- return (!column.isMarkedForDelete() || column.getLocalDeletionTime()
> gcBefore || maxChange > column.getMarkedForDeleteAt()) // (1)
+ return (!column.isMarkedForDelete() || column.getLocalDeletionTime()
>= gcBefore || maxChange > column.getMarkedForDeleteAt()) // (1)
&& (!container.isMarkedForDelete() || maxChange >
container.getMarkedForDeleteAt()); // (2)
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/6cb4af7c/test/unit/org/apache/cassandra/db/RemoveSubColumnTest.java
----------------------------------------------------------------------
diff --cc test/unit/org/apache/cassandra/db/RemoveSubColumnTest.java
index 7abcc59,d1e54ba..28e4aef
--- a/test/unit/org/apache/cassandra/db/RemoveSubColumnTest.java
+++ b/test/unit/org/apache/cassandra/db/RemoveSubColumnTest.java
@@@ -55,7 -55,41 +55,41 @@@ public class RemoveSubColumnTest extend
rm.apply();
ColumnFamily retrieved =
store.getColumnFamily(QueryFilter.getIdentityFilter(dk, new QueryPath("Super1",
ByteBufferUtil.bytes("SC1"))));
- assert
retrieved.getColumn(ByteBufferUtil.bytes("SC1")).getSubColumn(getBytes(1)).isMarkedForDelete();
+ assert
retrieved.getColumn(ByteBufferUtil.bytes("SC1")).getSubColumn(getBytes(1L)).isMarkedForDelete();
assertNull(Util.cloneAndRemoveDeleted(retrieved, Integer.MAX_VALUE));
}
+
+ @Test
+ public void testRemoveSubColumnAndContainer() throws IOException,
ExecutionException, InterruptedException
+ {
+ Table table = Table.open("Keyspace1");
+ ColumnFamilyStore store = table.getColumnFamilyStore("Super1");
+ RowMutation rm;
+ DecoratedKey dk = Util.dk("key2");
+
+ // add data
+ rm = new RowMutation("Keyspace1", dk.key);
+ Util.addMutation(rm, "Super1", "SC1", 1, "asdf", 0);
+ rm.apply();
+ store.forceBlockingFlush();
+
+ // remove the SC
+ rm = new RowMutation("Keyspace1", dk.key);
+ rm.delete(new QueryPath("Super1", ByteBufferUtil.bytes("SC1"), null),
1);
+ rm.apply();
+
+ // Mark current time and make sure the next insert happens at least
+ // one second after the previous one (since gc resolution is the
second)
+ int gcbefore = (int)(System.currentTimeMillis() / 1000);
+ Thread.currentThread().sleep(1000);
+
+ // remove the column itself
+ rm = new RowMutation("Keyspace1", dk.key);
+ rm.delete(new QueryPath("Super1", ByteBufferUtil.bytes("SC1"),
getBytes(1)), 2);
+ rm.apply();
+
+ ColumnFamily retrieved =
store.getColumnFamily(QueryFilter.getIdentityFilter(dk, new QueryPath("Super1",
ByteBufferUtil.bytes("SC1"))), gcbefore);
+ assert
retrieved.getColumn(ByteBufferUtil.bytes("SC1")).getSubColumn(getBytes(1)).isMarkedForDelete();
+ assertNull(Util.cloneAndRemoveDeleted(retrieved, Integer.MAX_VALUE));
+ }
}