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();

Reply via email to