Me he encontrado con la siguiente excepción al ejecutar Cassandra Daemon. Me estoy ejecutando desde 1.2 trunk.error al leer la memoria caché guardada y la tabla del sistema al iniciar Cassandra
WARN 14:47:51,038 error reading saved cache /home/manuzhang/cassandra/saved_caches/system-local-KeyCache-b.db
java.lang.NullPointerException
at org.apache.cassandra.cache.AutoSavingCache.loadSaved(AutoSavingCache.java:141)
at org.apache.cassandra.db.ColumnFamilyStore.<init>(ColumnFamilyStore.java:237)
at org.apache.cassandra.db.ColumnFamilyStore.createColumnFamilyStore(ColumnFamilyStore.java:340)
at org.apache.cassandra.db.ColumnFamilyStore.createColumnFamilyStore(ColumnFamilyStore.java:312)
at org.apache.cassandra.db.Table.initCf(Table.java:332)
at org.apache.cassandra.db.Table.<init>(Table.java:265)
at org.apache.cassandra.db.Table.open(Table.java:110)
at org.apache.cassandra.db.Table.open(Table.java:88)
at org.apache.cassandra.db.SystemTable.checkHealth(SystemTable.java:284)
at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:168)
at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:318)
at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:361)
aquí es donde se guardan las memorias caché:
[email protected]:~/cassandra/saved_caches$ ls -l
total 12
-rw-rw-r-- 1 manuzhang manuzhang 156 Aug 7 13:09 system-local-KeyCache-b.db
-rw-rw-r-- 1 manuzhang manuzhang 60 Aug 7 13:09 system-schema_columnfamilies-KeyCache-b.db
-rw-rw-r-- 1 manuzhang manuzhang 60 Aug 7 13:09 system-schema_columns-KeyCache-b.db
Además, no se cargan archivos de la tabla de sistema.
ERROR 17:03:16,637 Fatal exception during initialization
org.apache.cassandra.config.ConfigurationException: Found system table files, but they couldn't be loaded!
at org.apache.cassandra.db.SystemTable.checkHealth(SystemTable.java:303)
at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:201)
at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:349)
at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:392)
Ahora soy capaz de reproducir el error tabla del sistema de carga por cada tres carreras de Cassandra (I limpiar todos los archivos después). La excepción se produce aquí:
/**
* One of three things will happen if you try to read the system table:
* 1. files are present and you can read them: great
* 2. no files are there: great (new node is assumed)
* 3. files are present but you can't read them: bad
* @throws ConfigurationException
*/
public static void checkHealth() throws ConfigurationException
{
Table table;
try
{
table = Table.open(Table.SYSTEM_TABLE);
}
catch (AssertionError err)
{
// this happens when a user switches from OPP to RP.
ConfigurationException ex = new ConfigurationException("Could not read system table!");
ex.initCause(err);
throw ex;
}
ColumnFamilyStore cfs = table.getColumnFamilyStore(LOCAL_CF);
String req = "SELECT cluster_name FROM system.%s WHERE key='%s'";
UntypedResultSet result = processInternal(String.format(req, LOCAL_CF, LOCAL_KEY));
if (result.isEmpty() || !result.one().has("cluster_name"))
{
// this is a brand new node
if (!cfs.getSSTables().isEmpty())
throw new ConfigurationException("Found system table files, but they couldn't be loaded!");
// no system files. this is a new node.
req = "INSERT INTO system.%s (key, cluster_name) VALUES ('%s', '%s')";
processInternal(String.format(req, LOCAL_CF, LOCAL_KEY, DatabaseDescriptor.getClusterName()));
return;
}
String savedClusterName = result.one().getString("cluster_name");
if (!DatabaseDescriptor.getClusterName().equals(savedClusterName))
throw new ConfigurationException("Saved cluster name " + savedClusterName + " != configured name " + DatabaseDescriptor.getClusterName());
}
Las tres ejecuciones corresponden exactamente con las tres condiciones del comentario.
"No hay archivos" en la primera ejecución, ya que es un nuevo nodo.
En la segunda ejecución, "los archivos están ahí y puede leerlos".
En la tercera ejecución, "los archivos están allí pero no puede leerlos" y he comprobado que tanto result.isEmpty()
como result.one.has("cluster_name")
devuelven false
.
En realidad, estoy confundido con la excepción "no se pudo cargar". Qué significa eso? No creo que sea un problema de permiso del sistema de archivos dado que los permisos de r/w se otorgan al usuario actual.
Los problemas anteriores desaparecen después de eliminar todos los archivos relacionados, pero no quiero hacerlo cada vez que ejecuto Cassandra.
Esto me ha estado afligiendo por bastante tiempo.
Un problema no relacionado es que no creo que Cassandra @ stackoverflow haya recibido suficiente atención de la comunidad. ¿Estás de acuerdo?
Cualquier idea o sugerencia sería apreciada.
Gracias.
¿por qué está ejecutando cassandra trunk, y no una versión lanzada? – sbridges
@sbridges Si descargas la base de código siguiendo la wiki de Cassandra, eso es lo que obtienes; Y también puedo leer sobre algo nuevo como nodos virtuales – manuzhang
Puede reproducir su problema con un lanzamiento oficial, http://cassandra.apache.org/download/ – sbridges