【问题标题】:Insertion into Cassandra via thrift-client doesn't work after removing a row via cassandra-cli通过 cassandra-cli 删除一行后,通过 thrift-client 插入 Cassandra 不起作用
【发布时间】:2010-10-24 23:25:02
【问题描述】:

我编写了一个简单的测试来验证我自己对 Cassandra 节俭接口的理解。它只是在数据库中插入一行(使用 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)

我没有收到任何错误消息(无论是在客户端还是在服务器上),我不知道问题的原因可能是什么。

【问题讨论】:

    标签: cassandra thrift


    【解决方案1】:

    您正在以毫秒分辨率插入,但 CLI(和其他高级客户端)使用微秒。因此,与删除相比,您的第二次插入是过去的,因此 Cassandra 正确地忽略了它。

    【讨论】:

    • 我看不出不同的分辨率会有什么不同。运行 UnitTest(插入行)后,我在终端窗口中手动输入删除语句。此后我再次切换到 Eclipse 并重新运行我的测试。这些在语句执行之间发生的手动任务肯定都需要超过一微秒的时间。我这里有什么问题吗?
    • 作为一个保持数字简单的示例,假设您在 1970 年 1 月 1 日 00:01 进行了原始插入,在 00:02 进行了删除,在 00:03 进行了下一次插入。因此,您的第一次插入 System.currentTimeMillis() 返回 1000。对于删除,微秒返回 2000000。对于最终插入,currentTimeMillis 返回 3000。3000
    • 另外:你应该真正使用 Java 中的 Hector,而不是编写原始的 Thrift。 github.com/rantav/hector
    • 啊,现在明白了。虽然不是那么明显的行为。会看看赫克托。
    猜你喜欢
    • 2012-05-17
    • 2012-09-07
    • 2016-05-25
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多