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 中有详细说明)