2012-08-07 12 views
7

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.

+1

¿por qué está ejecutando cassandra trunk, y no una versión lanzada? – sbridges

+0

@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

+0

Puede reproducir su problema con un lanzamiento oficial, http://cassandra.apache.org/download/ – sbridges

Respuesta

1

Tuve este problema en 2 escenarios.

  1. Intenté cambiar el particionador sin eliminar los datos del clúster (no puedo hacer eso) También vea mailing list para una explicación.
  2. Ejecuté el proceso de cassandra como superusuario la primera vez que se inició sudo ./cassandra que creó los directorios necesarios de datos/registro/caché con permisos solo para el superusuario, y luego reinicié cassandra y ejecuté el proceso como usuario regular (y por lo tanto no hice no tiene permiso para usar archivos en los directorios creados por el proceso ejecutado por el superusuario).

Sé que ha resuelto el problema, pero esto podría ser útil para otros desarrolladores.

Cuestiones relacionadas