调用Truncate后写操作错误(代码22)。 - C#客户

时间:2017-09-29 15:47:45

标签: aerospike

当我尝试使用Aerospike客户端()时,我得到了这个错误:
22 AS_PROTO_RESULT_FAIL_FORBIDDEN

仅当在截断()之后调用Write操作且仅在特定键上调用时才会发生错误。 我试着:

  • 更改密钥类型(字符串,长号,小号,大号)
  • 更改传递的Key类型(Value,long,string)
  • 更改WritePolicy
  • 上的重试次数
  • 在每次写入之前添加延迟(200ms,500ms)
  • 生成全新的密钥(GUID.NewGuid()。ToString())

没有解决这个问题所以我认为唯一的原因是Truncate操作。

错误是系统性的;因为同一组密钥在相同的密钥上完全失败。

在调用截断后,等待X秒并检查控制台管理,Set上的对象编号是" 0"

我必须等待几分钟(1到5)以确保运行该过程问题已经消失。

群集有3个节点,副本因子为2. SSD持久性

我正在使用NuGet C#Aerospike.Client v 3.4.4

在单个本地节点(docker,在内存中)运行进程不会产生任何错误。

如何知道Truncate()进程(其后面的删除操作)何时完全终止并且我可以安全地使用Set?

[解决]
正如所建议的,我们的devops检查了时间跨度同步。他在机器图像上发现 NTP未启用(错误地) 启用它。再次测试。没有更多的错误。

谢谢,

亚历

1 个答案:

答案 0 :(得分:3)

听起来像跨节点时间同步的潜在问题,请确保正确设置ntp ...这是我在这一点上的唯一猜测,特别是当你提到它在单个节点上工作时。 truncate命令将捕获当前时间(如果您没有指定时间),并将使用它来防止写入“之前”写入的记录。检查(从我的头顶,对不起,如果不是这样)/opt/aerospike/smd/truncate.smd在每个节点上查看截断命令的时间戳并检查不同节点的时间。

[感谢@kporter的评论。因此,所有truncate.smd文件中的时间都是相同的,但是机器之间的时间差异仍会导致写入对某些节点失败]