Aerospike - “n_bytes_memory 变为负值”,在带有 ttl 的仅内存命名空间中
Aerospike - “n_bytes_memory went negative” with in memory-only namespace with ttl
我们有一个命名空间配置为仅使用几分钟的默认 ttl 将数据存储在内存中。在开始将一些数据放入其中后,当过期开始时,我们会在日志中收到这些消息(很多,大约 30% 的过期记录):
WARNING (namespace): (namespace.c::762) set_id 1 - n_bytes_memory went negative!
我有一个带有服务器配置的简单客户端应用程序可以重现这个:https://github.com/akkomar/aerospike-test(它基于 docker 并且非常容易启动)
任何建议可能是什么原因?
编辑:
我在 3.6.4、3.7.0.1 和 3.7.4 版本上检查过这个
用于测试的配置文件(来自https://github.com/akkomar/aerospike-test/blob/master/etc/aerospike.conf):
service {
user root
group root
paxos-single-replica-limit 1
pidfile /var/run/aerospike/asd.pid
service-threads 4
transaction-queues 4
transaction-threads-per-queue 4
proto-fd-max 1024
}
logging {
file /var/log/aerospike/aerospike.log {
context any info
}
console {
context any info
context namespace detail
}
}
network {
service {
address any
port 3000
}
heartbeat {
mode mesh
port 3002
mesh-port 3002
interval 150
timeout 10
}
fabric {
port 3001
}
info {
port 3003
}
}
namespace test_ns {
replication-factor 2
memory-size 1G
default-ttl 10S
storage-engine memory
}
编辑2:
似乎只有当我通过 UDF 更新记录时才会发生这种情况。最简单的重现这个:
local VAL_KEY = "v"
function add_data(rec, val_to_add, ttl_to_set)
if aerospike:exists(rec) then
rec[VAL_KEY] = val_to_add
aerospike:update(rec)
else
rec[VAL_KEY] = val_to_add
aerospike:create(rec)
end
end
当我通过 Java API 执行相同的操作时 - 一切似乎都正常(示例 github 前面提到的 repo 更新为 Java API 例子)
错误信息的意思是我们在内存中占的space变成了一个负数,应该是不可能的。
这已记录在我们的内部错误跟踪系统中,以便在未来的版本中解决
原来是Aerospike的一个bug。
它在 3.7.4.1 版本中已修复(https://discuss.aerospike.com/t/problem-with-expiring-records-in-memory-only-namespace-n-bytes-memory-went-negative/2560/6 中有详细说明)
我们有一个命名空间配置为仅使用几分钟的默认 ttl 将数据存储在内存中。在开始将一些数据放入其中后,当过期开始时,我们会在日志中收到这些消息(很多,大约 30% 的过期记录):
WARNING (namespace): (namespace.c::762) set_id 1 - n_bytes_memory went negative!
我有一个带有服务器配置的简单客户端应用程序可以重现这个:https://github.com/akkomar/aerospike-test(它基于 docker 并且非常容易启动)
任何建议可能是什么原因?
编辑:
我在 3.6.4、3.7.0.1 和 3.7.4 版本上检查过这个
用于测试的配置文件(来自https://github.com/akkomar/aerospike-test/blob/master/etc/aerospike.conf):
service {
user root
group root
paxos-single-replica-limit 1
pidfile /var/run/aerospike/asd.pid
service-threads 4
transaction-queues 4
transaction-threads-per-queue 4
proto-fd-max 1024
}
logging {
file /var/log/aerospike/aerospike.log {
context any info
}
console {
context any info
context namespace detail
}
}
network {
service {
address any
port 3000
}
heartbeat {
mode mesh
port 3002
mesh-port 3002
interval 150
timeout 10
}
fabric {
port 3001
}
info {
port 3003
}
}
namespace test_ns {
replication-factor 2
memory-size 1G
default-ttl 10S
storage-engine memory
}
编辑2:
似乎只有当我通过 UDF 更新记录时才会发生这种情况。最简单的重现这个:
local VAL_KEY = "v"
function add_data(rec, val_to_add, ttl_to_set)
if aerospike:exists(rec) then
rec[VAL_KEY] = val_to_add
aerospike:update(rec)
else
rec[VAL_KEY] = val_to_add
aerospike:create(rec)
end
end
当我通过 Java API 执行相同的操作时 - 一切似乎都正常(示例 github 前面提到的 repo 更新为 Java API 例子)
错误信息的意思是我们在内存中占的space变成了一个负数,应该是不可能的。
这已记录在我们的内部错误跟踪系统中,以便在未来的版本中解决
原来是Aerospike的一个bug。 它在 3.7.4.1 版本中已修复(https://discuss.aerospike.com/t/problem-with-expiring-records-in-memory-only-namespace-n-bytes-memory-went-negative/2560/6 中有详细说明)