【问题标题】:Couchbase Server KV Error: "EINVAL" on null UpsertCouchbase 服务器 KV 错误:空 Upsert 上的“EINVAL”
【发布时间】:2020-09-02 09:18:40
【问题描述】:

我有一个 Couchbase 文档,我想使用服务器版本 6.6.0、CouchbaseNetClient 3.0.5、Couchbase.Extensions.DependencyInjection 3.0.4.811 进行变异。

文档:

{
    "name": "First Last",
    "email": null
}

变异代码:

var bucket = await _bucketProvider.GetBucketAsync();
await bucket.DefaultCollection().MutateInAsync(updatedProfile.Id, new[]
{
    MutateInSpec.Upsert("name", updatedProfile.Name),
    MutateInSpec.Upsert("email", updatedProfile.Email)
});

当新的电子邮件值为空时,我收到以下错误:

KV 错误:{Name="EINVAL", Description="Invalid packet", 属性="internal,invalid-input"}

这似乎是一个错误,很遗憾,我无法将问题提交到 GitHub 上的 .NET 客户端存储库。

我在Couchbase can't MutateIn multiple upserts with null value 找到了类似的帖子,但即使我只更新一个值,它仍然不会变为 null。

任何帮助将不胜感激。

注意:以下是重现问题的示例 sn-p。

class Program
{
    private static ICluster _cluster;

    static async Task Main(string[] args)
    {
        var userInfo = new
        {
            Name = "User1",
            Email = (string)null // *** This is causing the exception. ***
        };

        _cluster = await Cluster.ConnectAsync("couchbase://localhost", "Administrator", "Password");

        var bucket = await _cluster.BucketAsync("items");
        await bucket.DefaultCollection().MutateInAsync("doc1", new[]
        {
            MutateInSpec.Upsert("name", userInfo.Name),
            MutateInSpec.Upsert("email", userInfo.Email) // *** Setting the null value ***
        });

        _cluster.Dispose();
    }
}

编辑: Couchbase Jira 问题 - https://issues.couchbase.com/browse/NCBC-2640

【问题讨论】:

标签: c# .net .net-core couchbase


【解决方案1】:

更新:这似乎是一个错误 - https://issues.couchbase.com/browse/NCBC-2640


我刚刚使用最新版本的 .NET SDK (3.0.5, just released today) 进行了尝试,它可以正常工作,没有错误。我首先手动创建了您的示例文档。然后我在控制台应用程序中运行它:

class Program
{
    private static ICluster _cluster;

    static async Task Main(string[] args)
    {
         _cluster = await Cluster.ConnectAsync("couchbase://localhost", "Administrator", "password");

        var bucket = await _cluster.BucketAsync("bucket");
        var result = await bucket.DefaultCollection().MutateInAsync("doc1", new[]
        {
            MutateInSpec.Upsert("name", "new name"),
            MutateInSpec.Upsert("email", "new email") // this works fine, but `default(string)` instead of "new email" causes an exception
        });

        _cluster.Dispose();
    }
}

在不知道您使用的是什么版本的 SDK 的情况下,我推测这是一个已修复的错误。

另一种可能性:我注意到_bucketProvider 的使用。默认情况下,Couchbase.Extensions.DependencyInjection 库可能使用旧版本的 SDK,因此请记住,您可以使用 NuGet 单独添加/更新这两个库。 (同样,只是推测您可能使用的版本)。

【讨论】:

  • 感谢您对此进行调查!我只使用 .NET 客户端 3.0.5 制作了一个新应用程序并运行了您的代码。我只做了一个小的修改,将“电子邮件”设置为空,而不是“新电​​子邮件”,问题就出现了。
  • 我明白了!我会再试一次。
  • 你是对的,这绝对是一个错误。我能够复制;我在您的工单中添加了堆栈跟踪和日志输出。感谢您打开它!
【解决方案2】:

这已被 Couchbase 团队确定为一个错误。您可以在这里关注进度 - https://issues.couchbase.com/browse/NCBC-2640

【讨论】:

    猜你喜欢
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    相关资源
    最近更新 更多