删除后的Cassandra插入失败

时间:2015-08-17 06:59:01

标签: cassandra consistency

在复制因子大于1(例如3)的情况下,删除行并将其重新插入表的特定情况不会按预期工作。

我尝试在查询中使用仲裁进行读取以及写入和时间戳,但没有成功。

如果复制因子设置为1,则一切正常。我的群集中有5个节点。

在删除和插入操作后尝试读取时,问题变得可见。读取不会返回应该插入的行。

有人可以分享一下他们的想法吗?

修改

以下是我从代码

尝试的内容

数据库创建脚本:

DROP KEYSPACE IF EXISTS consistency_check;
CREATE KEYSPACE IF NOT EXISTS consistency_check WITH replication = {'class': 'NetworkTopologyStrategy', 'Cassandra': 3}  AND durable_writes = true;
USE consistency_check;

CREATE TABLE IF NOT EXISTS resource (
    id uuid,
    col1 text,
    col2 text,
    col3 text,
    col4 text,
    PRIMARY KEY(id, col1)
);

C#单元测试代码:

public class Resource
{
    public Guid Id { get; set; }
    public string Col1 { get; set; }
    public string Col2 { get; set; }
    public string Col3 { get; set; }
    public string Col4 { get; set; }
}


public class MyMappings : Mappings
{
    public MyMappings()
    {
        For<Resource>()
           .TableName("resource")
           .PartitionKey(u => u.Id)
           .Column(u => u.Id, cm => cm.WithName("id"))
           .Column(u => u.Col1, cm => cm.WithName("col1"))
           .Column(u => u.Col2, cm => cm.WithName("col2"))
           .Column(u => u.Col3, cm => cm.WithName("col3"))
           .Column(u => u.Col4, cm => cm.WithName("col4"));
    }
}

    //Following test fails always
    [TestMethod]
    public async Task DeleteInsert()
    {
        var table = new Table<Resource>(_session);
        _session.Execute("truncate resource");
        for (int i = 0; i < 10; i++)
        {
            var id = Guid.NewGuid();
            await table.Insert(new Resource { Id = id, Col1 = id.ToString(), Col2 = id.ToString(), Col3 = id.ToString(), Col4 = id.ToString() }).ExecuteAsync().ConfigureAwait(false);
        }
        var data = (await table.ExecuteAsync().ConfigureAwait(false)).ToList();
        foreach (var datum in data)
        {
            await table.Where(e => e.Id == datum.Id).Delete().ExecuteAsync().ConfigureAwait(false);
        }
        foreach (var datum in data)
        {
            await table.Insert(datum).ExecuteAsync().ConfigureAwait(false);
        }
        var data1 = (await table.ExecuteAsync().ConfigureAwait(false)).ToList();
        Console.WriteLine("data length: {0}", data.Count);
        Console.WriteLine("data1 length: {0}", data1.Count);
        Assert.IsTrue(data.Count == 10);
        Assert.IsTrue(data1.Count == 10);
    }

2 个答案:

答案 0 :(得分:0)

您在哪里设置一致性级别?如果您使用仲裁进行读写操作,则不应该遇到此问题。

答案 1 :(得分:0)

看起来像您以异步方式运行插入和删除操作-因此删除操作可以在插入操作之前进行。在这种情况下,将不满足delete子句,并且不会删除行。

我对C#async / await构造不是很熟悉,所以我可能会缺少一些东西