[ 
https://issues.apache.org/jira/browse/GEODE-9576?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17408849#comment-17408849
 ] 

ASF GitHub Bot commented on GEODE-9576:
---------------------------------------

jvarenina commented on a change in pull request #864:
URL: https://github.com/apache/geode-native/pull/864#discussion_r701104899



##########
File path: cppcache/integration/test/FunctionExecutionTest.cpp
##########
@@ -175,6 +181,58 @@ TEST(FunctionExecutionTest,
   cache.close();
 }
 
+void populateRegion(const std::shared_ptr<Region> &region) {
+  for (int i = 0; i < 113; i++) {
+    region->put("KEY--" + std::to_string(i), "VALUE--" + std::to_string(i));
+  }
+}
+
+TEST(FunctionExecutionTest, FunctionExecutionSingleHopNonHA) {
+  Cluster cluster{
+      LocatorCount{1}, ServerCount{3},
+      CacheXMLFiles(
+          {std::string(getFrameworkString(FrameworkVariable::TestCacheXmlDir)) 
+
+               "/func_cacheserver1_pool_nonHA.xml",
+           std::string(getFrameworkString(FrameworkVariable::TestCacheXmlDir)) 
+
+               "/func_cacheserver2_pool_nonHA.xml",
+           std::string(getFrameworkString(FrameworkVariable::TestCacheXmlDir)) 
+
+               "/func_cacheserver3_pool_nonHA.xml"})};
+
+  cluster.start([&]() {
+    cluster.getGfsh()
+        .deploy()
+        .jar(getFrameworkString(FrameworkVariable::JavaObjectJarPath))
+        .execute();
+  });
+
+  auto cache = CacheFactory().create();
+  auto poolFactory = cache.getPoolManager().createFactory();
+
+  cluster.applyLocators(poolFactory);
+
+  auto pool =
+      poolFactory.setPRSingleHopEnabled(true).setRetryAttempts(0).create(
+          "pool");
+
+  auto region = cache.createRegionFactory(RegionShortcut::PROXY)
+                    .setPoolName("pool")
+                    .create("partition_region");
+
+  populateRegion(region);
+
+  for (int i = 0; i < 30; i++) {
+    auto functionService = FunctionService::onRegion(region);
+    auto rc =
+        functionService.withCollector(std::make_shared<TestResultCollector>())

Review comment:
       In this particular case, the client PR metadata will never contain all 
113 bucket locations, because `populateRegion` function will only trigger 
creation of some buckets on servers, and not all of them. Without the fix, the 
single hop function execution in this case would always fail with the exception 
`InternalFunctionInvocationTargetException` on servers. Client would then 
trigger `ResultCollector::clearResult` and re-execute function in a non single 
hop manner. So for now, I only checked that that re-execution is not triggered, 
by checking that `ResultCollector::clearResult` is never triggered.
   
   As you pointed out, maybe it should be good to expand the test case. Maybe 
this way:
   
   1. Populate region in a way that not all buckets on servers are created
   2. Check that client received partial PR metadata (some bucket locations are 
missing).
   3. Execute function and check that all data is received
   4. Repopulate region, so that now all buckets are created on servers
   5. Trigger PR metadata refresh (by executing function) and check that client 
received complete PR metadata (all buckets locations)
   6. Execute function again and check that all data is received
   
   What do you think about above case? Should I add or remove something?
   
   Additionally, I think that client should not try to `clearResult` and 
re-execute the function when function `isHA` is set to false, but immediately 
fail with the received exception. What do you think?
   
   Thanks for the review!




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscr...@geode.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


> InternalFunctionInvocationTargetException when executing single hop function 
> all buckets
> ----------------------------------------------------------------------------------------
>
>                 Key: GEODE-9576
>                 URL: https://issues.apache.org/jira/browse/GEODE-9576
>             Project: Geode
>          Issue Type: Bug
>          Components: native client
>            Reporter: Jakov Varenina
>            Assignee: Jakov Varenina
>            Priority: Major
>              Labels: pull-request-available
>
>  *InternalFunctionInvocationTargetException: Multiple target nodes found for 
> single hop operation* occurs on native client when executing function in a 
> single hop manner for all buckets during the period when client bucket 
> metadata doesn't contain all buckets locations.
> Java client in this case executes functions in non single hop manner until it 
> receives locations of all buckets on servers. The solution in native client 
> would be to implement the same handling as in java client.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to