Repository: cassandra Updated Branches: refs/heads/trunk 04e5ec34d -> e75ebc4f6
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/trunk Commit: 0b8b67bfe28db8e6b2aa0ab91cf76da5ff55fea3 Parents: 4e3555c Author: Ariel Weisberg <[email protected]> Authored: Thu Sep 17 23:22:56 2015 +0200 Committer: Robert Stupp <[email protected]> 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();
