You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ji...@apache.org on 2020/10/08 17:49:59 UTC
[geode] branch support/1.13 updated: GEODE-8574: ClusterManagementService should not throw ClassCastExcept… (#5596)
This is an automated email from the ASF dual-hosted git repository.
jinmeiliao pushed a commit to branch support/1.13
in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/support/1.13 by this push:
new 45d484b GEODE-8574: ClusterManagementService should not throw ClassCastExcept… (#5596)
45d484b is described below
commit 45d484b7808c9f290a9742aa7cc3feb0153a766b
Author: Jinmei Liao <ji...@pivotal.io>
AuthorDate: Wed Oct 7 11:05:28 2020 -0700
GEODE-8574: ClusterManagementService should not throw ClassCastExcept… (#5596)
(cherry picked from commit 73f6783b07f1151c1617978fb57822ade5b71414)
---
.../api/LocatorClusterManagementService.java | 54 ++++++++++++++--------
.../api/LocatorClusterManagementServiceTest.java | 24 ++++++++--
2 files changed, 54 insertions(+), 24 deletions(-)
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/api/LocatorClusterManagementService.java b/geode-core/src/main/java/org/apache/geode/management/internal/api/LocatorClusterManagementService.java
index 8561a20..3ada781 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/api/LocatorClusterManagementService.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/api/LocatorClusterManagementService.java
@@ -29,7 +29,6 @@ import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
@@ -206,13 +205,11 @@ public class LocatorClusterManagementService implements ClusterManagementService
ClusterManagementRealizationResult result = new ClusterManagementRealizationResult();
- // execute function on all targeted members
- List<RealizationResult> functionResults = executeAndGetFunctionResult(
- new CacheRealizationFunction(),
- config, CacheElementOperation.CREATE,
- targetedMembers);
-
- functionResults.forEach(result::addMemberStatus);
+ // execute function on all targeted members
+ List<RealizationResult> functionResults = executeCacheRealizationFunction(
+ config, CacheElementOperation.CREATE,
+ targetedMembers);
+ functionResults.forEach(result::addMemberStatus);
// if any false result is added to the member list
if (result.getStatusCode() != StatusCode.OK) {
@@ -305,11 +302,10 @@ public class LocatorClusterManagementService implements ClusterManagementService
// execute function on all members
ClusterManagementRealizationResult result = new ClusterManagementRealizationResult();
- List<RealizationResult> functionResults = executeAndGetFunctionResult(
- new CacheRealizationFunction(),
- config, CacheElementOperation.DELETE,
- memberValidator.findServers(groupsWithThisElement));
- functionResults.forEach(result::addMemberStatus);
+ List<RealizationResult> functionResults = executeCacheRealizationFunction(
+ config, CacheElementOperation.DELETE,
+ memberValidator.findServers(groupsWithThisElement));
+ functionResults.forEach(result::addMemberStatus);
// if any false result is added to the member list
if (result.getStatusCode() != StatusCode.OK) {
@@ -410,7 +406,7 @@ public class LocatorClusterManagementService implements ClusterManagementService
members = Collections.singleton(members.iterator().next());
}
- List<R> runtimeInfos = executeAndGetFunctionResult(new CacheRealizationFunction(),
+ List<R> runtimeInfos = executeCacheRealizationFunction(
element, CacheElementOperation.GET,
members);
response.setRuntimeInfo(runtimeInfos);
@@ -557,14 +553,15 @@ public class LocatorClusterManagementService implements ClusterManagementService
}
@VisibleForTesting
- <R> List<R> executeAndGetFunctionResult(Function function, AbstractConfiguration configuration,
+ <R> List<R> executeCacheRealizationFunction(AbstractConfiguration configuration,
CacheElementOperation operation,
Set<DistributedMember> targetMembers) {
if (targetMembers.size() == 0) {
return Collections.emptyList();
}
- List<R> results = new ArrayList();
+ Function function = new CacheRealizationFunction();
+
File file = null;
if (configuration instanceof HasFile) {
@@ -575,9 +572,8 @@ public class LocatorClusterManagementService implements ClusterManagementService
Execution execution = FunctionService.onMembers(targetMembers)
.setArguments(Arrays.asList(configuration, operation, null));
((AbstractExecution) execution).setIgnoreDepartedMembers(true);
- ResultCollector rc = execution.execute(function);
- return ((List<R>) rc.getResult()).stream().filter(Objects::nonNull)
- .collect(Collectors.toList());
+ List<?> functionResults = (List<?>) execution.execute(function).getResult();
+ return cleanResults(functionResults);
}
// if we have file arguments, we need to export the file input stream for each member
@@ -587,6 +583,7 @@ public class LocatorClusterManagementService implements ClusterManagementService
.getManagementAgent();
exporter = agent.getRemoteStreamExporter();
+ List<R> results = new ArrayList();
for (DistributedMember member : targetMembers) {
FileInputStream fileInputStream = null;
SimpleRemoteInputStream inputStream = null;
@@ -598,7 +595,8 @@ public class LocatorClusterManagementService implements ClusterManagementService
Execution execution = FunctionService.onMember(member)
.setArguments(Arrays.asList(configuration, operation, remoteInputStream));
((AbstractExecution) execution).setIgnoreDepartedMembers(true);
- results.add(((List<R>) execution.execute(function).getResult()).get(0));
+ List<R> functionResults = cleanResults((List<?>) execution.execute(function).getResult());
+ results.addAll(functionResults);
} catch (IOException e) {
raise(StatusCode.ILLEGAL_ARGUMENT, "Invalid file: " + file.getAbsolutePath());
} finally {
@@ -617,7 +615,23 @@ public class LocatorClusterManagementService implements ClusterManagementService
}
}
}
+ return results;
+ }
+ @VisibleForTesting
+ <R> List<R> cleanResults(List<?> functionResults) {
+ List<R> results = new ArrayList<>();
+ for (Object functionResult : functionResults) {
+ if (functionResult == null) {
+ continue;
+ }
+ if (functionResult instanceof Throwable) {
+ // log the exception and continue
+ logger.warn("Error executing CacheRealizationFunction.", (Throwable) functionResult);
+ continue;
+ }
+ results.add((R) functionResult);
+ }
return results;
}
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/api/LocatorClusterManagementServiceTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/api/LocatorClusterManagementServiceTest.java
index 003d442..37be687 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/api/LocatorClusterManagementServiceTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/api/LocatorClusterManagementServiceTest.java
@@ -50,6 +50,7 @@ import org.junit.Test;
import org.apache.geode.cache.configuration.CacheConfig;
import org.apache.geode.cache.configuration.GatewayReceiverConfig;
import org.apache.geode.cache.configuration.RegionConfig;
+import org.apache.geode.cache.execute.FunctionInvocationTargetException;
import org.apache.geode.distributed.DistributedMember;
import org.apache.geode.distributed.DistributedSystem;
import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
@@ -189,7 +190,7 @@ public class LocatorClusterManagementServiceTest {
functionResults.add(new RealizationResult().setMemberName("member1"));
functionResults.add(
new RealizationResult().setMemberName("member2").setSuccess(false).setMessage("failed"));
- doReturn(functionResults).when(service).executeAndGetFunctionResult(any(), any(), any(), any());
+ doReturn(functionResults).when(service).executeCacheRealizationFunction(any(), any(), any());
doReturn(Collections.singleton(mock(DistributedMember.class))).when(memberValidator)
.findServers();
@@ -205,7 +206,7 @@ public class LocatorClusterManagementServiceTest {
List<RealizationResult> functionResults = new ArrayList<>();
functionResults.add(new RealizationResult().setMemberName("member1"));
functionResults.add(new RealizationResult().setMemberName("member2"));
- doReturn(functionResults).when(service).executeAndGetFunctionResult(any(), any(), any(), any());
+ doReturn(functionResults).when(service).executeCacheRealizationFunction(any(), any(), any());
doReturn(Collections.singleton(mock(DistributedMember.class))).when(memberValidator)
.findServers();
@@ -308,7 +309,7 @@ public class LocatorClusterManagementServiceTest {
functionResults.add(new RealizationResult().setMemberName("member1"));
functionResults.add(
new RealizationResult().setMemberName("member2").setSuccess(false).setMessage("failed"));
- doReturn(functionResults).when(service).executeAndGetFunctionResult(any(), any(), any(), any());
+ doReturn(functionResults).when(service).executeCacheRealizationFunction(any(), any(), any());
doReturn(new String[] {"cluster"}).when(memberValidator).findGroupsWithThisElement(any(),
any());
@@ -336,7 +337,7 @@ public class LocatorClusterManagementServiceTest {
List<RealizationResult> functionResults = new ArrayList<>();
functionResults.add(new RealizationResult().setMemberName("member1"));
functionResults.add(new RealizationResult().setMemberName("member2"));
- doReturn(functionResults).when(service).executeAndGetFunctionResult(any(), any(), any(), any());
+ doReturn(functionResults).when(service).executeCacheRealizationFunction(any(), any(), any());
doReturn(new String[] {"cluster"}).when(memberValidator).findGroupsWithThisElement(any(),
any());
@@ -569,4 +570,19 @@ public class LocatorClusterManagementServiceTest {
assertThat(result.getStatusMessage()).isEqualTo(
"Successfully updated configuration for group1. Failed to update configuration for group2.");
}
+
+ @Test
+ public void cleanResultsShouldCleanOutExceptionsAndNull() throws Exception {
+ List functionResults = new ArrayList<>();
+ MemberInformation memberInfo = new MemberInformation();
+ memberInfo.setId("server-1");
+ functionResults.add(memberInfo);
+ functionResults.add(new FunctionInvocationTargetException("Not available"));
+ functionResults.add(null);
+
+ List<MemberInformation> results = service.cleanResults(functionResults);
+ assertThat(results).hasSize(1)
+ .extracting(MemberInformation::getId)
+ .containsExactly("server-1");
+ }
}