7

Cassandra Daemon を実行しているときに、次の例外に遭遇しました。私は1.2トランクから実行しています。

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)

キャッシュが保存される場所は次のとおりです。

manuzhang@manuzhang-U24E:~/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

また、システム テーブル ファイルのロードに失敗します。

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)

Cassandra を3回実行するたびに、システム テーブルの読み込みエラーを再現できるようになりました(その後、すべてのファイルをクリーンアップしました)。ここで例外がスローされます。

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

3 つの実行は、コメントの 3 つの条件に正確に対応しています。

それは真新しいノードであるため、最初の実行では「ファイルがありません」。

2回目の実行では、「ファイルがあり、それらを読み取ることができます」。

3回目の実行では、「ファイルはありますが、読み取ることができません」と両方を確認しresult.isEmpty()、.result.one.has("cluster_name")false

実は、「読み込めませんでした」という例外で混乱しています。どういう意味ですか?r/w アクセス許可が現在のユーザーに付与されているため、ファイル システムのアクセス許可の問題ではないと思います。

上記の問題は、関連するすべてのファイルを削除すると解消されますが、Cassandra を実行するたびに実行したくありません。

これはかなり長い間私を悩ませてきました。

関係のない問題として、Cassandra@stackoverflow がコミュニティから十分な注目を集めていないと思います。同意しますか?

アイデアや提案をいただければ幸いです。

ありがとう。

4

1 に答える 1