Fix empty partition assertion in unsorted sstable writing tools patch by Fabien Rousseau; reviewed by benedict for CASSANDRA-9071
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/66a48e7a Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/66a48e7a Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/66a48e7a Branch: refs/heads/cassandra-2.2 Commit: 66a48e7ab137e7ec54b0bab5eaee44a9449930dd Parents: 655f056 Author: Fabien Rousseau <fabienrouss...@yahoo.fr> Authored: Wed Jun 3 17:00:10 2015 +0100 Committer: Benedict Elliott Smith <bened...@apache.org> Committed: Wed Jun 3 17:00:10 2015 +0100 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../io/sstable/SSTableSimpleUnsortedWriter.java | 17 +++++++++--- .../io/sstable/CQLSSTableWriterTest.java | 29 ++++++++++++++++++++ 3 files changed, 43 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/66a48e7a/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index f5c3b41..4d38e1e 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 2.1.6 + * Fix empty partition assertion in unsorted sstable writing tools (CASSANDRA-9071) * Ensure truncate without snapshot cannot produce corrupt responses (CASSANDRA-9388) * Consistent error message when a table mixes counter and non-counter columns (CASSANDRA-9492) http://git-wip-us.apache.org/repos/asf/cassandra/blob/66a48e7a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java index 4d7f4fa..9ee9ea1 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java @@ -175,6 +175,7 @@ public class SSTableSimpleUnsortedWriter extends AbstractSSTableSimpleWriter buffer = new Buffer(); currentSize = 0; columnFamily = getColumnFamily(); + buffer.setFirstInsertedKey(currentKey); } private void put(Buffer buffer) throws IOException @@ -207,7 +208,17 @@ public class SSTableSimpleUnsortedWriter extends AbstractSSTableSimpleWriter } // typedef - private static class Buffer extends TreeMap<DecoratedKey, ColumnFamily> {} + private static class Buffer extends TreeMap<DecoratedKey, ColumnFamily> { + private DecoratedKey firstInsertedKey; + + public void setFirstInsertedKey(DecoratedKey firstInsertedKey) { + this.firstInsertedKey = firstInsertedKey; + } + + public DecoratedKey getFirstInsertedKey() { + return firstInsertedKey; + } + } private class DiskWriter extends Thread { @@ -225,14 +236,12 @@ public class SSTableSimpleUnsortedWriter extends AbstractSSTableSimpleWriter return; writer = getWriter(); - boolean first = true; for (Map.Entry<DecoratedKey, ColumnFamily> entry : b.entrySet()) { if (entry.getValue().getColumnCount() > 0) writer.append(entry.getKey(), entry.getValue()); - else if (!first) + else if (!entry.getKey().equals(b.getFirstInsertedKey())) throw new AssertionError("Empty partition"); - first = false; } writer.close(); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/66a48e7a/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java b/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java index a7b751e..fa5cbb4 100644 --- a/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java @@ -22,6 +22,7 @@ import java.io.FilenameFilter; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.Iterator; +import java.util.UUID; import com.google.common.collect.ImmutableMap; import com.google.common.io.Files; @@ -173,6 +174,34 @@ public class CQLSSTableWriterTest } + @Test + public void testSyncNoEmptyRows() throws Exception + { + // Check that the write does not throw an empty partition error (#9071) + File tempdir = Files.createTempDir(); + String schema = "CREATE TABLE ks.test2 (" + + " k UUID," + + " c int," + + " PRIMARY KEY (k)" + + ")"; + String insert = "INSERT INTO ks.test2 (k, c) VALUES (?, ?)"; + CQLSSTableWriter writer = CQLSSTableWriter.builder() + .inDirectory(tempdir) + .forTable(schema) + .withPartitioner(StorageService.instance.getPartitioner()) + .using(insert) + .withBufferSizeInMB(1) + .build(); + + for (int i = 0 ; i < 50000 ; i++) { + writer.addRow(UUID.randomUUID(), 0); + } + writer.close(); + + } + + + private static final int NUMBER_WRITES_IN_RUNNABLE = 10; private class WriterThread extends Thread {