From 200d4937fa0d86bc92c17d0da27e53257198f725 Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Fri, 17 Apr 2009 20:08:17 +0000 Subject: [PATCH] test and fix for CF clone bug during remove. patch by Jun Rao; reviewed by jbellis for #33 git-svn-id: https://svn.apache.org/repos/asf/incubator/cassandra/trunk@766135 13f79535-47bb-0310-9956-ffa450edef68 --- src/org/apache/cassandra/db/Memtable.java | 4 +- .../cassandra/db/ColumnFamilyStoreTest.java | 48 ++++++++++++++++++- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/org/apache/cassandra/db/Memtable.java b/src/org/apache/cassandra/db/Memtable.java index bc854748e5..bfa4738098 100644 --- a/src/org/apache/cassandra/db/Memtable.java +++ b/src/org/apache/cassandra/db/Memtable.java @@ -315,7 +315,7 @@ public class Memtable implements Comparable IColumn column = cFamily.getColumn(values[1]); // super or normal column if (column != null ) { - columnFamily = new ColumnFamily(cfName_, cFamily.type()); + columnFamily = cFamily.cloneMeShallow(); columnFamily.addColumn(column); } } @@ -328,7 +328,7 @@ public class Memtable implements Comparable IColumn subColumn = superColumn.getSubColumn(values[2]); if (subColumn != null) { - columnFamily = new ColumnFamily(cfName_, cFamily.type()); + columnFamily = cFamily.cloneMeShallow(); columnFamily.addColumn(values[1] + ":" + values[2], subColumn.value(), subColumn.timestamp(), subColumn.isMarkedForDelete()); } } diff --git a/test/org/apache/cassandra/db/ColumnFamilyStoreTest.java b/test/org/apache/cassandra/db/ColumnFamilyStoreTest.java index c3511c52f8..45cdec9e0e 100644 --- a/test/org/apache/cassandra/db/ColumnFamilyStoreTest.java +++ b/test/org/apache/cassandra/db/ColumnFamilyStoreTest.java @@ -272,6 +272,29 @@ public class ColumnFamilyStoreTest extends ServerTest ColumnFamilyStore store = table.getColumnFamilyStore("Standard1"); RowMutation rm; + // add data + rm = new RowMutation("Table1", "key1"); + rm.add("Standard1:Column1", "asdf".getBytes(), 0); + rm.apply(); + + // remove + rm = new RowMutation("Table1", "key1"); + rm.delete("Standard1", 1); + rm.apply(); + + ColumnFamily retrieved = store.getColumnFamily("key1", "Standard1:Column1", new IdentityFilter()); + assert retrieved.isMarkedForDelete(); + assertNull(retrieved.getColumn("Column1")); + assertNull(ColumnFamilyStore.removeDeleted(retrieved, Integer.MAX_VALUE)); + } + + @Test + public void testRemoveColumnFamilyWithFlush1() throws IOException, ColumnFamilyNotDefinedException, ExecutionException, InterruptedException + { + Table table = Table.open("Table1"); + ColumnFamilyStore store = table.getColumnFamilyStore("Standard1"); + RowMutation rm; + // add data rm = new RowMutation("Table1", "key1"); rm.add("Standard1:Column1", "asdf".getBytes(), 0); @@ -286,7 +309,30 @@ public class ColumnFamilyStoreTest extends ServerTest ColumnFamily retrieved = store.getColumnFamily("key1", "Standard1", new IdentityFilter()); assert retrieved.isMarkedForDelete(); - assertEquals(retrieved.getColumnCount(), 0); + assertNull(retrieved.getColumn("Column1")); + assertNull(ColumnFamilyStore.removeDeleted(retrieved, Integer.MAX_VALUE)); + } + + @Test + public void testRemoveColumnFamilyWithFlush2() throws IOException, ColumnFamilyNotDefinedException, ExecutionException, InterruptedException + { + Table table = Table.open("Table1"); + ColumnFamilyStore store = table.getColumnFamilyStore("Standard1"); + RowMutation rm; + + // add data + rm = new RowMutation("Table1", "key1"); + rm.add("Standard1:Column1", "asdf".getBytes(), 0); + rm.apply(); + // remove + rm = new RowMutation("Table1", "key1"); + rm.delete("Standard1", 1); + rm.apply(); + store.forceBlockingFlush(); + + ColumnFamily retrieved = store.getColumnFamily("key1", "Standard1:Column1", new IdentityFilter()); + assert retrieved.isMarkedForDelete(); + assertNull(retrieved.getColumn("Column1")); assertNull(ColumnFamilyStore.removeDeleted(retrieved, Integer.MAX_VALUE)); }