Skip to content

Commit

Permalink
avoid writing empty rows when scrubbing tombstoned rows
Browse files Browse the repository at this point in the history
patch by jbellis; reviewed by slebresne for CASSANDRA-2296

git-svn-id: https://svn.apache.org/repos/asf/cassandra/branches/cassandra-0.7@1079816 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
jbellis committed Mar 9, 2011
1 parent 942a432 commit 0087c38
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 6 deletions.
1 change: 1 addition & 0 deletions CHANGES.txt
Expand Up @@ -13,6 +13,7 @@
(CASSANDRA-2259)
* move sample schema from cassandra.yaml to schema-sample.txt,
a cli scripts (CASSANDRA-2007)
* avoid writing empty rows when scrubbing tombstoned rows (CASSANDRA-2296)


0.7.3
Expand Down
28 changes: 22 additions & 6 deletions src/java/org/apache/cassandra/db/CompactionManager.java
Expand Up @@ -534,7 +534,7 @@ private void doScrub(ColumnFamilyStore cfs) throws IOException

SSTableWriter writer = maybeCreateWriter(cfs, compactionFileLocation, expectedBloomFilterSize, null);
executor.beginCompaction(cfs.columnFamily, new ScrubInfo(dataFile, sstable));
int goodRows = 0, badRows = 0;
int goodRows = 0, badRows = 0, emptyRows = 0;

while (!dataFile.isEOF())
{
Expand Down Expand Up @@ -588,8 +588,16 @@ private void doScrub(ColumnFamilyStore cfs) throws IOException
if (dataSize > dataFile.length())
throw new IOError(new IOException("Impossible row size " + dataSize));
SSTableIdentityIterator row = new SSTableIdentityIterator(sstable, dataFile, key, dataStart, dataSize, true);
writer.append(getCompactedRow(row, cfs, sstable.descriptor, true));
goodRows++;
AbstractCompactedRow compactedRow = getCompactedRow(row, cfs, sstable.descriptor, true);
if (compactedRow.isEmpty())
{
emptyRows++;
}
else
{
writer.append(compactedRow);
goodRows++;
}
if (!key.key.equals(currentIndexKey) || dataStart != dataStartFromIndex)
logger.warn("Row scrubbed successfully but index file contains a different key or row size; consider rebuilding the index as described in http://www.mail-archive.com/user@cassandra.apache.org/msg03325.html");
}
Expand All @@ -608,8 +616,16 @@ private void doScrub(ColumnFamilyStore cfs) throws IOException
try
{
SSTableIdentityIterator row = new SSTableIdentityIterator(sstable, dataFile, key, dataStartFromIndex, dataSizeFromIndex, true);
writer.append(getCompactedRow(row, cfs, sstable.descriptor, true));
goodRows++;
AbstractCompactedRow compactedRow = getCompactedRow(row, cfs, sstable.descriptor, true);
if (compactedRow.isEmpty())
{
emptyRows++;
}
else
{
writer.append(compactedRow);
goodRows++;
}
}
catch (Throwable th2)
{
Expand All @@ -634,7 +650,7 @@ private void doScrub(ColumnFamilyStore cfs) throws IOException
{
SSTableReader newSstable = writer.closeAndOpenReader(sstable.maxDataAge);
cfs.replaceCompactedSSTables(Arrays.asList(sstable), Arrays.asList(newSstable));
logger.info("Scrub of " + sstable + " complete: " + goodRows + " rows in new sstable");
logger.info("Scrub of " + sstable + " complete: " + goodRows + " rows in new sstable and " + emptyRows + " empty (tombstoned) rows dropped");
if (badRows > 0)
logger.warn("Unable to recover " + badRows + " rows that were skipped. You can attempt manual recovery from the pre-scrub snapshot. You can also run nodetool repair to transfer the data from a healthy replica, if any");
}
Expand Down

0 comments on commit 0087c38

Please sign in to comment.