You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by al...@apache.org on 2014/09/16 09:32:04 UTC
git commit: Fix saving caches when a table is dropped
Repository: cassandra
Updated Branches:
refs/heads/cassandra-2.1 4efb6dc8c -> 05db5384f
Fix saving caches when a table is dropped
patch by Aleksey Yeschenko; reviewed by Benedict Elliott Smith for
CASSANDRA-7784
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/05db5384
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/05db5384
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/05db5384
Branch: refs/heads/cassandra-2.1
Commit: 05db5384f163e1534b67bc6aa74efd1775c29830
Parents: 4efb6dc
Author: Aleksey Yeschenko <al...@apache.org>
Authored: Tue Sep 16 00:30:21 2014 -0700
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Tue Sep 16 00:30:21 2014 -0700
----------------------------------------------------------------------
CHANGES.txt | 1 +
.../apache/cassandra/cache/AutoSavingCache.java | 35 ++++++++++++------
.../org/apache/cassandra/cache/CacheKey.java | 38 ++------------------
.../apache/cassandra/cache/CounterCacheKey.java | 6 ++--
.../org/apache/cassandra/cache/KeyCacheKey.java | 4 +--
.../org/apache/cassandra/cache/RowCacheKey.java | 7 ++--
.../org/apache/cassandra/config/Schema.java | 9 +++++
7 files changed, 42 insertions(+), 58 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/05db5384/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 8fe4253..f89cc6d 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
2.1.1
+ * Fix saving caches when a table is dropped (CASSANDRA-7784)
* Add better error checking of new stress profile (CASSANDRA-7716)
* Use ThreadLocalRandom and remove FBUtilities.threadLocalRandom (CASSANDRA-7934)
* Prevent operator mistakes due to simultaneous bootstrap (CASSANDRA-7069)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/05db5384/src/java/org/apache/cassandra/cache/AutoSavingCache.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cache/AutoSavingCache.java b/src/java/org/apache/cassandra/cache/AutoSavingCache.java
index affd69b..30b6891 100644
--- a/src/java/org/apache/cassandra/cache/AutoSavingCache.java
+++ b/src/java/org/apache/cassandra/cache/AutoSavingCache.java
@@ -29,6 +29,7 @@ import org.slf4j.LoggerFactory;
import org.apache.cassandra.config.CFMetaData;
import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.config.Schema;
import org.apache.cassandra.db.compaction.CompactionInfo;
import org.apache.cassandra.db.compaction.CompactionManager;
import org.apache.cassandra.db.compaction.OperationType;
@@ -64,11 +65,18 @@ public class AutoSavingCache<K extends CacheKey, V> extends InstrumentingCache<K
this.cacheLoader = cacheloader;
}
+ @Deprecated
public File getCachePath(String ksName, String cfName, UUID cfId, String version)
{
return DatabaseDescriptor.getSerializedCachePath(ksName, cfName, cfId, cacheType, version);
}
+ public File getCachePath(UUID cfId, String version)
+ {
+ Pair<String, String> names = Schema.instance.getCF(cfId);
+ return DatabaseDescriptor.getSerializedCachePath(names.left, names.right, cfId, cacheType, version);
+ }
+
public Writer getWriter(int keysToSave)
{
return new Writer(keysToSave);
@@ -206,18 +214,21 @@ public class AutoSavingCache<K extends CacheKey, V> extends InstrumentingCache<K
long start = System.nanoTime();
- HashMap<CacheKey.PathInfo, SequentialWriter> writers = new HashMap<>();
+ HashMap<UUID, SequentialWriter> writers = new HashMap<>();
try
{
for (K key : keys)
{
- CacheKey.PathInfo path = key.getPathInfo();
- SequentialWriter writer = writers.get(path);
+ UUID cfId = key.getCFId();
+ if (!Schema.instance.hasCF(key.getCFId()))
+ continue; // the table has been dropped.
+
+ SequentialWriter writer = writers.get(cfId);
if (writer == null)
{
- writer = tempCacheFile(path);
- writers.put(path, writer);
+ writer = tempCacheFile(cfId);
+ writers.put(cfId, writer);
}
try
@@ -238,13 +249,13 @@ public class AutoSavingCache<K extends CacheKey, V> extends InstrumentingCache<K
FileUtils.closeQuietly(writer);
}
- for (Map.Entry<CacheKey.PathInfo, SequentialWriter> info : writers.entrySet())
+ for (Map.Entry<UUID, SequentialWriter> entry : writers.entrySet())
{
- CacheKey.PathInfo path = info.getKey();
- SequentialWriter writer = info.getValue();
+ UUID cfId = entry.getKey();
+ SequentialWriter writer = entry.getValue();
File tmpFile = new File(writer.getPath());
- File cacheFile = getCachePath(path.keyspace, path.columnFamily, path.cfId, CURRENT_VERSION);
+ File cacheFile = getCachePath(cfId, CURRENT_VERSION);
cacheFile.delete(); // ignore error if it didn't exist
if (!tmpFile.renameTo(cacheFile))
@@ -254,9 +265,9 @@ public class AutoSavingCache<K extends CacheKey, V> extends InstrumentingCache<K
logger.info("Saved {} ({} items) in {} ms", cacheType, keys.size(), TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start));
}
- private SequentialWriter tempCacheFile(CacheKey.PathInfo pathInfo)
+ private SequentialWriter tempCacheFile(UUID cfId)
{
- File path = getCachePath(pathInfo.keyspace, pathInfo.columnFamily, pathInfo.cfId, CURRENT_VERSION);
+ File path = getCachePath(cfId, CURRENT_VERSION);
File tmpFile = FileUtils.createTempFile(path.getName(), null, path.getParentFile());
return SequentialWriter.open(tmpFile);
}
@@ -282,7 +293,9 @@ public class AutoSavingCache<K extends CacheKey, V> extends InstrumentingCache<K
}
}
else
+ {
logger.warn("Could not list files in {}", savedCachesDir);
+ }
}
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/05db5384/src/java/org/apache/cassandra/cache/CacheKey.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cache/CacheKey.java b/src/java/org/apache/cassandra/cache/CacheKey.java
index b4e6c22..44fead0 100644
--- a/src/java/org/apache/cassandra/cache/CacheKey.java
+++ b/src/java/org/apache/cassandra/cache/CacheKey.java
@@ -22,41 +22,7 @@ import java.util.UUID;
public interface CacheKey extends IMeasurableMemory
{
/**
- * @return The keyspace and ColumnFamily names to which this key belongs
+ * @return The cf id of the cache key.
*/
- public PathInfo getPathInfo();
-
- public static class PathInfo
- {
- public final String keyspace;
- public final String columnFamily;
- public final UUID cfId;
-
- public PathInfo(String keyspace, String columnFamily, UUID cfId)
- {
- this.keyspace = keyspace;
- this.columnFamily = columnFamily;
- this.cfId = cfId;
- }
-
- @Override
- public boolean equals(Object o)
- {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- PathInfo pathInfo = (PathInfo) o;
-
- return (cfId != null ? cfId.equals(pathInfo.cfId) : pathInfo.cfId == null) && columnFamily.equals(pathInfo.columnFamily) && keyspace.equals(pathInfo.keyspace);
- }
-
- @Override
- public int hashCode()
- {
- int result = keyspace.hashCode();
- result = 31 * result + columnFamily.hashCode();
- result = 31 * result + (cfId != null ? cfId.hashCode() : 0);
- return result;
- }
- }
+ public UUID getCFId();
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/05db5384/src/java/org/apache/cassandra/cache/CounterCacheKey.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cache/CounterCacheKey.java b/src/java/org/apache/cassandra/cache/CounterCacheKey.java
index da12dd4..60247c5 100644
--- a/src/java/org/apache/cassandra/cache/CounterCacheKey.java
+++ b/src/java/org/apache/cassandra/cache/CounterCacheKey.java
@@ -21,7 +21,6 @@ import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.UUID;
-import org.apache.cassandra.config.Schema;
import org.apache.cassandra.db.composites.CellName;
import org.apache.cassandra.db.composites.CellNames;
import org.apache.cassandra.utils.*;
@@ -47,10 +46,9 @@ public class CounterCacheKey implements CacheKey
return new CounterCacheKey(cfId, partitionKey, cellName);
}
- public PathInfo getPathInfo()
+ public UUID getCFId()
{
- Pair<String, String> cf = Schema.instance.getCF(cfId);
- return new PathInfo(cf.left, cf.right, cfId);
+ return cfId;
}
public long unsharedHeapSize()
http://git-wip-us.apache.org/repos/asf/cassandra/blob/05db5384/src/java/org/apache/cassandra/cache/KeyCacheKey.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cache/KeyCacheKey.java b/src/java/org/apache/cassandra/cache/KeyCacheKey.java
index 5624133..cef37ce 100644
--- a/src/java/org/apache/cassandra/cache/KeyCacheKey.java
+++ b/src/java/org/apache/cassandra/cache/KeyCacheKey.java
@@ -44,9 +44,9 @@ public class KeyCacheKey implements CacheKey
assert this.key != null;
}
- public PathInfo getPathInfo()
+ public UUID getCFId()
{
- return new PathInfo(desc.ksname, desc.cfname, cfId);
+ return cfId;
}
public String toString()
http://git-wip-us.apache.org/repos/asf/cassandra/blob/05db5384/src/java/org/apache/cassandra/cache/RowCacheKey.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cache/RowCacheKey.java b/src/java/org/apache/cassandra/cache/RowCacheKey.java
index aebb129..af2d4d4 100644
--- a/src/java/org/apache/cassandra/cache/RowCacheKey.java
+++ b/src/java/org/apache/cassandra/cache/RowCacheKey.java
@@ -21,12 +21,10 @@ import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.UUID;
-import org.apache.cassandra.config.Schema;
import org.apache.cassandra.db.DecoratedKey;
import org.apache.cassandra.utils.ByteBufferUtil;
import org.apache.cassandra.utils.FBUtilities;
import org.apache.cassandra.utils.ObjectSizes;
-import org.apache.cassandra.utils.Pair;
public class RowCacheKey implements CacheKey, Comparable<RowCacheKey>
{
@@ -47,10 +45,9 @@ public class RowCacheKey implements CacheKey, Comparable<RowCacheKey>
assert this.key != null;
}
- public PathInfo getPathInfo()
+ public UUID getCFId()
{
- Pair<String, String> cf = Schema.instance.getCF(cfId);
- return new PathInfo(cf.left, cf.right, cfId);
+ return cfId;
}
public long unsharedHeapSize()
http://git-wip-us.apache.org/repos/asf/cassandra/blob/05db5384/src/java/org/apache/cassandra/config/Schema.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/Schema.java b/src/java/org/apache/cassandra/config/Schema.java
index 106ad9b..8e9802f 100644
--- a/src/java/org/apache/cassandra/config/Schema.java
+++ b/src/java/org/apache/cassandra/config/Schema.java
@@ -302,6 +302,15 @@ public class Schema
}
/**
+ * @param cfId The identifier of the ColumnFamily to lookup
+ * @return true if the CF id is a known one, false otherwise.
+ */
+ public boolean hasCF(UUID cfId)
+ {
+ return cfIdMap.containsValue(cfId);
+ }
+
+ /**
* Lookup keyspace/ColumnFamily identifier
*
* @param ksName The keyspace name