You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ud...@apache.org on 2020/07/02 18:10:43 UTC

[geode] 07/29: GEODE-8095 Further rework of the RestoreRedundancy data objects for serialization (#5281)

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

udo pushed a commit to branch feature/GEODE-8294
in repository https://gitbox.apache.org/repos/asf/geode.git

commit 0163bca9fafe7b43bad47890e87e3b62facc99f9
Author: mhansonp <ha...@vmware.com>
AuthorDate: Wed Jun 24 14:25:34 2020 -0700

    GEODE-8095 Further rework of the RestoreRedundancy data objects for serialization (#5281)
    
    * Converting a Duration to a Long because of Serialization
    * Changes for per requests
---
 .../RestoreRedundancyOperationDUnitTest.java       |   4 +-
 .../codeAnalysis/sanctionedDataSerializables.txt   |   4 +-
 .../SerializableRestoreRedundancyResultsImpl.java  |  16 +--
 ...rializableRestoreRedundancyResultsImplTest.java |  98 ++++++++++++-------
 .../internal/cli/commands/RedundancyCommand.java   |   2 +-
 .../operation/RegionRedundancyStatusImpl.java      |  16 +++
 .../operation/RestoreRedundancyResultsImpl.java    | 108 +++++++++++++--------
 .../operation/RestoreRedundancyRequest.java        |   2 +-
 .../management/runtime/RegionRedundancyStatus.java |   6 +-
 .../runtime/RestoreRedundancyResults.java          |   9 +-
 .../sanctioned-geode-management-serializables.txt  |   3 +-
 11 files changed, 178 insertions(+), 90 deletions(-)

diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/control/RestoreRedundancyOperationDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/control/RestoreRedundancyOperationDUnitTest.java
index d7c1d4b..9722461 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/control/RestoreRedundancyOperationDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/control/RestoreRedundancyOperationDUnitTest.java
@@ -123,7 +123,7 @@ public class RestoreRedundancyOperationDUnitTest {
       RestoreRedundancyResults results = restoreRedundancyAndGetResults(null, null, true);
       assertThat(results.getRegionOperationStatus(), is(SUCCESS));
       assertThat(results.getTotalPrimaryTransfersCompleted() > 0, is(true));
-      assertThat(results.getTotalPrimaryTransferTime().toMillis() > 0, is(true));
+      assertThat(results.getTotalPrimaryTransferTime() > 0, is(true));
       assertThat(results.getRegionResult(PARENT_REGION_NAME).getStatus(), is(SATISFIED));
       assertThat(results.getRegionResult(CHILD_REGION_NAME).getStatus(), is(SATISFIED));
       assertThat(results.getRegionResult(LOW_REDUNDANCY_REGION_NAME).getStatus(), is(SATISFIED));
@@ -146,7 +146,7 @@ public class RestoreRedundancyOperationDUnitTest {
 
       assertThat(results.getRegionOperationStatus(), is(SUCCESS));
       assertThat(results.getTotalPrimaryTransfersCompleted(), is(0));
-      assertThat(results.getTotalPrimaryTransferTime().toMillis(), is(0L));
+      assertThat(results.getTotalPrimaryTransferTime(), is(0L));
       assertThat(results.getRegionResult(PARENT_REGION_NAME).getStatus(), is(SATISFIED));
       assertThat(results.getRegionResult(CHILD_REGION_NAME).getStatus(), is(SATISFIED));
       assertThat(results.getRegionResult(LOW_REDUNDANCY_REGION_NAME).getStatus(), is(SATISFIED));
diff --git a/geode-core/src/integrationTest/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt b/geode-core/src/integrationTest/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt
index b613fa18..1494988 100644
--- a/geode-core/src/integrationTest/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt
+++ b/geode-core/src/integrationTest/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt
@@ -1368,8 +1368,8 @@ fromData,42
 toData,37
 
 org/apache/geode/internal/cache/control/SerializableRestoreRedundancyResultsImpl,2
-fromData,65
-toData,61
+fromData,68
+toData,64
 
 org/apache/geode/internal/cache/event/EventSequenceNumberHolder,2
 fromData,22
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/control/SerializableRestoreRedundancyResultsImpl.java b/geode-core/src/main/java/org/apache/geode/internal/cache/control/SerializableRestoreRedundancyResultsImpl.java
index e02d8a4..c9f80f0 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/control/SerializableRestoreRedundancyResultsImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/control/SerializableRestoreRedundancyResultsImpl.java
@@ -38,8 +38,8 @@ public class SerializableRestoreRedundancyResultsImpl
 
   public void addPrimaryReassignmentDetails(PartitionRebalanceInfo details) {
     totalPrimaryTransfersCompleted += details.getPrimaryTransfersCompleted();
-    totalPrimaryTransferTime =
-        totalPrimaryTransferTime.plusMillis(details.getPrimaryTransferTime());
+    totalPrimaryTransferTime += details.getPrimaryTransferTime();
+
   }
 
   @Override
@@ -49,9 +49,9 @@ public class SerializableRestoreRedundancyResultsImpl
 
   @Override
   public void toData(DataOutput out, SerializationContext context) throws IOException {
-    DataSerializer.writeHashMap(satisfiedRedundancyRegions, out);
-    DataSerializer.writeHashMap(underRedundancyRegions, out);
-    DataSerializer.writeHashMap(zeroRedundancyRegions, out);
+    DataSerializer.writeHashMap(satisfiedRedundancyRegionsResults, out);
+    DataSerializer.writeHashMap(underRedundancyRegionsResults, out);
+    DataSerializer.writeHashMap(zeroRedundancyRegionsResults, out);
     out.writeInt(totalPrimaryTransfersCompleted);
     DataSerializer.writeObject(totalPrimaryTransferTime, out);
     out.writeBoolean(success);
@@ -61,9 +61,9 @@ public class SerializableRestoreRedundancyResultsImpl
   @Override
   public void fromData(DataInput in, DeserializationContext context)
       throws IOException, ClassNotFoundException {
-    satisfiedRedundancyRegions = DataSerializer.readHashMap(in);
-    underRedundancyRegions = DataSerializer.readHashMap(in);
-    zeroRedundancyRegions = DataSerializer.readHashMap(in);
+    satisfiedRedundancyRegionsResults = DataSerializer.readHashMap(in);
+    underRedundancyRegionsResults = DataSerializer.readHashMap(in);
+    zeroRedundancyRegionsResults = DataSerializer.readHashMap(in);
     totalPrimaryTransfersCompleted = in.readInt();
     totalPrimaryTransferTime = DataSerializer.readObject(in);
     success = DataSerializer.readBoolean(in);
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/control/SerializableRestoreRedundancyResultsImplTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/control/SerializableRestoreRedundancyResultsImplTest.java
index 7d7088f..473ee30 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/control/SerializableRestoreRedundancyResultsImplTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/control/SerializableRestoreRedundancyResultsImplTest.java
@@ -24,26 +24,29 @@ import static org.apache.geode.management.runtime.RegionRedundancyStatus.Redunda
 import static org.apache.geode.management.runtime.RegionRedundancyStatus.RedundancyStatus.SATISFIED;
 import static org.apache.geode.management.runtime.RestoreRedundancyResults.Status.FAILURE;
 import static org.apache.geode.management.runtime.RestoreRedundancyResults.Status.SUCCESS;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
-import static org.junit.Assert.assertThat;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import java.time.Duration;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.geode.cache.partition.PartitionRebalanceInfo;
+import org.apache.geode.management.internal.operation.RegionRedundancyStatusImpl;
+import org.apache.geode.management.internal.operation.RestoreRedundancyResultsImpl;
 import org.apache.geode.management.runtime.RegionRedundancyStatus;
 import org.apache.geode.management.runtime.RestoreRedundancyResults;
+import org.apache.geode.util.internal.GeodeJsonMapper;
 
 public class SerializableRestoreRedundancyResultsImplTest {
+  public static final String TEST_STRING = "Test";
   private final RegionRedundancyStatus successfulRegionResult =
       mock(SerializableRegionRedundancyStatusImpl.class);
   private final String successfulRegionName = "successfulRegion";
@@ -57,6 +60,7 @@ public class SerializableRestoreRedundancyResultsImplTest {
   private final int transfersCompleted = 5;
   private final long transferTime = 1234;
   private SerializableRestoreRedundancyResultsImpl results;
+  private final ObjectMapper geodeMapper = GeodeJsonMapper.getMapper();
 
   @Before
   public void setUp() {
@@ -74,14 +78,14 @@ public class SerializableRestoreRedundancyResultsImplTest {
   @Test
   public void initialStateIsSuccess() {
     results = new SerializableRestoreRedundancyResultsImpl();
-    assertThat(results.getRegionOperationStatus(), is(SUCCESS));
+    assertThat(results.getRegionOperationStatus()).isEqualTo(SUCCESS);
   }
 
   @Test
   public void getStatusReturnsSuccessWhenAllRegionsHaveFullySatisfiedRedundancy() {
     results.addRegionResult(successfulRegionResult);
 
-    assertThat(results.getRegionOperationStatus(), is(SUCCESS));
+    assertThat(results.getRegionOperationStatus()).isEqualTo(SUCCESS);
   }
 
   @Test
@@ -89,7 +93,7 @@ public class SerializableRestoreRedundancyResultsImplTest {
     results.addRegionResult(successfulRegionResult);
     results.addRegionResult(underRedundancyRegionResult);
 
-    assertThat(results.getRegionOperationStatus(), is(FAILURE));
+    assertThat(results.getRegionOperationStatus()).isEqualTo(FAILURE);
   }
 
   @Test
@@ -97,7 +101,7 @@ public class SerializableRestoreRedundancyResultsImplTest {
     results.addRegionResult(successfulRegionResult);
     results.addRegionResult(zeroRedundancyRegionResult);
 
-    assertThat(results.getRegionOperationStatus(), is(FAILURE));
+    assertThat(results.getRegionOperationStatus()).isEqualTo(FAILURE);
   }
 
   @Test
@@ -110,14 +114,14 @@ public class SerializableRestoreRedundancyResultsImplTest {
     String message = results.getRegionOperationMessage();
     List<String> messageLines = Arrays.asList(message.split(System.lineSeparator()));
 
-    assertThat(messageLines, contains(NO_REDUNDANT_COPIES_FOR_REGIONS,
+    assertThat(messageLines).contains(NO_REDUNDANT_COPIES_FOR_REGIONS,
         zeroRedundancyRegionResult.toString(),
         REDUNDANCY_NOT_SATISFIED_FOR_REGIONS,
         underRedundancyRegionResult.toString(),
         REDUNDANCY_SATISFIED_FOR_REGIONS,
         successfulRegionResult.toString(),
         PRIMARY_TRANSFERS_COMPLETED + transfersCompleted,
-        PRIMARY_TRANSFER_TIME + transferTime));
+        PRIMARY_TRANSFER_TIME + transferTime);
   }
 
   @Test
@@ -128,19 +132,20 @@ public class SerializableRestoreRedundancyResultsImplTest {
 
     Map<String, RegionRedundancyStatus> zeroRedundancyResults =
         results.getZeroRedundancyRegionResults();
-    assertThat(zeroRedundancyResults.size(), is(1));
-    assertThat(zeroRedundancyResults.get(zeroRedundancyRegionName), is(zeroRedundancyRegionResult));
+    assertThat(zeroRedundancyResults.size()).isEqualTo(1);
+    assertThat(zeroRedundancyResults.get(zeroRedundancyRegionName))
+        .isEqualTo(zeroRedundancyRegionResult);
 
     Map<String, RegionRedundancyStatus> underRedundancyResults =
         results.getUnderRedundancyRegionResults();
-    assertThat(underRedundancyResults.size(), is(1));
-    assertThat(underRedundancyResults.get(underRedundancyRegionName),
-        is(underRedundancyRegionResult));
+    assertThat(underRedundancyResults.size()).isEqualTo(1);
+    assertThat(underRedundancyResults.get(underRedundancyRegionName))
+        .isEqualTo(underRedundancyRegionResult);
 
     Map<String, RegionRedundancyStatus> successfulRegionResults =
         results.getSatisfiedRedundancyRegionResults();
-    assertThat(successfulRegionResults.size(), is(1));
-    assertThat(successfulRegionResults.get(successfulRegionName), is(successfulRegionResult));
+    assertThat(successfulRegionResults.size()).isEqualTo(1);
+    assertThat(successfulRegionResults.get(successfulRegionName)).isEqualTo(successfulRegionResult);
   }
 
   @Test
@@ -153,39 +158,66 @@ public class SerializableRestoreRedundancyResultsImplTest {
     when(regionResults.getSatisfiedRedundancyRegionResults())
         .thenReturn(Collections.singletonMap(successfulRegionName, successfulRegionResult));
     when(regionResults.getTotalPrimaryTransfersCompleted()).thenReturn(transfersCompleted);
-    when(regionResults.getTotalPrimaryTransferTime()).thenReturn(Duration.ofMillis(transferTime));
+    when(regionResults.getTotalPrimaryTransferTime()).thenReturn(transferTime);
 
     results.addRegionResults(regionResults);
 
     Map<String, RegionRedundancyStatus> zeroRedundancyResults =
         results.getZeroRedundancyRegionResults();
-    assertThat(zeroRedundancyResults.size(), is(1));
-    assertThat(zeroRedundancyResults.get(zeroRedundancyRegionName), is(zeroRedundancyRegionResult));
+    assertThat(zeroRedundancyResults.size()).isEqualTo(1);
+    assertThat(zeroRedundancyResults.get(zeroRedundancyRegionName))
+        .isEqualTo(zeroRedundancyRegionResult);
 
     Map<String, RegionRedundancyStatus> underRedundancyResults =
         results.getUnderRedundancyRegionResults();
-    assertThat(underRedundancyResults.size(), is(1));
-    assertThat(underRedundancyResults.get(underRedundancyRegionName),
-        is(underRedundancyRegionResult));
+    assertThat(underRedundancyResults.size()).isEqualTo(1);
+    assertThat(underRedundancyResults.get(underRedundancyRegionName))
+        .isEqualTo(underRedundancyRegionResult);
 
     Map<String, RegionRedundancyStatus> successfulRegionResults =
         results.getSatisfiedRedundancyRegionResults();
-    assertThat(successfulRegionResults.size(), is(1));
-    assertThat(successfulRegionResults.get(successfulRegionName), is(successfulRegionResult));
+    assertThat(successfulRegionResults.size()).isEqualTo(1);
+    assertThat(successfulRegionResults.get(successfulRegionName)).isEqualTo(successfulRegionResult);
 
-    assertThat(results.getTotalPrimaryTransfersCompleted(), is(transfersCompleted));
-    assertThat(results.getTotalPrimaryTransferTime().toMillis(), is(transferTime));
+    assertThat(results.getTotalPrimaryTransfersCompleted()).isEqualTo(transfersCompleted);
+    assertThat(results.getTotalPrimaryTransferTime()).isEqualTo(transferTime);
   }
 
   @Test
   public void addPrimaryDetailsUpdatesValue() {
-    assertThat(results.getTotalPrimaryTransfersCompleted(), is(0));
-    assertThat(results.getTotalPrimaryTransferTime().toMillis(), is(0L));
+    assertThat(results.getTotalPrimaryTransfersCompleted()).isEqualTo(0);
+    assertThat(results.getTotalPrimaryTransferTime()).isEqualTo(0L);
     results.addPrimaryReassignmentDetails(details);
-    assertThat(results.getTotalPrimaryTransfersCompleted(), is(transfersCompleted));
-    assertThat(results.getTotalPrimaryTransferTime().toMillis(), is(transferTime));
+    assertThat(results.getTotalPrimaryTransfersCompleted()).isEqualTo(transfersCompleted);
+    assertThat(results.getTotalPrimaryTransferTime()).isEqualTo(transferTime);
     results.addPrimaryReassignmentDetails(details);
-    assertThat(results.getTotalPrimaryTransfersCompleted(), is(transfersCompleted * 2));
-    assertThat(results.getTotalPrimaryTransferTime().toMillis(), is(transferTime * 2));
+    assertThat(results.getTotalPrimaryTransfersCompleted()).isEqualTo(transfersCompleted * 2);
+    assertThat(results.getTotalPrimaryTransferTime()).isEqualTo(transferTime * 2);
+  }
+
+  @Test
+  public void testSerializable() throws JsonProcessingException {
+
+    RestoreRedundancyResultsImpl restoreRedundancyResults = new RestoreRedundancyResultsImpl();
+    restoreRedundancyResults.setStatusMessage(TEST_STRING);
+    restoreRedundancyResults.setSuccess(true);
+    restoreRedundancyResults.setTotalPrimaryTransfersCompleted(150);
+    restoreRedundancyResults.setTotalPrimaryTransferTime(250);
+    RegionRedundancyStatusImpl regionRedundancyStatus = new RegionRedundancyStatusImpl();
+    regionRedundancyStatus.setActualRedundancy(1);
+    regionRedundancyStatus.setConfiguredRedundancy(1);
+    regionRedundancyStatus.setRegionName("/foo");
+    regionRedundancyStatus.setStatus(SATISFIED);
+    restoreRedundancyResults.addRegionResult(regionRedundancyStatus);
+    String jsonString = geodeMapper.writeValueAsString(restoreRedundancyResults);
+    // deserialize the class
+
+
+    RestoreRedundancyResultsImpl value =
+        geodeMapper.readValue(jsonString, RestoreRedundancyResultsImpl.class);
+
+    assertThat(value).usingRecursiveComparison().isEqualTo(restoreRedundancyResults);
+
+
   }
 }
diff --git a/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/RedundancyCommand.java b/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/RedundancyCommand.java
index cc14e12..edfd115 100644
--- a/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/RedundancyCommand.java
+++ b/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/RedundancyCommand.java
@@ -238,7 +238,7 @@ public class RedundancyCommand extends GfshCommand {
     primaries
         .addLine(PRIMARY_TRANSFERS_COMPLETED + resultCollector.getTotalPrimaryTransfersCompleted());
     primaries
-        .addLine(PRIMARY_TRANSFER_TIME + resultCollector.getTotalPrimaryTransferTime().toMillis());
+        .addLine(PRIMARY_TRANSFER_TIME + resultCollector.getTotalPrimaryTransferTime());
   }
 
   // Extracted for testing
diff --git a/geode-management/src/main/java/org/apache/geode/management/internal/operation/RegionRedundancyStatusImpl.java b/geode-management/src/main/java/org/apache/geode/management/internal/operation/RegionRedundancyStatusImpl.java
index 7295fa8..0f0c2c40 100644
--- a/geode-management/src/main/java/org/apache/geode/management/internal/operation/RegionRedundancyStatusImpl.java
+++ b/geode-management/src/main/java/org/apache/geode/management/internal/operation/RegionRedundancyStatusImpl.java
@@ -45,6 +45,22 @@ public class RegionRedundancyStatusImpl implements RegionRedundancyStatus {
    */
   protected RedundancyStatus status;
 
+  public void setRegionName(String regionName) {
+    this.regionName = regionName;
+  }
+
+  public void setConfiguredRedundancy(int configuredRedundancy) {
+    this.configuredRedundancy = configuredRedundancy;
+  }
+
+  public void setActualRedundancy(int actualRedundancy) {
+    this.actualRedundancy = actualRedundancy;
+  }
+
+  public void setStatus(RedundancyStatus status) {
+    this.status = status;
+  }
+
   /**
    * Default constructor used for serialization
    */
diff --git a/geode-management/src/main/java/org/apache/geode/management/internal/operation/RestoreRedundancyResultsImpl.java b/geode-management/src/main/java/org/apache/geode/management/internal/operation/RestoreRedundancyResultsImpl.java
index da49afc..a744f4d 100644
--- a/geode-management/src/main/java/org/apache/geode/management/internal/operation/RestoreRedundancyResultsImpl.java
+++ b/geode-management/src/main/java/org/apache/geode/management/internal/operation/RestoreRedundancyResultsImpl.java
@@ -14,7 +14,6 @@
  */
 package org.apache.geode.management.internal.operation;
 
-import java.time.Duration;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -38,24 +37,54 @@ public class RestoreRedundancyResultsImpl implements RestoreRedundancyResults {
   public static final String PRIMARY_TRANSFER_TIME = "Total primary transfer time (ms) = ";
   private static final long serialVersionUID = -1174735246756963521L;
 
-  protected Map<String, RegionRedundancyStatus> zeroRedundancyRegions = new HashMap<>();
-  protected Map<String, RegionRedundancyStatus> underRedundancyRegions = new HashMap<>();
-  protected Map<String, RegionRedundancyStatus> satisfiedRedundancyRegions = new HashMap<>();
+  protected Map<String, RegionRedundancyStatus> zeroRedundancyRegionsResults = new HashMap<>();
+  protected Map<String, RegionRedundancyStatus> underRedundancyRegionsResults = new HashMap<>();
+  protected Map<String, RegionRedundancyStatus> satisfiedRedundancyRegionsResults = new HashMap<>();
 
   protected int totalPrimaryTransfersCompleted;
-  protected Duration totalPrimaryTransferTime = Duration.ZERO;
+  protected long totalPrimaryTransferTime = 0;
   protected boolean success = true;
   protected String statusMessage;
   protected final List<String> includedRegionsWithNoMembers = new ArrayList<>();
+  private RegionRedundancyStatus regionResult;
+
+  public void setZeroRedundancyRegionsResults(
+      Map<String, RegionRedundancyStatus> zeroRedundancyRegionsResults) {
+    this.zeroRedundancyRegionsResults = zeroRedundancyRegionsResults;
+  }
+
+  public void setUnderRedundancyRegionsResults(
+      Map<String, RegionRedundancyStatus> underRedundancyRegionsResults) {
+    this.underRedundancyRegionsResults = underRedundancyRegionsResults;
+  }
+
+  public void setSatisfiedRedundancyRegionsResults(
+      Map<String, RegionRedundancyStatus> satisfiedRedundancyRegionsResults) {
+    this.satisfiedRedundancyRegionsResults = satisfiedRedundancyRegionsResults;
+  }
+
+  public void setTotalPrimaryTransfersCompleted(int totalPrimaryTransfersCompleted) {
+    this.totalPrimaryTransfersCompleted = totalPrimaryTransfersCompleted;
+  }
+
+  public void setTotalPrimaryTransferTime(long totalPrimaryTransferTime) {
+    this.totalPrimaryTransferTime = totalPrimaryTransferTime;
+  }
+
+  public void setRegionResult(RegionRedundancyStatus regionResult) {
+    this.regionResult = regionResult;
+  }
+
+
+  public RestoreRedundancyResultsImpl() {}
 
 
   public void addRegionResults(RestoreRedundancyResults results) {
-    satisfiedRedundancyRegions.putAll(results.getSatisfiedRedundancyRegionResults());
-    underRedundancyRegions.putAll(results.getUnderRedundancyRegionResults());
-    zeroRedundancyRegions.putAll(results.getZeroRedundancyRegionResults());
+    satisfiedRedundancyRegionsResults.putAll(results.getSatisfiedRedundancyRegionResults());
+    underRedundancyRegionsResults.putAll(results.getUnderRedundancyRegionResults());
+    zeroRedundancyRegionsResults.putAll(results.getZeroRedundancyRegionResults());
     totalPrimaryTransfersCompleted += results.getTotalPrimaryTransfersCompleted();
-    totalPrimaryTransferTime =
-        totalPrimaryTransferTime.plus(results.getTotalPrimaryTransferTime());
+    totalPrimaryTransferTime += results.getTotalPrimaryTransferTime();
   }
 
   public void addRegionResult(RegionRedundancyStatus regionResult) {
@@ -66,21 +95,21 @@ public class RestoreRedundancyResultsImpl implements RestoreRedundancyResults {
   private void addToFilteredMaps(RegionRedundancyStatus regionResult) {
     switch (regionResult.getStatus()) {
       case NO_REDUNDANT_COPIES:
-        zeroRedundancyRegions.put(regionResult.getRegionName(), regionResult);
+        zeroRedundancyRegionsResults.put(regionResult.getRegionName(), regionResult);
         break;
       case NOT_SATISFIED:
-        underRedundancyRegions.put(regionResult.getRegionName(), regionResult);
+        underRedundancyRegionsResults.put(regionResult.getRegionName(), regionResult);
         break;
       case SATISFIED:
-        satisfiedRedundancyRegions.put(regionResult.getRegionName(), regionResult);
+        satisfiedRedundancyRegionsResults.put(regionResult.getRegionName(), regionResult);
         break;
     }
   }
 
   @Override
   public Status getRegionOperationStatus() {
-    boolean fullySatisfied = zeroRedundancyRegions.isEmpty() && underRedundancyRegions.isEmpty();
-
+    boolean fullySatisfied =
+        zeroRedundancyRegionsResults.isEmpty() && underRedundancyRegionsResults.isEmpty();
     return fullySatisfied ? Status.SUCCESS : Status.FAILURE;
   }
 
@@ -89,23 +118,26 @@ public class RestoreRedundancyResultsImpl implements RestoreRedundancyResults {
     List<String> messages = new ArrayList<>();
 
     // List regions with redundancy configured but no redundant copies first
-    if (!zeroRedundancyRegions.isEmpty()) {
-      messages.add(getResultsMessage(zeroRedundancyRegions, NO_REDUNDANT_COPIES_FOR_REGIONS));
+    if (!zeroRedundancyRegionsResults.isEmpty()) {
+      messages
+          .add(getResultsMessage(zeroRedundancyRegionsResults, NO_REDUNDANT_COPIES_FOR_REGIONS));
     }
 
     // List failures
-    if (!underRedundancyRegions.isEmpty()) {
-      messages.add(getResultsMessage(underRedundancyRegions, REDUNDANCY_NOT_SATISFIED_FOR_REGIONS));
+    if (!underRedundancyRegionsResults.isEmpty()) {
+      messages.add(
+          getResultsMessage(underRedundancyRegionsResults, REDUNDANCY_NOT_SATISFIED_FOR_REGIONS));
     }
 
     // List successes
-    if (!satisfiedRedundancyRegions.isEmpty()) {
-      messages.add(getResultsMessage(satisfiedRedundancyRegions, REDUNDANCY_SATISFIED_FOR_REGIONS));
+    if (!satisfiedRedundancyRegionsResults.isEmpty()) {
+      messages.add(
+          getResultsMessage(satisfiedRedundancyRegionsResults, REDUNDANCY_SATISFIED_FOR_REGIONS));
     }
 
     // Add info about primaries
     messages.add(PRIMARY_TRANSFERS_COMPLETED + totalPrimaryTransfersCompleted);
-    messages.add(PRIMARY_TRANSFER_TIME + totalPrimaryTransferTime.toMillis());
+    messages.add(PRIMARY_TRANSFER_TIME + totalPrimaryTransferTime);
 
     return String.join(System.lineSeparator(), messages);
   }
@@ -120,37 +152,37 @@ public class RestoreRedundancyResultsImpl implements RestoreRedundancyResults {
 
   @Override
   public RegionRedundancyStatus getRegionResult(String regionName) {
-    RegionRedundancyStatus result = satisfiedRedundancyRegions.get(regionName);
-    if (result == null) {
-      result = underRedundancyRegions.get(regionName);
+    regionResult = satisfiedRedundancyRegionsResults.get(regionName);
+    if (regionResult == null) {
+      regionResult = underRedundancyRegionsResults.get(regionName);
     }
-    if (result == null) {
-      result = zeroRedundancyRegions.get(regionName);
+    if (regionResult == null) {
+      regionResult = zeroRedundancyRegionsResults.get(regionName);
     }
-    return result;
+    return regionResult;
   }
 
   @Override
   public Map<String, RegionRedundancyStatus> getZeroRedundancyRegionResults() {
-    return zeroRedundancyRegions;
+    return zeroRedundancyRegionsResults;
   }
 
   @Override
   public Map<String, RegionRedundancyStatus> getUnderRedundancyRegionResults() {
-    return underRedundancyRegions;
+    return underRedundancyRegionsResults;
   }
 
   @Override
   public Map<String, RegionRedundancyStatus> getSatisfiedRedundancyRegionResults() {
-    return satisfiedRedundancyRegions;
+    return satisfiedRedundancyRegionsResults;
   }
 
   @Override
   public Map<String, RegionRedundancyStatus> getRegionResults() {
     Map<String, RegionRedundancyStatus> combinedResults =
-        new HashMap<>(satisfiedRedundancyRegions);
-    combinedResults.putAll(underRedundancyRegions);
-    combinedResults.putAll(zeroRedundancyRegions);
+        new HashMap<>(satisfiedRedundancyRegionsResults);
+    combinedResults.putAll(underRedundancyRegionsResults);
+    combinedResults.putAll(zeroRedundancyRegionsResults);
 
     return combinedResults;
   }
@@ -161,7 +193,7 @@ public class RestoreRedundancyResultsImpl implements RestoreRedundancyResults {
   }
 
   @Override
-  public Duration getTotalPrimaryTransferTime() {
+  public long getTotalPrimaryTransferTime() {
     return totalPrimaryTransferTime;
   }
 
@@ -195,9 +227,9 @@ public class RestoreRedundancyResultsImpl implements RestoreRedundancyResults {
   @Override
   public String toString() {
     return "RestoreRedundancyResultsImpl{" +
-        "zeroRedundancyRegions=" + zeroRedundancyRegions +
-        ", underRedundancyRegions=" + underRedundancyRegions +
-        ", satisfiedRedundancyRegions=" + satisfiedRedundancyRegions +
+        "zeroRedundancyRegions=" + zeroRedundancyRegionsResults +
+        ", underRedundancyRegions=" + underRedundancyRegionsResults +
+        ", satisfiedRedundancyRegions=" + satisfiedRedundancyRegionsResults +
         ", totalPrimaryTransfersCompleted=" + totalPrimaryTransfersCompleted +
         ", totalPrimaryTransferTime=" + totalPrimaryTransferTime +
         ", success=" + success +
diff --git a/geode-management/src/main/java/org/apache/geode/management/operation/RestoreRedundancyRequest.java b/geode-management/src/main/java/org/apache/geode/management/operation/RestoreRedundancyRequest.java
index 2ec36d6..e0b2d1c 100644
--- a/geode-management/src/main/java/org/apache/geode/management/operation/RestoreRedundancyRequest.java
+++ b/geode-management/src/main/java/org/apache/geode/management/operation/RestoreRedundancyRequest.java
@@ -36,7 +36,7 @@ public class RestoreRedundancyRequest
   /**
    * see {@link #getEndpoint()}
    */
-  private static final String RESTORE_REDUNDANCY_ENDPOINT = "/operations/restoreRedundancy";
+  public static final String RESTORE_REDUNDANCY_ENDPOINT = "/operations/restoreRedundancy";
   private static final long serialVersionUID = -3896185413062876188L;
   /** null means all regions included */
   private List<String> includeRegions;
diff --git a/geode-management/src/main/java/org/apache/geode/management/runtime/RegionRedundancyStatus.java b/geode-management/src/main/java/org/apache/geode/management/runtime/RegionRedundancyStatus.java
index 74c6e62..e25bbec 100644
--- a/geode-management/src/main/java/org/apache/geode/management/runtime/RegionRedundancyStatus.java
+++ b/geode-management/src/main/java/org/apache/geode/management/runtime/RegionRedundancyStatus.java
@@ -14,13 +14,17 @@
  */
 package org.apache.geode.management.runtime;
 
+import java.io.Serializable;
+
 import org.apache.geode.annotations.Experimental;
+import org.apache.geode.management.api.JsonSerializable;
+
 
 /**
  * Used to calculate and store a snapshot of the redundancy status for a partitioned region.
  */
 @Experimental
-public interface RegionRedundancyStatus {
+public interface RegionRedundancyStatus extends JsonSerializable, Serializable {
 
   /**
    * The redundancy status of the region used to create this object at time of creation.
diff --git a/geode-management/src/main/java/org/apache/geode/management/runtime/RestoreRedundancyResults.java b/geode-management/src/main/java/org/apache/geode/management/runtime/RestoreRedundancyResults.java
index 4d6882a..f932192 100644
--- a/geode-management/src/main/java/org/apache/geode/management/runtime/RestoreRedundancyResults.java
+++ b/geode-management/src/main/java/org/apache/geode/management/runtime/RestoreRedundancyResults.java
@@ -14,10 +14,11 @@
  */
 package org.apache.geode.management.runtime;
 
-import java.time.Duration;
 import java.util.List;
 import java.util.Map;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
 import org.apache.geode.annotations.Experimental;
 
 /**
@@ -43,6 +44,7 @@ public interface RestoreRedundancyResults extends OperationResult {
    *
    * @return The {@link Status} of this restore redundancy operation.
    */
+  @JsonIgnore
   Status getRegionOperationStatus();
 
   /**
@@ -50,6 +52,7 @@ public interface RestoreRedundancyResults extends OperationResult {
    *
    * @return A {@link String} describing the results of this restore redundancy operation.
    */
+  @JsonIgnore
   String getRegionOperationMessage();
 
   /**
@@ -114,9 +117,9 @@ public interface RestoreRedundancyResults extends OperationResult {
    * Returns the total time spent transferring primaries as part of the restore redundancy
    * operations.
    *
-   * @return A {@link Duration} representing the total time spent transferring primaries
+   * @return A {@link long} representing the total time in milliseconds spent transferring primaries
    */
-  Duration getTotalPrimaryTransferTime();
+  long getTotalPrimaryTransferTime();
 
   /**
    * If user specified "includedRegion" list, but some of the regions in the list are not found in
diff --git a/geode-management/src/main/resources/org/apache/geode/internal/sanctioned-geode-management-serializables.txt b/geode-management/src/main/resources/org/apache/geode/internal/sanctioned-geode-management-serializables.txt
index 6712b56..8e13504 100644
--- a/geode-management/src/main/resources/org/apache/geode/internal/sanctioned-geode-management-serializables.txt
+++ b/geode-management/src/main/resources/org/apache/geode/internal/sanctioned-geode-management-serializables.txt
@@ -23,7 +23,8 @@ org/apache/geode/management/configuration/Region$ExpirationType,false
 org/apache/geode/management/configuration/RegionType,false
 org/apache/geode/management/internal/operation/RebalanceRegionResultImpl,false,bucketCreateBytes:long,bucketCreateTimeInMilliseconds:long,bucketCreatesCompleted:int,bucketTransferBytes:long,bucketTransferTimeInMilliseconds:long,bucketTransfersCompleted:int,numOfMembers:int,primaryTransferTimeInMilliseconds:long,primaryTransfersCompleted:int,regionName:java/lang/String,timeInMilliseconds:long
 org/apache/geode/management/internal/operation/RebalanceResultImpl,false,rebalanceSummary:java/util/List,statusMessage:java/lang/String,success:boolean
-org/apache/geode/management/internal/operation/RestoreRedundancyResultsImpl,true,-1174735246756963521,includedRegionsWithNoMembers:java/util/List,satisfiedRedundancyRegions:java/util/Map,statusMessage:java/lang/String,success:boolean,totalPrimaryTransferTime:java/time/Duration,totalPrimaryTransfersCompleted:int,underRedundancyRegions:java/util/Map,zeroRedundancyRegions:java/util/Map
+org/apache/geode/management/internal/operation/RegionRedundancyStatusImpl,false,actualRedundancy:int,configuredRedundancy:int,regionName:java/lang/String,status:org/apache/geode/management/runtime/RegionRedundancyStatus$RedundancyStatus
+org/apache/geode/management/internal/operation/RestoreRedundancyResultsImpl,true,-1174735246756963521,includedRegionsWithNoMembers:java/util/List,regionResult:org/apache/geode/management/runtime/RegionRedundancyStatus,satisfiedRedundancyRegionsResults:java/util/Map,statusMessage:java/lang/String,success:boolean,totalPrimaryTransferTime:long,totalPrimaryTransfersCompleted:int,underRedundancyRegionsResults:java/util/Map,zeroRedundancyRegionsResults:java/util/Map
 org/apache/geode/management/operation/RebalanceOperation,false,excludeRegions:java/util/List,includeRegions:java/util/List,operator:java/lang/String,simulate:boolean
 org/apache/geode/management/operation/RestoreRedundancyRequest,true,-3896185413062876188,excludeRegions:java/util/List,includeRegions:java/util/List,operator:java/lang/String,reassignPrimaries:boolean
 org/apache/geode/management/runtime/CacheServerInfo,true,1,bindAddress:java/lang/String,isRunning:boolean,maxConnections:int,maxThreads:int,port:int