首先让我解释一下。我有一段来自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()){
//insert logic code here
}
通过该示例代码片段,我能够使用由Aerospike文档采样的lua编写的UDF。 UDF只搜索多个分档并返回其结果,它永远不会持久存在,也不会转换任何数据。
现在的情况是,当使用此代码调用UDF的函数时,在AMC(Aerospike管理控制台)中,它产生的聚合作业标记为"完成(ok)"但从来没有标记为完成,仍然在"运行工作"表不是"已完成的工作"表。 (见下图)
Jobs Under Completed Jos Table
并根据Bash Terminal命令" Top"我看到Aerospike服务器的内存百分比使用量随着乔布斯数量的增长而不断增长,直到Aerospike服务器失败,因为它最大限度地延长了机器的内存使用量。
我的问题是,
*** EDITED: 示例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