[ 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> ®ion) { + 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)