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)

Reply via email to