Saved caches use ambigous keyspace and CF name to identify tables

patch by Ariel Weisberg; reviewed by Robert Stupp for CASSANDRA-10359
This commit is contained in:
Ariel Weisberg 2015-09-17 23:22:56 +02:00 committed by Robert Stupp
parent 4e3555c1d9
commit 0b8b67bfe2
3 changed files with 34 additions and 14 deletions

View File

@ -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)

View File

@ -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)
{
Schema.instance.updateVersion();
schemaVersion = Schema.instance.getVersion();
}
writer.writeLong(schemaVersion.getMostSignificantBits());
writer.writeLong(schemaVersion.getLeastSignificantBits());
for (K key : keys)
{
ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreIncludingIndexes(key.ksAndCFName);
if (cfs == null)
continue; // the table or 2i has been dropped.
cacheLoader.serialize(key, writer, cfs);
}
catch (IOException e)
{
throw new FSWriteError(e, tempCacheFile);
}
keysWritten++;
keysWritten++;
}
}
catch (IOException e)
{
throw new FSWriteError(e, tempCacheFile);
}
}
finally

View File

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