Return-Path: X-Original-To: apmail-cassandra-commits-archive@www.apache.org Delivered-To: apmail-cassandra-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 1A9181151B for ; Wed, 27 Aug 2014 11:11:57 +0000 (UTC) Received: (qmail 65520 invoked by uid 500); 27 Aug 2014 11:11:56 -0000 Delivered-To: apmail-cassandra-commits-archive@cassandra.apache.org Received: (qmail 65489 invoked by uid 500); 27 Aug 2014 11:11:56 -0000 Mailing-List: contact commits-help@cassandra.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cassandra.apache.org Delivered-To: mailing list commits@cassandra.apache.org Received: (qmail 65459 invoked by uid 99); 27 Aug 2014 11:11:56 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 27 Aug 2014 11:11:56 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 7BCC99CAD50; Wed, 27 Aug 2014 11:11:56 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: marcuse@apache.org To: commits@cassandra.apache.org Date: Wed, 27 Aug 2014 11:11:56 -0000 Message-Id: <3cc9eb0402494f9fb38412eb244f7632@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [1/3] git commit: Track expired tombstones Repository: cassandra Updated Branches: refs/heads/cassandra-2.1.0 cb4bc2764 -> 049762b3e Track expired tombstones Patch by marcuse; reviewed by slebresne for CASSANDRA-7810 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/7f9e9a87 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/7f9e9a87 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/7f9e9a87 Branch: refs/heads/cassandra-2.1.0 Commit: 7f9e9a87188ccbc16bbb1630fe0720d6b366569d Parents: 1cf9863 Author: Marcus Eriksson Authored: Tue Aug 26 14:16:48 2014 +0200 Committer: Marcus Eriksson Committed: Wed Aug 27 12:55:17 2014 +0200 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../org/apache/cassandra/db/ColumnIndex.java | 2 +- .../org/apache/cassandra/db/RangeTombstone.java | 8 +++++- .../db/compaction/LazilyCompactedRow.java | 3 ++- .../apache/cassandra/db/RangeTombstoneTest.java | 27 ++++++++++++++++++++ 5 files changed, 38 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/7f9e9a87/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index badb45e..d27be1f 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 1.2.19 + * Track expired tombstones (CASSANDRA-7810) * Validate empty cell names from counter updates (CASSANDRA-7798) * Improve PasswordAuthenticator default super user setup (CASSANDRA-7788) * Remove duplicates from StorageService.getJoiningNodes (CASSANDRA-7478) http://git-wip-us.apache.org/repos/asf/cassandra/blob/7f9e9a87/src/java/org/apache/cassandra/db/ColumnIndex.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/ColumnIndex.java b/src/java/org/apache/cassandra/db/ColumnIndex.java index b152f30..284def5 100644 --- a/src/java/org/apache/cassandra/db/ColumnIndex.java +++ b/src/java/org/apache/cassandra/db/ColumnIndex.java @@ -187,7 +187,7 @@ public class ColumnIndex // TODO: Should deal with removing unneeded tombstones if (tombstoneTracker != null) - tombstoneTracker.update(column); + tombstoneTracker.update(column, false); lastColumn = column; } http://git-wip-us.apache.org/repos/asf/cassandra/blob/7f9e9a87/src/java/org/apache/cassandra/db/RangeTombstone.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/RangeTombstone.java b/src/java/org/apache/cassandra/db/RangeTombstone.java index 5e87847..90b72b7 100644 --- a/src/java/org/apache/cassandra/db/RangeTombstone.java +++ b/src/java/org/apache/cassandra/db/RangeTombstone.java @@ -127,6 +127,7 @@ public class RangeTombstone extends Interval implement return comparator.compare(t1.max, t2.max); } }); + public final Set expired = new HashSet(); private int atomCount; public Tracker(Comparator comparator) @@ -160,6 +161,9 @@ public class RangeTombstone extends Interval implement if (comparator.compare(firstColumn.name(), tombstone.max) > 0) continue; + if (expired.contains(tombstone)) + continue; + RangeTombstone updated = new RangeTombstone(firstColumn.name(), tombstone.max, tombstone.data); Iterator iter = toWrite.iterator(); @@ -194,7 +198,7 @@ public class RangeTombstone extends Interval implement * If column is a IColumn, check if any tracked range is useless and * can be removed. If it is a RangeTombstone, add it to this tracker. */ - public void update(OnDiskAtom atom) + public void update(OnDiskAtom atom, boolean isExpired) { if (atom instanceof RangeTombstone) { @@ -215,6 +219,8 @@ public class RangeTombstone extends Interval implement } ranges.addLast(t); maxOrderingSet.add(t); + if (isExpired) + expired.add(t); } else { http://git-wip-us.apache.org/repos/asf/cassandra/blob/7f9e9a87/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java b/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java index 4360b0b..433794a 100644 --- a/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java +++ b/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java @@ -271,8 +271,9 @@ public class LazilyCompactedRow extends AbstractCompactedRow implements Iterable RangeTombstone t = tombstone; tombstone = null; - if (t.data.isGcAble(controller.gcBefore)) + if (shouldPurge && t.data.isGcAble(controller.gcBefore)) { + indexBuilder.tombstoneTracker().update(t, true); return null; } else http://git-wip-us.apache.org/repos/asf/cassandra/blob/7f9e9a87/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java b/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java index 59be938..15db2f6 100644 --- a/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java +++ b/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java @@ -101,6 +101,33 @@ public class RangeTombstoneTest extends SchemaLoader assert !isLive(cf, cf.getColumn(b(i))) : "Column " + i + " shouldn't be live"; } + + @Test + public void test7810() throws ExecutionException, InterruptedException, IOException + { + DatabaseDescriptor.setInMemoryCompactionLimit(0); + Table table = Table.open(KSNAME); + ColumnFamilyStore cfs = table.getColumnFamilyStore(CFNAME); + cfs.metadata.gcGraceSeconds(2); + + String key = "7810"; + RowMutation rm; + rm = new RowMutation(KSNAME, ByteBufferUtil.bytes(key)); + for (int i = 10; i < 20; i++) + add(rm, i, 0); + rm.apply(); + cfs.forceBlockingFlush(); + + rm = new RowMutation(KSNAME, ByteBufferUtil.bytes(key)); + ColumnFamily cf = rm.addOrGet(CFNAME); + cf.delete(new DeletionInfo(b(10),b(11), cfs.getComparator(), 1, 1)); + rm.apply(); + cfs.forceBlockingFlush(); + Thread.sleep(5); + cfs.forceMajorCompaction(); + assertEquals(8, Util.getColumnFamily(table, Util.dk(key), CFNAME).getColumnCount()); + } + @Test public void test7808_1() throws ExecutionException, InterruptedException {