Jinmei Liao created GEODE-5288:
----------------------------------
Summary: Execute function on region should not iterate through all
the servers hosting the region.
Key: GEODE-5288
URL: https://issues.apache.org/jira/browse/GEODE-5288
Project: Geode
Issue Type: Bug
Components: gfsh
Reporter: Jinmei Liao
Currently, if we 3 servers hosting a partitioned region "regionA", and we
execute the following command where the genericFunctionId is just printing out
the id of the function once:
gfsh> execute function --id=genericFunctionId --region=/regionA:
Member | Status | Message
-------- | ------ | ---------------------------------------------------------
server-1 | OK | [genericFunctionId, genericFunctionId, genericFunctionId]
server-2 | OK | [genericFunctionId, genericFunctionId, genericFunctionId]
server-3 | OK | [genericFunctionId, genericFunctionId, genericFunctionId]
we are executing on all 3 servers, and each server would then execute the
function 3 times, so we are executing the function for a total of 9 times which
is not correct. (we should only be executing it 3 times all together).
{code}
// test set up:
locator = cluster.startLocatorVM(0);
server1 = cluster.startServerVM(1, "group1", locator.getPort());
server2 = cluster.startServerVM(2, "group1", locator.getPort());
server3 = cluster.startServerVM(3, "group2", locator.getPort());
gfsh.connectAndVerify(locator);
// register the function on all members
MemberVM.invokeInEveryMember(()->{
FunctionService.registerFunction(new GenericFunctionOp(functionId));
}, server1, server2, server3);
// create a partitioned region on only group1
gfsh.executeAndAssertThat("create region --name=regionA
--type=PARTITION").statusIsSuccess().tableHasRowCount("Member",
3).tableHasColumnWithExactValuesInAnyOrder("Member", "server-1", "server-2",
"server-3");
// function body
public static class GenericFunctionOp implements Function {
private String functionId;
GenericFunctionOp(String functionId) {
this.functionId = functionId;
}
@Override
public void execute(FunctionContext context) {
String filter = null;
if(context instanceof RegionFunctionContext) {
RegionFunctionContext rContext = (RegionFunctionContext) context;
Set filters = rContext.getFilter();
filter = Strings.join(filters, ',');
}
String argument = null;
Object arguments = (context.getArguments());
if (arguments instanceof String[]) {
argument = String.join(",", (String[]) arguments);
}
if(filter !=null && argument != null){
context.getResultSender().lastResult(functionId + "-" + filter + "-"
+argument);
}
else if (filter != null) {
context.getResultSender().lastResult(functionId + "-" + filter);
}
else if (argument != null) {
context.getResultSender().lastResult(functionId + "-" + argument);
}
else{
context.getResultSender().lastResult(functionId);
}
}
public String getId() {
return functionId;
}
}
{code}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)