使用Java客户端UDF时Aerospike内存消耗异常增加(查询聚合)

让我先解释一下。我有一段来自Java的代码示例,它是这样写的:

Statement statement = new Statement();
statement.setNamespace("foo");
statement.setSetName("bar");
statement.setAggregateFunction(Thread.currentThread().getContextClassLoader(),
    "udf/resource/path","udfFilename","udfFunctionName",
    "args1","args2","args3","args4");
ResultSet rs = aerospikeClient.getClient().queryAggregate(null,statement);

while(rs.next()){
   //在这里插入逻辑代码
}

使用这个示例代码,我能够像Aerospike文档中展示的那样使用用lua编写的UDF。这个UDF只是在多个bin中搜索并返回它的发现结果,它不会持久化或转换任何数据。

现在的问题是,当使用这个调用UDF的代码函数时,在AMC(Aerospike Management Console)中会生成被标记为"done(ok)"的聚合作业,但它们从未被标记为已完成,仍然位于"正在运行的作业"表而不是"已完成的作业"表中。(见下图)

正在运行的作业

已完成的作业

在Bash终端命令"Top"下,我看到了Aerospike服务器的内存百分比使用率随着作业数量的增加而不断增长,直到Aerospike服务器由于占满了机器的内存使用量而失败。

我的问题是,

  1. 如果聚合作业确实是导致异常的内存增长的资源,是否可能让这些资源释放?
  2. 如果不是聚合作业的责任,那是什么?

***编辑: 样例Lua代码:

local function map_request(record)
    return map {response = record.response,
                templateId = record.templateId,
                id = record.id, requestSent = record.requestSent,
                dateReplied = record.dateReplied}
end

function checkResponse(stream, responseFilter, templateId, validtyPeriod, currentDate)
       local function filterResponse(record)
            if responseFilter ~= "FOO" and validityPeriod > 0 then
                   return (record.response == responseFilter) and
                          (record.templateId == templateId) and
                          (record.dateReplied + validityPeriod) > currentDate
            else
                   return (record.response == responseFilter) and
                          (record.templateId == templateId)
            end
        end
        return stream:filter (filterResponse):map(map_request)
end
点赞