You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sn...@apache.org on 2015/09/17 23:27:22 UTC
cassandra git commit: Saved caches use ambigous keyspace and CF name
to identify tables
Repository: cassandra
Updated Branches:
refs/heads/cassandra-2.1 4e3555c1d -> 0b8b67bfe
Saved caches use ambigous keyspace and CF name to identify tables
patch by Ariel Weisberg; reviewed by Robert Stupp for CASSANDRA-10359
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/0b8b67bf
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/0b8b67bf
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/0b8b67bf
Branch: refs/heads/cassandra-2.1
Commit: 0b8b67bfe28db8e6b2aa0ab91cf76da5ff55fea3
Parents: 4e3555c
Author: Ariel Weisberg <ar...@datastax.com>
Authored: Thu Sep 17 23:22:56 2015 +0200
Committer: Robert Stupp <sn...@snazy.de>
Committed: Thu Sep 17 23:22:56 2015 +0200
----------------------------------------------------------------------
CHANGES.txt | 2 +-
.../apache/cassandra/cache/AutoSavingCache.java | 43 ++++++++++++++------
.../apache/cassandra/cql3/KeyCacheCqlTest.java | 1 +
3 files changed, 33 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/0b8b67bf/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 207f16a..e2dd83a 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,5 @@
2.1.10
- * Fix cache handling of 2i and base tables (CASSANDRA-10155)
+ * Fix cache handling of 2i and base tables (CASSANDRA-10155, 10359)
* Fix NPE in nodetool compactionhistory (CASSANDRA-9758)
* (Pig) support BulkOutputFormat as a URL parameter (CASSANDRA-7410)
* BATCH statement is broken in cqlsh (CASSANDRA-10272)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/0b8b67bf/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 3ebbc76..1174c44 100644
--- a/src/java/org/apache/cassandra/cache/AutoSavingCache.java
+++ b/src/java/org/apache/cassandra/cache/AutoSavingCache.java
@@ -178,6 +178,15 @@ public class AutoSavingCache<K extends CacheKey, V> extends InstrumentingCache<K
{
logger.info(String.format("reading saved cache %s", path));
in = new DataInputStream(new LengthAvailableInputStream(new BufferedInputStream(streamFactory.getInputStream(path)), path.length()));
+
+ //Check the schema has not changed since CFs are looked up by name which is ambiguous
+ UUID schemaVersion = new UUID(in.readLong(), in.readLong());
+ if (!schemaVersion.equals(Schema.instance.getVersion()))
+ throw new RuntimeException("Cache schema version "
+ + schemaVersion.toString()
+ + " does not match current schema version "
+ + Schema.instance.getVersion());
+
ArrayDeque<Future<Pair<K, V>>> futures = new ArrayDeque<Future<Pair<K, V>>>();
while (in.available() > 0)
@@ -313,23 +322,33 @@ public class AutoSavingCache<K extends CacheKey, V> extends InstrumentingCache<K
throw new RuntimeException(e);
}
- for (K key : keys)
+ try
{
-
- ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreIncludingIndexes(key.ksAndCFName);
- if (cfs == null)
- continue; // the table or 2i has been dropped.
-
- try
+ //Need to be able to check schema version because CF names are ambiguous
+ UUID schemaVersion = Schema.instance.getVersion();
+ if (schemaVersion == null)
{
- cacheLoader.serialize(key, writer, cfs);
+ Schema.instance.updateVersion();
+ schemaVersion = Schema.instance.getVersion();
}
- catch (IOException e)
+ writer.writeLong(schemaVersion.getMostSignificantBits());
+ writer.writeLong(schemaVersion.getLeastSignificantBits());
+
+ for (K key : keys)
{
- throw new FSWriteError(e, tempCacheFile);
- }
- keysWritten++;
+ ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreIncludingIndexes(key.ksAndCFName);
+ if (cfs == null)
+ continue; // the table or 2i has been dropped.
+
+ cacheLoader.serialize(key, writer, cfs);
+
+ keysWritten++;
+ }
+ }
+ catch (IOException e)
+ {
+ throw new FSWriteError(e, tempCacheFile);
}
}
finally
http://git-wip-us.apache.org/repos/asf/cassandra/blob/0b8b67bf/test/unit/org/apache/cassandra/cql3/KeyCacheCqlTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/cql3/KeyCacheCqlTest.java b/test/unit/org/apache/cassandra/cql3/KeyCacheCqlTest.java
index 0e879e9..f2bea8e 100644
--- a/test/unit/org/apache/cassandra/cql3/KeyCacheCqlTest.java
+++ b/test/unit/org/apache/cassandra/cql3/KeyCacheCqlTest.java
@@ -129,6 +129,7 @@ public class KeyCacheCqlTest extends CQLTester
assertNull(Schema.instance.getColumnFamilyStoreIncludingIndexes(Pair.create(KEYSPACE, "bar")));
dropTable("DROP TABLE %s");
+ Schema.instance.updateVersion();
//Test loading for a dropped 2i/table
CacheService.instance.keyCache.clear();