Author: jbellis
Date: Fri Oct 7 19:09:10 2011
New Revision: 1180159
URL: http://svn.apache.org/viewvc?rev=1180159&view=rev
Log:
clean up CompactionTask
patch by jbellis; reviewed by bcoverston for CASSANDRA-3330
Modified:
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/CompactionTask.java
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/LeveledCompactionTask.java
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java
Modified:
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/CompactionTask.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/CompactionTask.java?rev=1180159&r1=1180158&r2=1180159&view=diff
==============================================================================
---
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/CompactionTask.java
(original)
+++
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/CompactionTask.java
Fri Oct 7 19:09:10 2011
@@ -39,7 +39,7 @@ import org.apache.cassandra.utils.Closea
public class CompactionTask extends AbstractCompactionTask
{
- private static final Logger logger =
LoggerFactory.getLogger(CompactionTask.class);
+ protected static final Logger logger =
LoggerFactory.getLogger(CompactionTask.class);
protected String compactionFileLocation;
protected final int gcBefore;
protected boolean isUserDefined;
@@ -70,20 +70,13 @@ public class CompactionTask extends Abst
assert sstables != null;
Set<SSTableReader> toCompact = new HashSet<SSTableReader>(sstables);
- if (!isUserDefined)
- {
- if (!allowSingletonCompaction() && toCompact.size() < 2)
- {
- String msg = "Nothing to compact in " +
cfs.getColumnFamilyName();
- if (cfs.getCompactionStrategy() instanceof
SizeTieredCompactionStrategy)
- msg += ". Use forceUserDefinedCompaction if you wish to
force compaction of single sstables (e.g. for tombstone collection)";
- logger.info(msg);
- return 0;
- }
-
- if (compactionFileLocation == null)
- compactionFileLocation =
cfs.table.getDataFileLocation(cfs.getExpectedCompactedFileSize(toCompact));
+ if (!isCompactionInteresting(toCompact))
+ return 0;
+ if (compactionFileLocation == null)
+ compactionFileLocation =
cfs.table.getDataFileLocation(cfs.getExpectedCompactedFileSize(toCompact));
+ if (partialCompactionsAcceptable())
+ {
// If the compaction file path is null that means we have no space
left for this compaction.
// Try again w/o the largest one.
if (compactionFileLocation == null)
@@ -219,12 +212,17 @@ public class CompactionTask extends Abst
builder.append("]");
double mbps = dTime > 0 ?
(double)endsize/(1024*1024)/((double)dTime/1000) : 0;
- logger.info(String.format("Compacted to %s. %,d to %,d (~%d%% of
original) bytes for %,d keys at %fMBPS. Time: %,dms.",
+ logger.info(String.format("Compacted to %s. %,d to %,d (~%d%% of
original) bytes for %,d keys at %fMB/s. Time: %,dms.",
builder.toString(), startsize, endsize,
(int) (ratio * 100), totalkeysWritten, mbps, dTime));
logger.debug(String.format("CF Total Bytes Compacted: %,d",
CompactionTask.addToTotalBytesCompacted(endsize)));
return toCompact.size();
}
+ protected boolean partialCompactionsAcceptable()
+ {
+ return !isUserDefined;
+ }
+
//extensibility point for other strategies that may want to limit the
upper bounds of the sstable segment size
protected boolean newSSTableSegmentThresholdReached(SSTableWriter writer,
long position)
{
@@ -232,11 +230,15 @@ public class CompactionTask extends Abst
}
/**
- * extend this if the overridden compaction strategy requires single files
to be compacted to function properly
- * @return boolean
+ * @return true if the proposed compaction is worth proceeding with. We
allow leveled compaction to
+ * override this to allow "promoting" sstables from one level to another
w/o rewriting them, if there is no overlapping.
*/
- protected boolean allowSingletonCompaction()
+ protected boolean isCompactionInteresting(Set<SSTableReader> toCompact)
{
+ if (isUserDefined || toCompact.size() >= 2)
+ return true;
+ logger.info(String.format("Nothing to compact in %s. Use
forceUserDefinedCompaction if you wish to force compaction of single sstables
(e.g. for tombstone collection)",
+ cfs.getColumnFamilyName()));
return false;
}
Modified:
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java?rev=1180159&r1=1180158&r2=1180159&view=diff
==============================================================================
---
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java
(original)
+++
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java
Fri Oct 7 19:09:10 2011
@@ -43,7 +43,7 @@ public class LeveledCompactionStrategy e
{
private static final Logger logger =
LoggerFactory.getLogger(LeveledCompactionStrategy.class);
- private LeveledManifest manifest;
+ private final LeveledManifest manifest;
private final String SSTABLE_SIZE_OPTION = "sstable_size_in_mb";
private final int maxSSTableSizeInMB;
private final AtomicReference<LeveledCompactionTask> task = new
AtomicReference<LeveledCompactionTask>();
@@ -144,13 +144,11 @@ public class LeveledCompactionStrategy e
{
SSTableAddedNotification flushedNotification =
(SSTableAddedNotification) notification;
manifest.add(flushedNotification.added);
- manifest.logDistribution();
}
else if (notification instanceof SSTableListChangedNotification)
{
SSTableListChangedNotification listChangedNotification =
(SSTableListChangedNotification) notification;
manifest.promote(listChangedNotification.removed,
listChangedNotification.added);
- manifest.logDistribution();
}
}
Modified:
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/LeveledCompactionTask.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/LeveledCompactionTask.java?rev=1180159&r1=1180158&r2=1180159&view=diff
==============================================================================
---
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/LeveledCompactionTask.java
(original)
+++
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/LeveledCompactionTask.java
Fri Oct 7 19:09:10 2011
@@ -21,11 +21,19 @@ package org.apache.cassandra.db.compacti
*/
+import java.io.File;
import java.io.IOException;
import java.util.Collection;
+import java.util.Set;
import java.util.concurrent.CountDownLatch;
+import com.google.common.collect.Iterables;
+
+import org.apache.commons.lang.StringUtils;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.Table;
import org.apache.cassandra.io.sstable.SSTableReader;
import org.apache.cassandra.io.sstable.SSTableWriter;
@@ -61,8 +69,14 @@ public class LeveledCompactionTask exten
}
@Override
- protected boolean allowSingletonCompaction()
+ protected boolean isCompactionInteresting(Set<SSTableReader> toCompact)
{
return true;
}
+
+ @Override
+ protected boolean partialCompactionsAcceptable()
+ {
+ return false;
+ }
}
Modified:
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java?rev=1180159&r1=1180158&r2=1180159&view=diff
==============================================================================
---
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java
(original)
+++
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java
Fri Oct 7 19:09:10 2011
@@ -129,6 +129,7 @@ public class LeveledManifest
public synchronized void add(SSTableReader reader)
{
+ logDistribution();
logger.debug("Adding {} to L0", reader);
add(reader, 0);
serialize();
@@ -150,6 +151,7 @@ public class LeveledManifest
public synchronized void promote(Iterable<SSTableReader> removed,
Iterable<SSTableReader> added)
{
+ logDistribution();
if (logger.isDebugEnabled())
logger.debug((Iterables.isEmpty(added) ? "Removing [" : "Replacing
[") + toString(removed) + "]");
@@ -206,8 +208,6 @@ public class LeveledManifest
public synchronized Collection<SSTableReader> getCompactionCandidates()
{
- logDistribution();
-
// LevelDB gives each level a score of how much data it contains vs
its ideal amount, and
// compacts the level with the highest score. But this falls apart
spectacularly once you
// get behind. Consider this set of levels:
@@ -257,7 +257,7 @@ public class LeveledManifest
return generations.length > i ? generations[i].size() : 0;
}
- public void logDistribution()
+ private void logDistribution()
{
for (int i = 0; i < generations.length; i++)
{