This is an automated email from the ASF dual-hosted git repository.

dschneider pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new ef533fa  GEODE-7825: improve rebalance result (#4803)
ef533fa is described below

commit ef533fa839455d3b720facb8487d8e8e1e56c089
Author: Darrel Schneider <[email protected]>
AuthorDate: Mon Mar 16 11:20:46 2020 -0700

    GEODE-7825: improve rebalance result (#4803)
    
    * the statusMessage will now also contain the name of the exception
    
    * OperationResult getSuccess and getStatusMessage are now used
    to set the status and message on ClusterManagementOperationResult.
    
    * Instead of throwing NoMembersException, the rebalance code
    now sets the statusMessage on the RebalanceResult like it
    already did for other exceptions. This will prevent a call
    stack from being displayed to users when no member is found
    to do the rebalance on.
---
 .../management/internal/BaseManagementService.java |  9 ++++
 .../api/LocatorClusterManagementService.java       |  9 +++-
 .../operation/RebalanceOperationPerformer.java     |  8 +--
 .../api/LocatorClusterManagementServiceTest.java   | 63 ++++++++++++++++++++--
 .../operation/RebalanceOperationPerformerTest.java | 19 +++++++
 5 files changed, 98 insertions(+), 10 deletions(-)

diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/BaseManagementService.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/BaseManagementService.java
index 71d6b0a..c3f538f 100755
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/BaseManagementService.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/BaseManagementService.java
@@ -21,6 +21,7 @@ import java.util.Map;
 
 import org.apache.logging.log4j.Logger;
 
+import org.apache.geode.annotations.VisibleForTesting;
 import org.apache.geode.annotations.internal.MakeNotStatic;
 import org.apache.geode.distributed.DistributedSystemDisconnectedException;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
@@ -85,6 +86,14 @@ public abstract class BaseManagementService extends 
ManagementService {
     }
   }
 
+  @VisibleForTesting
+  public static void setManagementService(InternalCacheForClientAccess cache,
+      BaseManagementService service) {
+    synchronized (instances) {
+      instances.put(cache, service);
+    }
+  }
+
   public static ManagementService getExistingManagementService(InternalCache 
cache) {
     synchronized (instances) {
       BaseManagementService service = 
instances.get(cache.getCacheForProcessingClientRequests());
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 546042f..55605ac 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
@@ -496,7 +496,14 @@ public class LocatorClusterManagementService implements 
ClusterManagementService
       resultStatus = StatusCode.IN_PROGRESS;
     } else if (operationState.getThrowable() != null) {
       resultStatus = StatusCode.ERROR;
-      resultMessage = operationState.getThrowable().getMessage();
+      resultMessage = operationState.getThrowable().toString();
+    } else if (operationState.getResult() != null) {
+      if (!operationState.getResult().getSuccess()) {
+        resultStatus = StatusCode.ERROR;
+      }
+      if (operationState.getResult().getStatusMessage() != null) {
+        resultMessage = operationState.getResult().getStatusMessage();
+      }
     }
     return toClusterManagementOperationResult(resultStatus, resultMessage, 
operationState);
   }
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/operation/RebalanceOperationPerformer.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/operation/RebalanceOperationPerformer.java
index f9e8463..ff14555 100644
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/operation/RebalanceOperationPerformer.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/operation/RebalanceOperationPerformer.java
@@ -62,7 +62,7 @@ public class RebalanceOperationPerformer {
 
       List<RebalanceRegionResult> rebalanceRegionResults = new ArrayList<>();
 
-      RuntimeException latestNoMembersException = null;
+      NoMembersException latestNoMembersException = null;
 
       for (String regionName : includeRegions) {
 
@@ -82,11 +82,11 @@ public class RebalanceOperationPerformer {
       }
 
       if (latestNoMembersException != null && !result.getSuccess()) {
-        throw latestNoMembersException;
+        result.setStatusMessage(latestNoMembersException.getMessage());
+      } else {
+        result.setRebalanceSummary(rebalanceRegionResults);
       }
 
-      result.setRebalanceSummary(rebalanceRegionResults);
-
       return result;
     } else {
       result =
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 3120ce2..5a6f543 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
@@ -95,7 +95,7 @@ public class LocatorClusterManagementServiceTest {
   private ClusterManagementResult result;
   private Map<Class, ConfigurationValidator> validators = new HashMap<>();
   private Map<Class, ConfigurationManager> managers = new HashMap<>();
-  private OperationManager executorManager;
+  private OperationManager operationManager;
   private ConfigurationValidator<Region> regionValidator;
   private CommonConfigurationValidator cacheElementValidator;
   private CacheConfigurationManager<Region> regionManager;
@@ -124,10 +124,10 @@ public class LocatorClusterManagementServiceTest {
     doReturn(new CacheConfig()).when(persistenceService).getCacheConfig(any(), 
anyBoolean());
     doReturn(true).when(persistenceService).lockSharedConfiguration();
     doNothing().when(persistenceService).unlockSharedConfiguration();
-    executorManager = mock(OperationManager.class);
+    operationManager = mock(OperationManager.class);
     service =
         spy(new LocatorClusterManagementService(cache, persistenceService, 
managers, validators,
-            memberValidator, cacheElementValidator, executorManager));
+            memberValidator, cacheElementValidator, operationManager));
 
     regionConfig = new Region();
     regionConfig.setName("region1");
@@ -373,7 +373,7 @@ public class LocatorClusterManagementServiceTest {
     final String URI = "/test/uri";
     ClusterManagementOperation<OperationResult> operation = 
mock(ClusterManagementOperation.class);
     when(operation.getEndpoint()).thenReturn(URI);
-    when(executorManager.submit(any()))
+    when(operationManager.submit(any()))
         .thenReturn(new OperationState<>("42", operation, new Date()));
     ClusterManagementOperationResult<?, ?> result = service.start(operation);
     
assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.ACCEPTED);
@@ -389,7 +389,7 @@ public class LocatorClusterManagementServiceTest {
   @Test
   public void getRebalance() {
     OperationState operationState = mock(OperationState.class);
-    when(executorManager.get(any())).thenReturn(operationState);
+    when(operationManager.get(any())).thenReturn(operationState);
     ClusterManagementOperationResult<RebalanceOperation, RebalanceResult> 
result =
         service.get(rebalanceOperation, "456");
     
assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.IN_PROGRESS);
@@ -401,6 +401,59 @@ public class LocatorClusterManagementServiceTest {
   }
 
   @Test
+  public void 
getRebalanceWithOperationStateThrowableCorrectlySetsStatusMessage() {
+    OperationState operationState = mock(OperationState.class);
+    when(operationManager.get(any())).thenReturn(operationState);
+    when(operationState.getOperationEnd()).thenReturn(new Date());
+    Throwable throwable = new NullPointerException("NPE");
+    when(operationState.getThrowable()).thenReturn(throwable);
+
+    ClusterManagementOperationResult<RebalanceOperation, RebalanceResult> 
result =
+        service.get(rebalanceOperation, "456");
+
+    
assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.ERROR);
+    assertThat(result.getOperationResult()).isNull();
+    assertThat(result.getThrowable()).isSameAs(throwable);
+    
assertThat(result.getStatusMessage()).contains("NPE").contains("NullPointerException");
+  }
+
+  @Test
+  public void 
getRebalanceWithOperationResultThatFailedCorrectlySetsStatusMessage() {
+    OperationState operationState = mock(OperationState.class);
+    when(operationManager.get(any())).thenReturn(operationState);
+    when(operationState.getOperationEnd()).thenReturn(new Date());
+    OperationResult operationResult = mock(OperationResult.class);
+    when(operationResult.getSuccess()).thenReturn(false);
+    when(operationResult.getStatusMessage()).thenReturn("Failure status 
message.");
+    when(operationState.getResult()).thenReturn(operationResult);
+
+    ClusterManagementOperationResult<RebalanceOperation, RebalanceResult> 
result =
+        service.get(rebalanceOperation, "456");
+
+    
assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.ERROR);
+    assertThat(result.getOperationResult()).isSameAs(operationResult);
+    assertThat(result.getStatusMessage()).isEqualTo("Failure status message.");
+  }
+
+  @Test
+  public void 
getRebalanceWithOperationResultThatSucceededCorrectlySetsStatusMessage() {
+    OperationState operationState = mock(OperationState.class);
+    when(operationManager.get(any())).thenReturn(operationState);
+    when(operationState.getOperationEnd()).thenReturn(new Date());
+    OperationResult operationResult = mock(OperationResult.class);
+    when(operationResult.getSuccess()).thenReturn(true);
+    when(operationResult.getStatusMessage()).thenReturn("Success status 
message.");
+    when(operationState.getResult()).thenReturn(operationResult);
+
+    ClusterManagementOperationResult<RebalanceOperation, RebalanceResult> 
result =
+        service.get(rebalanceOperation, "456");
+
+    
assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.OK);
+    assertThat(result.getOperationResult()).isSameAs(operationResult);
+    assertThat(result.getStatusMessage()).isEqualTo("Success status message.");
+  }
+
+  @Test
   public void getRuntimeClass() {
     assertSoftly(softly -> {
       
softly.assertThat(service.getRuntimeClass(Region.class)).isEqualTo(RuntimeRegionInfo.class);
diff --git 
a/geode-core/src/test/java/org/apache/geode/management/internal/operation/RebalanceOperationPerformerTest.java
 
b/geode-core/src/test/java/org/apache/geode/management/internal/operation/RebalanceOperationPerformerTest.java
index 29f9856..baef301 100644
--- 
a/geode-core/src/test/java/org/apache/geode/management/internal/operation/RebalanceOperationPerformerTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/management/internal/operation/RebalanceOperationPerformerTest.java
@@ -33,9 +33,12 @@ import 
org.apache.geode.distributed.internal.DistributionManager;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import 
org.apache.geode.distributed.internal.membership.InternalDistributedMember;
 import org.apache.geode.internal.cache.InternalCache;
+import org.apache.geode.internal.cache.InternalCacheForClientAccess;
 import org.apache.geode.management.DistributedRegionMXBean;
 import org.apache.geode.management.DistributedSystemMXBean;
 import org.apache.geode.management.ManagementService;
+import org.apache.geode.management.internal.BaseManagementService;
+import org.apache.geode.management.operation.RebalanceOperation;
 import org.apache.geode.management.runtime.RebalanceRegionResult;
 import org.apache.geode.management.runtime.RebalanceResult;
 
@@ -143,7 +146,23 @@ public class RebalanceOperationPerformerTest {
     
assertThat(regionResult.getPrimaryTransferTimeInMilliseconds()).isEqualTo(6);
     assertThat(regionResult.getPrimaryTransfersCompleted()).isEqualTo(7);
     assertThat(regionResult.getTimeInMilliseconds()).isEqualTo(8);
+  }
+
+
+  @Test
+  public void 
performWithIncludeRegionsWhenRegionOnNoMembersReturnsFalseWithCorrectMessage() {
+    RebalanceOperation rebalanceOperation = mock(RebalanceOperation.class);
+    
when(rebalanceOperation.getIncludeRegions()).thenReturn(Collections.singletonList("region1"));
+    InternalCacheForClientAccess cache = 
mock(InternalCacheForClientAccess.class);
+    when(cache.getCacheForProcessingClientRequests()).thenReturn(cache);
+    BaseManagementService managementService = 
mock(BaseManagementService.class);
+    BaseManagementService.setManagementService(cache, managementService);
+
+    RebalanceResult result = RebalanceOperationPerformer.perform(cache, 
rebalanceOperation);
 
+    assertThat(result.getSuccess()).isFalse();
+    assertThat(result.getStatusMessage())
+        .isEqualTo("For the region /region1, no member was found.");
   }
 
 }

Reply via email to