1

私は、Cassandra のthrift インターフェースに関する私自身の理解を検証するために簡単なテストを書きました。データベースに行を挿入し (cassandra のインストールで事前構成されたキースペースと列ファミリを使用)、データベースからそれを読み取り、結果を比較します。

public class CassandraAPITest {
    @Test
    public void testCassandraAPI() throws Exception {
        TTransport tr = new TSocket("localhost", 9160);
        tr.open();
        Client client = new Cassandra.Client(new TBinaryProtocol(tr));
        String key = "123";
        byte[] value = { 52, 53, 54 };
        ColumnPath columnPath = new ColumnPath("Standard1");
        columnPath.setColumn("abc".getBytes("UTF8"));
        long timestamp = System.currentTimeMillis();

       client.insert("Keyspace1", key, columnPath, value, timestamp, ConsistencyLevel.ONE);

        SlicePredicate predicate = new SlicePredicate();
        SliceRange sliceRange = new SliceRange();
        sliceRange.setStart(new byte[0]);
        sliceRange.setFinish(new byte[0]);
        predicate.setSlice_range(sliceRange);

        List<ColumnOrSuperColumn> result = client.get_slice("Keyspace1", key, new ColumnParent("Standard1"), predicate, ConsistencyLevel.ONE);

        assertEquals(1, result.size());
        byte[] actual = result.get(0).column.value;
        assertArrayEquals(value, actual);

        // client.remove("Keyspace1", key, columnPath, System.currentTimeMillis(), ConsistencyLevel.ONE);

        tr.close();
    }
}

このテストは正常に実行されます。もちろん、データベースには行が残ります。上記の client.remove ステートメントのコメントを外すことで、テストの最後に行を削除できます (これも正常に機能します)。しかし、代わりに試したのは、コマンドライン インターフェイスを介して行を削除することでした。

cassandra> connect localhost/9160                   
Connected to: "Test Cluster" on localhost/9160
cassandra> get Keyspace1.Standard1['123']
=> (column=616263, value=456, timestamp=1287909211506)
Returned 1 results.
cassandra> del Keyspace1.Standard1['123']   
row removed.
cassandra> get Keyspace1.Standard1['123']
Returned 0 results.

その後、テストは失敗します。行をデータベースに挿入しても効果がないように見えるため、行 assertEquals(1, result.size()) は失敗します。

java.lang.AssertionError: expected:<1> but was:<0>
    at org.junit.Assert.fail(Assert.java:91)
    at org.junit.Assert.failNotEquals(Assert.java:618)
    at org.junit.Assert.assertEquals(Assert.java:126)
    at org.junit.Assert.assertEquals(Assert.java:443)
    at org.junit.Assert.assertEquals(Assert.java:427)
    at test.package.CassandraAPITest.testCassandraAPI(CassandraAPITest.java:48)

(クライアントでもサーバーでも) エラー メッセージが表示されず、問題の原因がわかりません。

4

1 に答える 1

2

ミリ秒の解像度で挿入していますが、CLI (およびその他の高レベル クライアント) はマイクロ秒を使用します。したがって、2 回目の挿入は削除と比較して過去のものであるため、Cassandra はそれを正しく無視します。

于 2010-10-24T15:25:02.477 に答える