mirror of https://github.com/apache/cassandra
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:
parent
4e3555c1d9
commit
0b8b67bfe2
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Reference in New Issue