2012-08-07 3 views
7

Ich habe die folgende Ausnahme beim Ausführen von Cassandra Daemon gefunden. Ich renne von 1.2 trunk.Fehler beim Lesen des gespeicherten Cache und der Systemtabelle beim Starten von 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) 

hier, wo Caches gespeichert:

[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 

Auch scheitern System Tabellendateien zu laden.

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) 

Jetzt bin ich in der Lage, die Ladesystemtabelle Ausfall für alle drei Läufe von Cassandra (I aufzuräumen alle Dateien danach) zu reproduzieren. Die Ausnahme wird hier ausgelöst:

/** 
* 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()); 
} 

Die drei Ausführungen entsprechen genau den drei Bedingungen in dem Kommentar.

"Keine Dateien sind da" im ersten Lauf, da es ein brandneuer Knoten ist.

Im zweiten Lauf, "Dateien sind da und Sie können sie lesen".

Im dritten Lauf, "Dateien sind da, aber Sie können sie nicht lesen" und ich habe überprüft, dass sowohl result.isEmpty() und result.one.has("cluster_name") zurückgeben false.

Eigentlich bin ich verwirrt mit der Ausnahme "konnte nicht geladen werden". Was heißt das? Ich glaube nicht, dass es sich um ein Dateisystem-Berechtigungsproblem handelt, da dem aktuellen Benutzer R/W-Berechtigungen gewährt werden.

Die oben genannten Probleme verschwinden, nachdem ich alle zugehörigen Dateien gelöscht habe, aber ich möchte es nicht jedes Mal, wenn Sie Cassandra laufen lassen.

Das hat mich schon eine ganze Weile geplagt.

Ein nicht verwandtes Problem ist, dass ich glaube nicht, dass Cassandra @ stackoverflow genug Aufmerksamkeit von der Community erhalten hat. Sind Sie einverstanden?

Irgendwelche Ideen oder Vorschläge würden geschätzt.

Danke.

+1

Warum laufen Sie Cassandra Trunk, und nicht eine veröffentlichte Version? – sbridges

+0

@sbridges Wenn Sie die Codebasis nach dem Cassandra-Wiki herunterladen, erhalten Sie das; Und ich kann auch über etwas Neues wie virtuelle Knoten lesen – manuzhang

+0

Können Sie Ihr Problem mit einer offiziellen Veröffentlichung reproduzieren, http://cassandra.apache.org/download/ – sbridges

Antwort

1

Ich hatte dieses Problem in 2 Szenarien.

  1. Ich habe versucht, den Partitionierer zu ändern, ohne die Daten des Clusters zu entfernen (kann das nicht tun) Siehe auch mailing list für Erklärung.
  2. Ich habe den Cassandra-Prozess als ein Superuser beim ersten Mal gestartet sudo ./cassandra, die die erforderlichen Daten/Protokoll/Cache-Verzeichnisse mit Berechtigungen nur für den Superuser erstellt, und dann Cassandra neu gestartet und den Prozess als regulärer Benutzer (und damit didn) Sie dürfen keine Dateien in den Verzeichnissen verwenden, die von dem vom Superuser ausgeführten Prozess erstellt wurden.

Ich weiß, dass Sie das Problem gelöst haben, aber das könnte für andere Entwickler nützlich sein.

Verwandte Themen