You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sc...@apache.org on 2012/03/06 09:38:11 UTC
[2/2] git commit: avoid quadratic startup time in LeveledManifest
avoid quadratic startup time in LeveledManifest
patch by Dave Brosius; reviewed by scode (and partially jbellis) for CASSANDRA-3952
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/e58540fe
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/e58540fe
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/e58540fe
Branch: refs/heads/cassandra-1.1
Commit: e58540fe368ed5f3d3c0d877fdaacc245fbce3bb
Parents: 154daa0
Author: Peter Schuller <pe...@infidyne.com>
Authored: Tue Mar 6 00:35:55 2012 -0800
Committer: Peter Schuller <pe...@infidyne.com>
Committed: Tue Mar 6 00:35:55 2012 -0800
----------------------------------------------------------------------
CHANGES.txt | 1 +
.../cassandra/db/compaction/LeveledManifest.java | 18 +++++++++-----
2 files changed, 12 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/e58540fe/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 86ab50a..bebe029 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -18,6 +18,7 @@
* perform static initialization of StorageProxy on start-up (CASSANDRA-3797)
* support trickling fsync() on writes (CASSANDRA-3950)
* expose counters for unavailable/timeout exceptions given to thrift clients (CASSANDRA-3671)
+ * avoid quadratic startup time in LeveledManifest (CASSANDRA-3952)
Merged from 1.0:
* remove the wait on hint future during write (CASSANDRA-3870)
* (cqlsh) ignore missing CfDef opts (CASSANDRA-3933)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/e58540fe/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java b/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java
index a546cbc..d2edebe 100644
--- a/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java
+++ b/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java
@@ -59,6 +59,7 @@ public class LeveledManifest
private final ColumnFamilyStore cfs;
private final List<SSTableReader>[] generations;
+ private final Map<SSTableReader, Integer> sstableGenerations;
private final RowPosition[] lastCompactedKeys;
private final int maxSSTableSizeInMB;
@@ -76,6 +77,7 @@ public class LeveledManifest
generations[i] = new ArrayList<SSTableReader>();
lastCompactedKeys[i] = cfs.partitioner.getMinimumToken().minKeyBound();
}
+ sstableGenerations = new HashMap<SSTableReader, Integer>();
}
static LeveledManifest create(ColumnFamilyStore cfs, int maxSSTableSize)
@@ -138,7 +140,7 @@ public class LeveledManifest
}
/**
- * if the number of SSTables in the current compacted set *by itself* exeeds the target level's
+ * if the number of SSTables in the current compacted set *by itself* exceeds the target level's
* (regardless of the level's current contents), find an empty level instead
*/
private int skipLevels(int newLevel, Iterable<SSTableReader> added)
@@ -165,6 +167,7 @@ public class LeveledManifest
for (SSTableReader sstable : removed)
{
int thisLevel = levelOf(sstable);
+ assert thisLevel >= 0;
maximumLevel = Math.max(maximumLevel, thisLevel);
minimumLevel = Math.min(minimumLevel, thisLevel);
remove(sstable);
@@ -283,12 +286,11 @@ public class LeveledManifest
private int levelOf(SSTableReader sstable)
{
- for (int level = 0; level < generations.length; level++)
- {
- if (generations[level].contains(sstable))
- return level;
- }
- return -1;
+ Integer level = sstableGenerations.get(sstable);
+ if (level == null)
+ return -1;
+
+ return level.intValue();
}
private void remove(SSTableReader reader)
@@ -296,12 +298,14 @@ public class LeveledManifest
int level = levelOf(reader);
assert level >= 0 : reader + " not present in manifest";
generations[level].remove(reader);
+ sstableGenerations.remove(reader);
}
private void add(SSTableReader sstable, int level)
{
assert level < generations.length : "Invalid level " + level + " out of " + (generations.length - 1);
generations[level].add(sstable);
+ sstableGenerations.put(sstable, Integer.valueOf(level));
}
private static List<SSTableReader> overlapping(SSTableReader sstable, Iterable<SSTableReader> candidates)