You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by je...@apache.org on 2018/08/06 14:47:58 UTC

[geode] branch develop updated: GEODE-4858: Update *DiskStore commands to use ResultModel and SingleGfshCommand (#1996)

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

jensdeppe 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 8b9ebaa  GEODE-4858: Update *DiskStore commands to use ResultModel and SingleGfshCommand (#1996)
8b9ebaa is described below

commit 8b9ebaa483f6d9f4f96354a1c0dafa472ce39e8c
Author: Jens Deppe <jd...@pivotal.io>
AuthorDate: Mon Aug 6 07:47:52 2018 -0700

    GEODE-4858: Update *DiskStore commands to use ResultModel and SingleGfshCommand (#1996)
---
 .../cli/commands/DiskStoreCommandsDUnitTest.java   | 125 ++++++++++++++++++++-
 .../geode/cache/configuration/DiskDirsType.java    |   2 +-
 .../geode/cache/configuration/DiskStoreType.java   |   7 +-
 .../internal/beans/DistributedSystemBridge.java    |   5 +
 .../cli/commands/AlterOfflineDiskStoreCommand.java |  36 ++----
 .../cli/commands/BackupDiskStoreCommand.java       |  43 ++++---
 .../cli/commands/CompactDiskStoreCommand.java      |  33 +++---
 .../commands/CompactOfflineDiskStoreCommand.java   |  90 +++++----------
 .../cli/commands/CreateDiskStoreCommand.java       |  67 ++++++++---
 .../cli/commands/DescribeDiskStoreCommand.java     |  40 ++++---
 .../cli/commands/DestroyDiskStoreCommand.java      |  30 ++---
 .../commands/ExportOfflineDiskStoreCommand.java    |  15 ++-
 .../cli/commands/ListDiskStoresCommand.java        |  23 ++--
 .../commands/RevokeMissingDiskStoreCommand.java    |  34 ++----
 .../cli/commands/ShowMissingDiskStoreCommand.java  |  90 ++++++---------
 .../commands/UpgradeOfflineDiskStoreCommand.java   |  76 +++----------
 .../cli/commands/ValidateDiskStoreCommand.java     |  62 ++++++----
 .../cli/functions/CreateDiskStoreFunction.java     |  57 ++--------
 .../internal/cli/util/DiskStoreCompacter.java      |   7 ++
 .../internal/cli/util/DiskStoreUpgrader.java       |   7 ++
 .../internal/cli/util/DiskStoreValidater.java      |  38 +++----
 .../sanctioned-geode-core-serializables.txt        |   1 +
 22 files changed, 456 insertions(+), 432 deletions(-)

diff --git a/geode-core/src/distributedTest/java/org/apache/geode/management/internal/cli/commands/DiskStoreCommandsDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/management/internal/cli/commands/DiskStoreCommandsDUnitTest.java
index 8319129..fc08858 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/management/internal/cli/commands/DiskStoreCommandsDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/management/internal/cli/commands/DiskStoreCommandsDUnitTest.java
@@ -32,11 +32,14 @@ import org.junit.rules.TemporaryFolder;
 
 import org.apache.geode.cache.Cache;
 import org.apache.geode.cache.Region;
+import org.apache.geode.cache.configuration.CacheConfig;
+import org.apache.geode.cache.configuration.DiskStoreType;
 import org.apache.geode.distributed.Locator;
 import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
 import org.apache.geode.distributed.internal.InternalLocator;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.cache.SnapshotTestUtil;
+import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.result.CommandResult;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
@@ -139,7 +142,7 @@ public class DiskStoreCommandsDUnitTest {
   }
 
   @Test
-  public void testDescribeOfflineDiskStoreCommand() throws Exception {
+  public void testValidateOfflineDiskStoreCommand() throws Exception {
     MemberVM server1 = rule.startServerVM(0, x -> x.withJMXManager().withProperty("groups", GROUP));
 
     gfsh.connectAndVerify(server1.getJmxPort(), GfshCommandRule.PortType.jmxManager);
@@ -198,9 +201,9 @@ public class DiskStoreCommandsDUnitTest {
     boolean result = jmxManager.invoke(() -> {
       InternalConfigurationPersistenceService sharedConfig =
           ((InternalLocator) Locator.getLocator()).getConfigurationPersistenceService();
-      String xmlFromConfig;
-      xmlFromConfig = sharedConfig.getConfiguration(GROUP).getCacheXmlContent();
-      return xmlFromConfig.contains(DISKSTORE);
+      List<DiskStoreType> diskStores = sharedConfig.getCacheConfig(GROUP).getDiskStores();
+
+      return diskStores.size() == 1 && DISKSTORE.equals(diskStores.get(0).getName());
     });
 
     return result;
@@ -243,7 +246,6 @@ public class DiskStoreCommandsDUnitTest {
     assertThat(diskStoreExistsInClusterConfig(locator)).isFalse();
   }
 
-
   @Test
   public void testBackupDiskStore() throws Exception {
     Properties props = new Properties();
@@ -282,6 +284,14 @@ public class DiskStoreCommandsDUnitTest {
 
     gfsh.executeAndAssertThat(String.format("destroy disk-store --name=%s --if-exists", DISKSTORE))
         .statusIsSuccess();
+
+    locator.invoke(() -> {
+      InternalConfigurationPersistenceService cc =
+          ClusterStartupRule.getLocator().getConfigurationPersistenceService();
+      CacheConfig config = cc.getCacheConfig("cluster");
+      assertThat(config.getDiskStores().size()).isEqualTo(0);
+    });
+
     gfsh.executeAndAssertThat(String.format("destroy disk-store --name=%s --if-exists", DISKSTORE))
         .statusIsSuccess();
   }
@@ -319,4 +329,109 @@ public class DiskStoreCommandsDUnitTest {
     assertThat(cmdResult.getMapFromSection("server-2").keySet()).contains("UUID", "Host",
         "Directory");
   }
+
+  @Test
+  public void testDescribeDiskStoreCommand() throws Exception {
+    MemberVM server1 = rule.startServerVM(0, x -> x.withJMXManager().withProperty("groups", GROUP));
+
+    gfsh.connectAndVerify(server1.getJmxPort(), GfshCommandRule.PortType.jmxManager);
+
+    createDiskStoreAndRegion(server1, 1);
+
+    server1.invoke(() -> {
+      Cache cache = ClusterStartupRule.getCache();
+      Region r = cache.getRegion(REGION_1);
+      r.put("A", "B");
+    });
+
+    CommandResult result = gfsh.executeCommand(
+        String.format("describe disk-store --member=%s --name=%s", server1.getName(), DISKSTORE));
+    assertThat(result.getStatus()).isEqualTo(Result.Status.OK);
+
+    Map<String, String> data =
+        result.getMapFromSection(DescribeDiskStoreCommand.DISK_STORE_SECTION);
+    assertThat(data.keySet()).contains("Disk Store Name", "Member ID", "Member Name",
+        "Allow Force Compaction", "Auto Compaction", "Compaction Threshold", "Max Oplog Size",
+        "Queue Size", "Time Interval", "Write Buffer Size", "Disk Usage Warning Percentage",
+        "Disk Usage Critical Percentage", "PDX Serialization Meta-Data Stored");
+
+    Map<String, List<String>> directories =
+        result.getMapFromTableContent(DescribeDiskStoreCommand.DISK_DIR_SECTION);
+    assertThat(directories.get("Disk Directory").size()).isEqualTo(1);
+
+    Map<String, List<String>> regions =
+        result.getMapFromTableContent(DescribeDiskStoreCommand.REGION_SECTION);
+    assertThat(regions.get("Region Path").size()).isEqualTo(1);
+  }
+
+  @Test
+  public void testUpgradeOfflineDiskStoreCommandFailsAsExpected() throws Exception {
+    MemberVM server1 = rule.startServerVM(0, x -> x.withJMXManager().withProperty("groups", GROUP));
+
+    gfsh.connectAndVerify(server1.getJmxPort(), GfshCommandRule.PortType.jmxManager);
+
+    createDiskStoreAndRegion(server1, 1);
+
+    server1.invoke(() -> {
+      Cache cache = ClusterStartupRule.getCache();
+      Region r = cache.getRegion(REGION_1);
+      r.put("A", "B");
+    });
+
+    // Should not be able to do this on a running system
+    String diskDirs = new File(server1.getWorkingDir(), DISKSTORE).getAbsolutePath();
+    gfsh.executeAndAssertThat(
+        String.format("upgrade offline-disk-store --name=%s --disk-dirs=%s", DISKSTORE, diskDirs))
+        .statusIsError().containsOutput("The disk is currently being used by another process");
+
+    server1.stop(false);
+
+    gfsh.executeAndAssertThat(
+        String.format("upgrade offline-disk-store --name=%s --disk-dirs=%s", DISKSTORE, diskDirs))
+        .statusIsError().containsOutput("This disk store is already at version");
+  }
+
+  @Test
+  public void revokingUnknownDiskStoreShowsErrorCorrectly() throws Exception {
+    Properties props = new Properties();
+    props.setProperty("groups", GROUP);
+
+    MemberVM locator = rule.startLocatorVM(0);
+    MemberVM server1 = rule.startServerVM(1, props, locator.getPort());
+
+    gfsh.connectAndVerify(locator);
+
+    gfsh.executeAndAssertThat("revoke missing-disk-store --id=unknown-diskstore")
+        .statusIsError().containsOutput("Unable to find missing disk store to revoke");
+  }
+
+  @Test
+  public void testAlterOfflineDiskStoreCommandFailsAsExpected() throws Exception {
+    MemberVM server1 = rule.startServerVM(0, x -> x.withJMXManager().withProperty("groups", GROUP));
+
+    gfsh.connectAndVerify(server1.getJmxPort(), GfshCommandRule.PortType.jmxManager);
+
+    createDiskStoreAndRegion(server1, 1);
+
+    server1.invoke(() -> {
+      Cache cache = ClusterStartupRule.getCache();
+      Region r = cache.getRegion(REGION_1);
+      r.put("A", "B");
+    });
+
+    String diskDirs = new File(server1.getWorkingDir(), DISKSTORE).getAbsolutePath();
+    gfsh.executeAndAssertThat(
+        String.format("alter disk-store --name=%s --region=%s --disk-dirs=%s --compressor=foo.Bar",
+            DISKSTORE, REGION_1, diskDirs))
+        .statusIsError().containsOutput("DISKSTORE: Could not lock");
+
+    server1.stop(false);
+    gfsh.disconnect();
+
+    gfsh.executeAndAssertThat(
+        String.format(
+            "alter disk-store --name=%s --region=INVALID --disk-dirs=%s --compressor=foo.Bar",
+            DISKSTORE, diskDirs))
+        .statusIsError().containsOutput("The disk store does not contain a region named: /INVALID");
+  }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/cache/configuration/DiskDirsType.java b/geode-core/src/main/java/org/apache/geode/cache/configuration/DiskDirsType.java
index 49d5729..817332d 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/configuration/DiskDirsType.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/configuration/DiskDirsType.java
@@ -89,7 +89,7 @@ public class DiskDirsType {
    */
   public List<DiskDirType> getDiskDirs() {
     if (diskDirs == null) {
-      diskDirs = new ArrayList<DiskDirType>();
+      diskDirs = new ArrayList<>();
     }
     return this.diskDirs;
   }
diff --git a/geode-core/src/main/java/org/apache/geode/cache/configuration/DiskStoreType.java b/geode-core/src/main/java/org/apache/geode/cache/configuration/DiskStoreType.java
index 0ecb168..6f30171 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/configuration/DiskStoreType.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/configuration/DiskStoreType.java
@@ -66,7 +66,7 @@ import org.apache.geode.annotations.Experimental;
 @XmlType(name = "disk-store-type", namespace = "http://geode.apache.org/schema/cache",
     propOrder = {"diskDirs"})
 @Experimental
-public class DiskStoreType {
+public class DiskStoreType implements CacheElement {
 
   @XmlElement(name = "disk-dirs", namespace = "http://geode.apache.org/schema/cache")
   protected DiskDirsType diskDirs;
@@ -91,6 +91,11 @@ public class DiskStoreType {
   @XmlAttribute(name = "disk-usage-critical-percentage")
   protected String diskUsageCriticalPercentage;
 
+  @Override
+  public String getId() {
+    return getName();
+  }
+
   /**
    * Gets the value of the diskDirs property.
    *
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/beans/DistributedSystemBridge.java b/geode-core/src/main/java/org/apache/geode/management/internal/beans/DistributedSystemBridge.java
index 2097726..ed22cb6 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/beans/DistributedSystemBridge.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/beans/DistributedSystemBridge.java
@@ -877,6 +877,11 @@ public class DistributedSystemBridge {
   public PersistentMemberDetails[] listMissingDiskStores() {
     PersistentMemberDetails[] missingDiskStores = null;
 
+    // No need to try and send anything if we're a Loner
+    if (dm.isLoner()) {
+      return missingDiskStores;
+    }
+
     Set<PersistentID> persistentMemberSet = MissingPersistentIDsRequest.send(dm);
     if (persistentMemberSet != null && persistentMemberSet.size() > 0) {
       missingDiskStores = new PersistentMemberDetails[persistentMemberSet.size()];
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/AlterOfflineDiskStoreCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/AlterOfflineDiskStoreCommand.java
index 7819f00..a5e3570 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/AlterOfflineDiskStoreCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/AlterOfflineDiskStoreCommand.java
@@ -24,15 +24,13 @@ import org.apache.geode.cache.CacheExistsException;
 import org.apache.geode.cache.Region;
 import org.apache.geode.internal.cache.DiskStoreImpl;
 import org.apache.geode.management.cli.CliMetaData;
-import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.ErrorResultData;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
 
 public class AlterOfflineDiskStoreCommand extends InternalGfshCommand {
   @CliCommand(value = CliStrings.ALTER_DISK_STORE, help = CliStrings.ALTER_DISK_STORE__HELP)
   @CliMetaData(shellOnly = true, relatedTopic = {CliStrings.TOPIC_GEODE_DISKSTORE})
-  public Result alterOfflineDiskStore(
+  public ResultModel alterOfflineDiskStore(
       @CliOption(key = CliStrings.ALTER_DISK_STORE__DISKSTORENAME, mandatory = true,
           help = CliStrings.ALTER_DISK_STORE__DISKSTORENAME__HELP) String diskStoreName,
       @CliOption(key = CliStrings.ALTER_DISK_STORE__REGIONNAME, mandatory = true,
@@ -61,8 +59,6 @@ public class AlterOfflineDiskStoreCommand extends InternalGfshCommand {
           help = CliStrings.ALTER_DISK_STORE__REMOVE__HELP, specifiedDefaultValue = "true",
           unspecifiedDefaultValue = "false") boolean remove) {
 
-    Result result;
-
     try {
       File[] dirs = null;
 
@@ -74,7 +70,7 @@ public class AlterOfflineDiskStoreCommand extends InternalGfshCommand {
       }
 
       if (regionName.equals(Region.SEPARATOR)) {
-        return ResultBuilder.createUserErrorResult(CliStrings.INVALID_REGION_NAME);
+        return ResultModel.createError(CliStrings.INVALID_REGION_NAME);
       }
 
       if ((lruEvictionAlgo != null) || (lruEvictionAction != null) || (lruEvictionLimit != null)
@@ -101,41 +97,31 @@ public class AlterOfflineDiskStoreCommand extends InternalGfshCommand {
               initialCapacityString, loadFactorString, compressorClassName, statisticsEnabledString,
               offHeapString, false);
 
-          result = ResultBuilder.createInfoResult(resultMessage);
+          return ResultModel.createInfo(resultMessage);
         } else {
-          result = ResultBuilder.createParsingErrorResult(
+          return ResultModel.createCommandProcessingError(
               "Cannot use the --remove=true parameter with any other parameters");
         }
       } else {
         if (remove) {
           DiskStoreImpl.destroyRegion(diskStoreName, dirs, "/" + regionName);
-          result = ResultBuilder.createInfoResult("The region " + regionName
+          return ResultModel.createInfo("The region " + regionName
               + " was successfully removed from the disk store " + diskStoreName);
         } else {
           // Please provide an option
-          result = ResultBuilder.createParsingErrorResult("Please provide a relevant parameter");
+          return ResultModel.createInfo("Please provide a relevant parameter");
         }
       }
       // Catch the IllegalArgumentException thrown by the modifyDiskStore function and sent the
     } catch (IllegalArgumentException e) {
-      String message = "Please check the parameters";
-      message += "\n" + e.getMessage();
-      result = ResultBuilder.createGemFireErrorResult(message);
-    } catch (IllegalStateException e) {
-      result = ResultBuilder.createGemFireErrorResult(e.getMessage());
+      return ResultModel.createError("Please check the parameters. " + e.getMessage());
     } catch (CacheExistsException e) {
       // Indicates that the command is being used when a cache is open
-      result = ResultBuilder.createGemFireErrorResult("Cannot execute "
-          + CliStrings.ALTER_DISK_STORE + " when a cache exists (Offline command)");
+      return ResultModel.createError("Cannot execute " + CliStrings.ALTER_DISK_STORE
+          + " when a cache exists (Offline command)");
     } catch (Exception e) {
-      result = createErrorResult(e.getMessage());
+      return ResultModel.createError(e.getMessage());
     }
-    return result;
   }
 
-  private Result createErrorResult(String message) {
-    ErrorResultData erd = ResultBuilder.createErrorResultData();
-    erd.addLine(message);
-    return ResultBuilder.buildResult(erd);
-  }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/BackupDiskStoreCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/BackupDiskStoreCommand.java
index 366d187..e4616f4 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/BackupDiskStoreCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/BackupDiskStoreCommand.java
@@ -28,15 +28,16 @@ import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.cache.backup.BackupOperation;
 import org.apache.geode.management.BackupStatus;
 import org.apache.geode.management.cli.CliMetaData;
-import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.CompositeResultData;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
 public class BackupDiskStoreCommand extends InternalGfshCommand {
+  public static final String BACKED_UP_DISKSTORES_SECTION = "backed-up-diskstores";
+  public static final String OFFLINE_DISKSTORES_SECTION = "offline-diskstores";
+
   /**
    * Internally, we also verify the resource operation permissions CLUSTER:WRITE:DISK if the region
    * is persistent
@@ -45,7 +46,7 @@ public class BackupDiskStoreCommand extends InternalGfshCommand {
   @CliMetaData(relatedTopic = {CliStrings.TOPIC_GEODE_DISKSTORE})
   @ResourceOperation(resource = ResourcePermission.Resource.DATA,
       operation = ResourcePermission.Operation.READ)
-  public Result backupDiskStore(
+  public ResultModel backupDiskStore(
       @CliOption(key = CliStrings.BACKUP_DISK_STORE__DISKDIRS,
           help = CliStrings.BACKUP_DISK_STORE__DISKDIRS__HELP, mandatory = true) String targetDir,
       @CliOption(key = CliStrings.BACKUP_DISK_STORE__BASELINEDIR,
@@ -53,7 +54,8 @@ public class BackupDiskStoreCommand extends InternalGfshCommand {
 
     authorize(ResourcePermission.Resource.CLUSTER, ResourcePermission.Operation.WRITE,
         ResourcePermission.Target.DISK);
-    Result result;
+
+    ResultModel result = new ResultModel();
     try {
       InternalCache cache = (InternalCache) getCache();
       DistributionManager dm = cache.getDistributionManager();
@@ -70,12 +72,10 @@ public class BackupDiskStoreCommand extends InternalGfshCommand {
           backupStatus.getBackedUpDiskStores();
 
       Set<DistributedMember> backedupMembers = backedupMemberDiskstoreMap.keySet();
-      CompositeResultData crd = ResultBuilder.createCompositeResultData();
 
       if (!backedupMembers.isEmpty()) {
-        CompositeResultData.SectionResultData backedupDiskStoresSection = crd.addSection();
-        backedupDiskStoresSection.setHeader(CliStrings.BACKUP_DISK_STORE_MSG_BACKED_UP_DISK_STORES);
-        TabularResultData backedupDiskStoresTable = backedupDiskStoresSection.addTable();
+        TabularResultModel backedupDiskStoresTable = result.addTable(BACKED_UP_DISKSTORES_SECTION);
+        backedupDiskStoresTable.setHeader(CliStrings.BACKUP_DISK_STORE_MSG_BACKED_UP_DISK_STORES);
 
         for (DistributedMember member : backedupMembers) {
           Set<PersistentID> backedupDiskStores = backedupMemberDiskstoreMap.get(member);
@@ -103,17 +103,15 @@ public class BackupDiskStoreCommand extends InternalGfshCommand {
           }
         }
       } else {
-        CompositeResultData.SectionResultData noMembersBackedUp = crd.addSection();
-        noMembersBackedUp.setHeader(CliStrings.BACKUP_DISK_STORE_MSG_NO_DISKSTORES_BACKED_UP);
+        result.addInfo().addLine(CliStrings.BACKUP_DISK_STORE_MSG_NO_DISKSTORES_BACKED_UP);
       }
 
       Set<PersistentID> offlineDiskStores = backupStatus.getOfflineDiskStores();
 
       if (!offlineDiskStores.isEmpty()) {
-        CompositeResultData.SectionResultData offlineDiskStoresSection = crd.addSection();
-        TabularResultData offlineDiskStoresTable = offlineDiskStoresSection.addTable();
+        TabularResultModel offlineDiskStoresTable = result.addTable(OFFLINE_DISKSTORES_SECTION);
+        offlineDiskStoresTable.setHeader(CliStrings.BACKUP_DISK_STORE_MSG_OFFLINE_DISK_STORES);
 
-        offlineDiskStoresSection.setHeader(CliStrings.BACKUP_DISK_STORE_MSG_OFFLINE_DISK_STORES);
         for (PersistentID offlineDiskStore : offlineDiskStores) {
           offlineDiskStoresTable.accumulate(CliStrings.BACKUP_DISK_STORE_MSG_UUID,
               offlineDiskStore.getUUID().toString());
@@ -123,19 +121,18 @@ public class BackupDiskStoreCommand extends InternalGfshCommand {
               offlineDiskStore.getDirectory());
         }
       }
-      result = ResultBuilder.buildResult(crd);
 
     } catch (Exception e) {
-      result = ResultBuilder.createGemFireErrorResult(e.getMessage());
+      return ResultModel.createError(e.getMessage());
     }
     return result;
   }
 
-  private void writeToBackupDiskStoreTable(TabularResultData backedupDiskStoreTable,
-      String memberId, String UUID, String host, String directory) {
-    backedupDiskStoreTable.accumulate(CliStrings.BACKUP_DISK_STORE_MSG_MEMBER, memberId);
-    backedupDiskStoreTable.accumulate(CliStrings.BACKUP_DISK_STORE_MSG_UUID, UUID);
-    backedupDiskStoreTable.accumulate(CliStrings.BACKUP_DISK_STORE_MSG_DIRECTORY, directory);
-    backedupDiskStoreTable.accumulate(CliStrings.BACKUP_DISK_STORE_MSG_HOST, host);
+  private void writeToBackupDiskStoreTable(TabularResultModel table, String memberId, String UUID,
+      String host, String directory) {
+    table.accumulate(CliStrings.BACKUP_DISK_STORE_MSG_MEMBER, memberId);
+    table.accumulate(CliStrings.BACKUP_DISK_STORE_MSG_UUID, UUID);
+    table.accumulate(CliStrings.BACKUP_DISK_STORE_MSG_DIRECTORY, directory);
+    table.accumulate(CliStrings.BACKUP_DISK_STORE_MSG_HOST, host);
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CompactDiskStoreCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CompactDiskStoreCommand.java
index 328fcb4..6330db7 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CompactDiskStoreCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CompactDiskStoreCommand.java
@@ -36,11 +36,10 @@ import org.apache.geode.management.DistributedSystemMXBean;
 import org.apache.geode.management.ManagementService;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.ConverterHint;
-import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.LogWrapper;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.CompositeResultData;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
+import org.apache.geode.management.internal.cli.result.model.DataResultModel;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
 import org.apache.geode.management.internal.messages.CompactRequest;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
@@ -50,18 +49,18 @@ public class CompactDiskStoreCommand extends InternalGfshCommand {
   @CliMetaData(relatedTopic = {CliStrings.TOPIC_GEODE_DISKSTORE})
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.MANAGE, target = ResourcePermission.Target.DISK)
-  public Result compactDiskStore(
+  public ResultModel compactDiskStore(
       @CliOption(key = CliStrings.COMPACT_DISK_STORE__NAME, mandatory = true,
           optionContext = ConverterHint.DISKSTORE,
           help = CliStrings.COMPACT_DISK_STORE__NAME__HELP) String diskStoreName,
       @CliOption(key = {CliStrings.GROUP, CliStrings.GROUPS},
           help = CliStrings.COMPACT_DISK_STORE__GROUP__HELP) String[] groups) {
-    Result result;
+    ResultModel result = new ResultModel();
 
     try {
       // disk store exists validation
       if (!diskStoreExists(diskStoreName)) {
-        result = ResultBuilder.createUserErrorResult(
+        return ResultModel.createError(
             CliStrings.format(CliStrings.COMPACT_DISK_STORE__DISKSTORE_0_DOES_NOT_EXIST,
                 new Object[] {diskStoreName}));
       } else {
@@ -97,7 +96,7 @@ public class CompactDiskStoreCommand extends InternalGfshCommand {
         // allMembers should not be empty when groups are not specified - it'll
         // have at least one member
         if (allMembers.isEmpty()) {
-          result = ResultBuilder.createUserErrorResult(
+          return ResultModel.createError(
               CliStrings.format(CliStrings.COMPACT_DISK_STORE__NO_MEMBERS_FOUND_IN_SPECIFED_GROUP,
                   new Object[] {Arrays.toString(groups)}));
         } else {
@@ -130,34 +129,30 @@ public class CompactDiskStoreCommand extends InternalGfshCommand {
 
           // If compaction happened at all, then prepare the summary
           if (overallCompactInfo != null && !overallCompactInfo.isEmpty()) {
-            CompositeResultData compositeResultData = ResultBuilder.createCompositeResultData();
-            CompositeResultData.SectionResultData section;
-
             Set<Map.Entry<DistributedMember, PersistentID>> entries = overallCompactInfo.entrySet();
 
             for (Map.Entry<DistributedMember, PersistentID> entry : entries) {
               String memberId = entry.getKey().getName();
-              section = compositeResultData.addSection(memberId);
-              section.setHeader("On Member: " + memberId);
+              DataResultModel summary = result.addData(memberId);
+              summary.setHeader("On Member: " + memberId);
 
               PersistentID persistentID = entry.getValue();
               if (persistentID != null) {
-                section.addData("UUID", persistentID.getUUID());
-                section.addData("Host", persistentID.getHost().getHostName());
-                section.addData("Directory", persistentID.getDirectory());
+                summary.addData("UUID", persistentID.getUUID());
+                summary.addData("Host", persistentID.getHost().getHostName());
+                summary.addData("Directory", persistentID.getDirectory());
               }
             }
-            compositeResultData.setHeader("Compacted " + diskStoreName + groupInfo);
-            result = ResultBuilder.buildResult(compositeResultData);
+            result.addInfo().addLine("Compacted " + diskStoreName + groupInfo);
           } else {
-            result = ResultBuilder.createInfoResult(
+            return ResultModel.createInfo(
                 CliStrings.COMPACT_DISK_STORE__COMPACTION_ATTEMPTED_BUT_NOTHING_TO_COMPACT);
           }
         } // all members' if
       } // disk store exists' if
     } catch (RuntimeException e) {
       LogWrapper.getInstance(getCache()).info(e.getMessage(), e);
-      result = ResultBuilder.createGemFireErrorResult(
+      return ResultModel.createError(
           CliStrings.format(CliStrings.COMPACT_DISK_STORE__ERROR_WHILE_COMPACTING_REASON_0,
               new Object[] {e.getMessage()}));
     }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CompactOfflineDiskStoreCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CompactOfflineDiskStoreCommand.java
index fbcce91..d70f4ed 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CompactOfflineDiskStoreCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CompactOfflineDiskStoreCommand.java
@@ -17,32 +17,29 @@ package org.apache.geode.management.internal.cli.commands;
 
 import java.io.BufferedReader;
 import java.io.File;
-import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import org.springframework.shell.core.annotation.CliCommand;
 import org.springframework.shell.core.annotation.CliOption;
 
-import org.apache.geode.GemFireIOException;
-import org.apache.geode.internal.lang.StringUtils;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.Result;
-import org.apache.geode.management.internal.cli.GfshParser;
 import org.apache.geode.management.internal.cli.LogWrapper;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
-import org.apache.geode.management.internal.cli.shell.Gfsh;
+import org.apache.geode.management.internal.cli.result.model.InfoResultModel;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
 import org.apache.geode.management.internal.cli.util.DiskStoreCompacter;
 
 public class CompactOfflineDiskStoreCommand extends InternalGfshCommand {
   @CliCommand(value = CliStrings.COMPACT_OFFLINE_DISK_STORE,
       help = CliStrings.COMPACT_OFFLINE_DISK_STORE__HELP)
   @CliMetaData(shellOnly = true, relatedTopic = {CliStrings.TOPIC_GEODE_DISKSTORE})
-  public Result compactOfflineDiskStore(
+  public ResultModel compactOfflineDiskStore(
       @CliOption(key = CliStrings.COMPACT_OFFLINE_DISK_STORE__NAME, mandatory = true,
           help = CliStrings.COMPACT_OFFLINE_DISK_STORE__NAME__HELP) String diskStoreName,
       @CliOption(key = CliStrings.COMPACT_OFFLINE_DISK_STORE__DISKDIRS, mandatory = true,
@@ -52,13 +49,11 @@ public class CompactOfflineDiskStoreCommand extends InternalGfshCommand {
           help = CliStrings.COMPACT_OFFLINE_DISK_STORE__MAXOPLOGSIZE__HELP) long maxOplogSize,
       @CliOption(key = CliStrings.COMPACT_OFFLINE_DISK_STORE__J,
           help = CliStrings.COMPACT_OFFLINE_DISK_STORE__J__HELP) String[] jvmProps) {
-    Result result;
+    ResultModel result = new ResultModel();
+    InfoResultModel infoResult = result.addInfo();
     LogWrapper logWrapper = LogWrapper.getInstance(getCache());
 
-    StringBuilder output = new StringBuilder();
-    StringBuilder error = new StringBuilder();
-    StringBuilder errorMessage = new StringBuilder();
-    Process compacterProcess = null;
+    Process compactorProcess = null;
 
     try {
       String validatedDirectories = DiskStoreCommandsUtils.validatedDirectories(diskDirs);
@@ -83,7 +78,7 @@ public class CompactOfflineDiskStoreCommand extends InternalGfshCommand {
 
       commandList.add(CliStrings.COMPACT_OFFLINE_DISK_STORE__NAME + "=" + diskStoreName);
 
-      if (diskDirs != null && diskDirs.length != 0) {
+      if (diskDirs.length != 0) {
         StringBuilder builder = new StringBuilder();
         int arrayLength = diskDirs.length;
         for (int i = 0; i < arrayLength; i++) {
@@ -102,75 +97,40 @@ public class CompactOfflineDiskStoreCommand extends InternalGfshCommand {
       commandList.add(CliStrings.COMPACT_OFFLINE_DISK_STORE__MAXOPLOGSIZE + "=" + maxOplogSize);
 
       ProcessBuilder procBuilder = new ProcessBuilder(commandList);
-      compacterProcess = procBuilder.start();
-      InputStream inputStream = compacterProcess.getInputStream();
-      InputStream errorStream = compacterProcess.getErrorStream();
+      procBuilder.redirectErrorStream(true);
+      compactorProcess = procBuilder.start();
+
+      InputStream inputStream = compactorProcess.getInputStream();
       BufferedReader inputReader = new BufferedReader(new InputStreamReader(inputStream));
-      BufferedReader errorReader = new BufferedReader(new InputStreamReader(errorStream));
 
       String line;
       while ((line = inputReader.readLine()) != null) {
-        output.append(line).append(GfshParser.LINE_SEPARATOR);
-      }
-
-      boolean switchToStackTrace = false;
-      while ((line = errorReader.readLine()) != null) {
-        if (!switchToStackTrace && DiskStoreCompacter.STACKTRACE_START.equals(line)) {
-          switchToStackTrace = true;
-        } else if (switchToStackTrace) {
-          error.append(line).append(GfshParser.LINE_SEPARATOR);
-        } else {
-          errorMessage.append(line);
-        }
-      }
-
-      if (errorMessage.length() > 0) {
-        throw new GemFireIOException(errorMessage.toString());
+        infoResult.addLine(line);
       }
 
-      // do we have to waitFor??
-      compacterProcess.destroy();
-      result = ResultBuilder.createInfoResult(output.toString());
-    } catch (IOException e) {
-      if (output.length() != 0) {
-        Gfsh.println(output.toString());
+      compactorProcess.waitFor(2, TimeUnit.SECONDS);
+      if (compactorProcess.exitValue() != 0) {
+        result.setStatus(Result.Status.ERROR);
       }
-      String fieldsMessage = (maxOplogSize != -1
-          ? CliStrings.COMPACT_OFFLINE_DISK_STORE__MAXOPLOGSIZE + "=" + maxOplogSize + "," : "");
-      fieldsMessage += StringUtils.arrayToString(diskDirs);
-      String errorString = CliStrings.format(
-          CliStrings.COMPACT_OFFLINE_DISK_STORE__MSG__ERROR_WHILE_COMPACTING_DISKSTORE_0_WITH_1_REASON_2,
-          diskStoreName, fieldsMessage);
-      result = ResultBuilder.createUserErrorResult(errorString);
-      if (logWrapper.fineEnabled()) {
-        logWrapper.fine(e.getMessage(), e);
-      }
-    } catch (GemFireIOException e) {
-      if (output.length() != 0) {
-        Gfsh.println(output.toString());
-      }
-      result = ResultBuilder.createUserErrorResult(errorMessage.toString());
-      if (logWrapper.fineEnabled()) {
-        logWrapper.fine(error.toString());
-      }
-    } catch (IllegalArgumentException e) {
-      if (output.length() != 0) {
-        Gfsh.println(output.toString());
-      }
-      result = ResultBuilder.createUserErrorResult(e.getMessage());
+    } catch (Exception e) {
+      infoResult.addLine(
+          String.format("Error compacting disk store %s: %s", diskStoreName, e.getMessage()));
+      result.setStatus(Result.Status.ERROR);
+      logWrapper.warning(e.getMessage(), e);
     } finally {
-      if (compacterProcess != null) {
+      if (compactorProcess != null) {
         try {
           // just to check whether the process has exited
           // Process.exitValue() throws IllegalThreadStateException if Process
           // is alive
-          compacterProcess.exitValue();
+          compactorProcess.exitValue();
         } catch (IllegalThreadStateException ise) {
           // not yet terminated, destroy the process
-          compacterProcess.destroy();
+          compactorProcess.destroy();
         }
       }
     }
+
     return result;
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateDiskStoreCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateDiskStoreCommand.java
index e3fcff5..023923c 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateDiskStoreCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateDiskStoreCommand.java
@@ -22,27 +22,28 @@ import java.util.Set;
 import org.springframework.shell.core.annotation.CliCommand;
 import org.springframework.shell.core.annotation.CliOption;
 
+import org.apache.geode.cache.configuration.CacheConfig;
+import org.apache.geode.cache.configuration.DiskDirType;
+import org.apache.geode.cache.configuration.DiskDirsType;
+import org.apache.geode.cache.configuration.DiskStoreType;
 import org.apache.geode.distributed.DistributedMember;
-import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
 import org.apache.geode.internal.cache.DiskStoreAttributes;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.ConverterHint;
-import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.cli.SingleGfshCommand;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.cli.functions.CreateDiskStoreFunction;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.CommandResult;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
-import org.apache.geode.management.internal.configuration.domain.XmlEntity;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
-public class CreateDiskStoreCommand extends InternalGfshCommand {
+public class CreateDiskStoreCommand extends SingleGfshCommand {
   @CliCommand(value = CliStrings.CREATE_DISK_STORE, help = CliStrings.CREATE_DISK_STORE__HELP)
   @CliMetaData(relatedTopic = {CliStrings.TOPIC_GEODE_DISKSTORE})
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.MANAGE, target = ResourcePermission.Target.DISK)
-  public Result createDiskStore(
+  public ResultModel createDiskStore(
       @CliOption(key = CliStrings.CREATE_DISK_STORE__NAME, mandatory = true,
           optionContext = ConverterHint.DISKSTORE,
           help = CliStrings.CREATE_DISK_STORE__NAME__HELP) String name,
@@ -78,7 +79,6 @@ public class CreateDiskStoreCommand extends InternalGfshCommand {
           unspecifiedDefaultValue = "99",
           help = CliStrings.CREATE_DISK_STORE__DISK_USAGE_CRITICAL_PCT__HELP) float diskUsageCriticalPercentage) {
 
-
     DiskStoreAttributes diskStoreAttributes = new DiskStoreAttributes();
     diskStoreAttributes.allowForceCompaction = allowForceCompaction;
     diskStoreAttributes.autoCompact = autoCompact;
@@ -87,6 +87,7 @@ public class CreateDiskStoreCommand extends InternalGfshCommand {
     diskStoreAttributes.queueSize = queueSize;
     diskStoreAttributes.timeInterval = timeInterval;
     diskStoreAttributes.writeBufferSize = writeBufferSize;
+    diskStoreAttributes.name = name;
 
     File[] directories = new File[directoriesAndSizes.length];
     int[] sizes = new int[directoriesAndSizes.length];
@@ -109,21 +110,51 @@ public class CreateDiskStoreCommand extends InternalGfshCommand {
     Set<DistributedMember> targetMembers = findMembers(groups, null);
 
     if (targetMembers.isEmpty()) {
-      return ResultBuilder.createUserErrorResult(CliStrings.NO_MEMBERS_FOUND_MESSAGE);
+      return ResultModel.createError(CliStrings.NO_MEMBERS_FOUND_MESSAGE);
     }
 
-    List<CliFunctionResult> results = executeAndGetFunctionResult(new CreateDiskStoreFunction(),
-        new Object[] {name, diskStoreAttributes}, targetMembers);
+    List<CliFunctionResult> functionResults = executeAndGetFunctionResult(
+        new CreateDiskStoreFunction(), new Object[] {name, diskStoreAttributes}, targetMembers);
+
+    ResultModel result = ResultModel.createMemberStatusResult(functionResults);
+    result.setConfigObject(createDiskStoreType(name, diskStoreAttributes));
+
+    return result;
+  }
 
-    CommandResult result = ResultBuilder.buildResult(results);
-    XmlEntity xmlEntity = findXmlEntity(results);
+  private DiskStoreType createDiskStoreType(String name, DiskStoreAttributes diskStoreAttributes) {
+    DiskStoreType diskStoreType = new DiskStoreType();
+    diskStoreType.setAllowForceCompaction(diskStoreAttributes.getAllowForceCompaction());
+    diskStoreType.setAutoCompact(diskStoreAttributes.getAutoCompact());
+    diskStoreType
+        .setCompactionThreshold(Integer.toString(diskStoreAttributes.getCompactionThreshold()));
 
-    if (xmlEntity != null) {
-      persistClusterConfiguration(result,
-          () -> ((InternalConfigurationPersistenceService) getConfigurationPersistenceService())
-              .addXmlEntity(xmlEntity, groups));
+    DiskDirsType diskDirsType = new DiskDirsType();
+    List<DiskDirType> diskDirs = diskDirsType.getDiskDirs();
+    for (int i = 0; i < diskStoreAttributes.getDiskDirs().length; i++) {
+      DiskDirType diskDir = new DiskDirType();
+      diskDir.setContent(diskStoreAttributes.getDiskDirs()[i].getName());
+      diskDir.setDirSize(Integer.toString(diskStoreAttributes.getDiskDirSizes()[i]));
+
+      diskDirs.add(diskDir);
     }
+    diskStoreType.setDiskDirs(diskDirsType);
+    diskStoreType.setDiskUsageCriticalPercentage(
+        Integer.toString((int) diskStoreAttributes.getDiskUsageCriticalPercentage()));
+    diskStoreType.setDiskUsageWarningPercentage(
+        Integer.toString((int) diskStoreAttributes.getDiskUsageWarningPercentage()));
+    diskStoreType.setMaxOplogSize(Integer.toString((int) diskStoreAttributes.getMaxOplogSize()));
+    diskStoreType.setName(diskStoreAttributes.getName());
+    diskStoreType.setQueueSize(Integer.toString(diskStoreAttributes.getQueueSize()));
+    diskStoreType.setTimeInterval(Integer.toString((int) diskStoreAttributes.getTimeInterval()));
+    diskStoreType.setWriteBufferSize(Integer.toString(diskStoreAttributes.getWriteBufferSize()));
 
-    return result;
+    return diskStoreType;
+  }
+
+  @Override
+  public void updateClusterConfig(String group, CacheConfig config, Object configObject) {
+    DiskStoreType diskStoreType = (DiskStoreType) configObject;
+    config.getDiskStores().add(diskStoreType);
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DescribeDiskStoreCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DescribeDiskStoreCommand.java
index c4b780f..ebe36b8 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DescribeDiskStoreCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DescribeDiskStoreCommand.java
@@ -26,23 +26,29 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.internal.lang.ClassUtils;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.ConverterHint;
-import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.domain.DiskStoreDetails;
 import org.apache.geode.management.internal.cli.exceptions.EntityNotFoundException;
 import org.apache.geode.management.internal.cli.functions.DescribeDiskStoreFunction;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.CompositeResultData;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.DataResultModel;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
 public class DescribeDiskStoreCommand extends InternalGfshCommand {
+  public static final String DISK_STORE_SECTION = "disk-store";
+  public static final String DISK_DIR_SECTION = "disk-dir";
+  public static final String REGION_SECTION = "region";
+  public static final String CACHE_SERVER_SECTION = "cache-server";
+  public static final String GATEWAY_SECTION = "gateway";
+  public static final String ASYNC_EVENT_QUEUE_SECTION = "async-event-queue";
+
   @CliCommand(value = CliStrings.DESCRIBE_DISK_STORE, help = CliStrings.DESCRIBE_DISK_STORE__HELP)
   @CliMetaData(relatedTopic = {CliStrings.TOPIC_GEODE_DISKSTORE})
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.READ)
-  public Result describeDiskStore(
+  public ResultModel describeDiskStore(
       @CliOption(key = CliStrings.MEMBER, mandatory = true,
           optionContext = ConverterHint.MEMBERIDNAME,
           help = CliStrings.DESCRIBE_DISK_STORE__MEMBER__HELP) final String memberName,
@@ -50,7 +56,7 @@ public class DescribeDiskStoreCommand extends InternalGfshCommand {
           optionContext = ConverterHint.DISKSTORE,
           help = CliStrings.DESCRIBE_DISK_STORE__NAME__HELP) final String diskStoreName) {
 
-    return toCompositeResult(getDiskStoreDescription(memberName, diskStoreName));
+    return toResultModel(getDiskStoreDescription(memberName, diskStoreName));
 
   }
 
@@ -91,10 +97,10 @@ public class DescribeDiskStoreCommand extends InternalGfshCommand {
     }
   }
 
-  private Result toCompositeResult(final DiskStoreDetails diskStoreDetails) {
-    final CompositeResultData diskStoreData = ResultBuilder.createCompositeResultData();
+  private ResultModel toResultModel(final DiskStoreDetails diskStoreDetails) {
+    ResultModel result = new ResultModel();
 
-    final CompositeResultData.SectionResultData diskStoreSection = diskStoreData.addSection();
+    DataResultModel diskStoreSection = result.addData(DISK_STORE_SECTION);
 
     diskStoreSection.addData("Disk Store ID", diskStoreDetails.getId());
     diskStoreSection.addData("Disk Store Name", diskStoreDetails.getName());
@@ -115,14 +121,14 @@ public class DescribeDiskStoreCommand extends InternalGfshCommand {
     diskStoreSection.addData("PDX Serialization Meta-Data Stored",
         diskStoreDetails.isPdxSerializationMetaDataStored() ? "Yes" : "No");
 
-    final TabularResultData diskDirTable = diskStoreData.addSection().addTable();
+    final TabularResultModel diskDirTable = result.addTable(DISK_DIR_SECTION);
 
     for (DiskStoreDetails.DiskDirDetails diskDirDetails : diskStoreDetails) {
       diskDirTable.accumulate("Disk Directory", diskDirDetails.getAbsolutePath());
-      diskDirTable.accumulate("Size", diskDirDetails.getSize());
+      diskDirTable.accumulate("Size", Integer.toString(diskDirDetails.getSize()));
     }
 
-    final TabularResultData regionTable = diskStoreData.addSection().addTable();
+    final TabularResultModel regionTable = result.addTable(REGION_SECTION);
 
     for (DiskStoreDetails.RegionDetails regionDetails : diskStoreDetails.iterateRegions()) {
       regionTable.accumulate("Region Path", regionDetails.getFullPath());
@@ -131,29 +137,29 @@ public class DescribeDiskStoreCommand extends InternalGfshCommand {
       regionTable.accumulate("Overflow To Disk", regionDetails.isOverflowToDisk() ? "Yes" : "No");
     }
 
-    final TabularResultData cacheServerTable = diskStoreData.addSection().addTable();
+    final TabularResultModel cacheServerTable = result.addTable(CACHE_SERVER_SECTION);
 
     for (DiskStoreDetails.CacheServerDetails cacheServerDetails : diskStoreDetails
         .iterateCacheServers()) {
       cacheServerTable.accumulate("Bind Address", cacheServerDetails.getBindAddress());
       cacheServerTable.accumulate("Hostname for Clients", cacheServerDetails.getHostName());
-      cacheServerTable.accumulate("Port", cacheServerDetails.getPort());
+      cacheServerTable.accumulate("Port", Integer.toString(cacheServerDetails.getPort()));
     }
 
-    final TabularResultData gatewayTable = diskStoreData.addSection().addTable();
+    final TabularResultModel gatewayTable = result.addTable(GATEWAY_SECTION);
 
     for (DiskStoreDetails.GatewayDetails gatewayDetails : diskStoreDetails.iterateGateways()) {
       gatewayTable.accumulate("Gateway ID", gatewayDetails.getId());
       gatewayTable.accumulate("Persistent", gatewayDetails.isPersistent() ? "Yes" : "No");
     }
 
-    final TabularResultData asyncEventQueueTable = diskStoreData.addSection().addTable();
+    final TabularResultModel asyncEventQueueTable = result.addTable(ASYNC_EVENT_QUEUE_SECTION);
 
     for (DiskStoreDetails.AsyncEventQueueDetails asyncEventQueueDetails : diskStoreDetails
         .iterateAsyncEventQueues()) {
       asyncEventQueueTable.accumulate("Async Event Queue ID", asyncEventQueueDetails.getId());
     }
 
-    return ResultBuilder.buildResult(diskStoreData);
+    return result;
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyDiskStoreCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyDiskStoreCommand.java
index 0e06562..e266355 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyDiskStoreCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyDiskStoreCommand.java
@@ -21,26 +21,26 @@ import java.util.Set;
 import org.springframework.shell.core.annotation.CliCommand;
 import org.springframework.shell.core.annotation.CliOption;
 
+import org.apache.geode.cache.configuration.CacheConfig;
+import org.apache.geode.cache.configuration.CacheElement;
 import org.apache.geode.distributed.DistributedMember;
-import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.ConverterHint;
-import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.cli.SingleGfshCommand;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.cli.functions.DestroyDiskStoreFunction;
 import org.apache.geode.management.internal.cli.functions.DestroyDiskStoreFunctionArgs;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
-import org.apache.geode.management.internal.configuration.domain.XmlEntity;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
-public class DestroyDiskStoreCommand extends InternalGfshCommand {
+public class DestroyDiskStoreCommand extends SingleGfshCommand {
   @CliCommand(value = CliStrings.DESTROY_DISK_STORE, help = CliStrings.DESTROY_DISK_STORE__HELP)
   @CliMetaData(relatedTopic = {CliStrings.TOPIC_GEODE_DISKSTORE})
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.MANAGE, target = ResourcePermission.Target.DISK)
-  public Result destroyDiskStore(
+  public ResultModel destroyDiskStore(
       @CliOption(key = CliStrings.DESTROY_DISK_STORE__NAME, mandatory = true,
           help = CliStrings.DESTROY_DISK_STORE__NAME__HELP) String name,
       @CliOption(key = {CliStrings.GROUP, CliStrings.GROUPS},
@@ -52,7 +52,7 @@ public class DestroyDiskStoreCommand extends InternalGfshCommand {
     Set<DistributedMember> targetMembers = findMembers(groups, null);
 
     if (targetMembers.isEmpty()) {
-      return ResultBuilder.createUserErrorResult(CliStrings.NO_MEMBERS_FOUND_MESSAGE);
+      return ResultModel.createError(CliStrings.NO_MEMBERS_FOUND_MESSAGE);
     }
 
     DestroyDiskStoreFunctionArgs functionArgs = new DestroyDiskStoreFunctionArgs(name, ifExist);
@@ -60,15 +60,15 @@ public class DestroyDiskStoreCommand extends InternalGfshCommand {
     List<CliFunctionResult> results =
         executeAndGetFunctionResult(new DestroyDiskStoreFunction(), functionArgs, targetMembers);
 
-    Result result = ResultBuilder.buildResult(results);
-    XmlEntity xmlEntity = findXmlEntity(results);
-
-    if (xmlEntity != null) {
-      persistClusterConfiguration(result,
-          () -> ((InternalConfigurationPersistenceService) getConfigurationPersistenceService())
-              .deleteXmlEntity(xmlEntity, groups));
-    }
+    ResultModel result = ResultModel.createMemberStatusResult(results, ifExist);
+    result.setConfigObject(name);
 
     return result;
   }
+
+  @Override
+  public void updateClusterConfig(String group, CacheConfig config, Object configObject) {
+    String diskStoreName = (String) configObject;
+    CacheElement.removeElement(config.getDiskStores(), diskStoreName);
+  }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ExportOfflineDiskStoreCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ExportOfflineDiskStoreCommand.java
index 7d14cc7..bf20067 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ExportOfflineDiskStoreCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ExportOfflineDiskStoreCommand.java
@@ -23,16 +23,15 @@ import org.springframework.shell.core.annotation.CliOption;
 import org.apache.geode.SystemFailure;
 import org.apache.geode.internal.cache.DiskStoreImpl;
 import org.apache.geode.management.cli.CliMetaData;
-import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.LogWrapper;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
 
 public class ExportOfflineDiskStoreCommand extends InternalGfshCommand {
   @CliCommand(value = CliStrings.EXPORT_OFFLINE_DISK_STORE,
       help = CliStrings.EXPORT_OFFLINE_DISK_STORE__HELP)
   @CliMetaData(shellOnly = true, relatedTopic = {CliStrings.TOPIC_GEODE_DISKSTORE})
-  public Result exportOfflineDiskStore(
+  public ResultModel exportOfflineDiskStore(
       @CliOption(key = CliStrings.EXPORT_OFFLINE_DISK_STORE__DISKSTORENAME, mandatory = true,
           help = CliStrings.EXPORT_OFFLINE_DISK_STORE__DISKSTORENAME__HELP) String diskStoreName,
       @CliOption(key = CliStrings.EXPORT_OFFLINE_DISK_STORE__DISKDIRS, mandatory = true,
@@ -52,17 +51,17 @@ public class ExportOfflineDiskStoreCommand extends InternalGfshCommand {
       // not be moved to a separate process unless we provide a way for the user
       // to configure the size of that process.
       DiskStoreImpl.exportOfflineSnapshot(diskStoreName, dirs, output);
-      String resultString =
-          CliStrings.format(CliStrings.EXPORT_OFFLINE_DISK_STORE__SUCCESS, diskStoreName, dir);
-      return ResultBuilder.createInfoResult(resultString);
+
+      return ResultModel.createInfo(
+          CliStrings.format(CliStrings.EXPORT_OFFLINE_DISK_STORE__SUCCESS, diskStoreName, dir));
     } catch (VirtualMachineError e) {
       SystemFailure.initiateFailure(e);
       throw e;
     } catch (Throwable th) {
       SystemFailure.checkFailure();
       LogWrapper.getInstance(getCache()).warning(th.getMessage(), th);
-      return ResultBuilder.createGemFireErrorResult(CliStrings
-          .format(CliStrings.EXPORT_OFFLINE_DISK_STORE__ERROR, diskStoreName, th.toString()));
+      return ResultModel.createError(CliStrings.format(CliStrings.EXPORT_OFFLINE_DISK_STORE__ERROR,
+          diskStoreName, th.toString()));
     }
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ListDiskStoresCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ListDiskStoresCommand.java
index ac4e59b..5cdfcd0 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ListDiskStoresCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ListDiskStoresCommand.java
@@ -28,13 +28,12 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.cache.execute.AbstractExecution;
 import org.apache.geode.management.cli.CliMetaData;
-import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.domain.DiskStoreDetails;
 import org.apache.geode.management.internal.cli.functions.ListDiskStoresFunction;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
 import org.apache.geode.management.internal.cli.result.ResultDataException;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
@@ -43,13 +42,14 @@ public class ListDiskStoresCommand extends InternalGfshCommand {
   @CliMetaData(relatedTopic = {CliStrings.TOPIC_GEODE_DISKSTORE})
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.READ)
-  public Result listDiskStores() {
+  public ResultModel listDiskStores() {
     Set<DistributedMember> dataMembers =
         DiskStoreCommandsUtils.getNormalMembers((InternalCache) getCache());
 
     if (dataMembers.isEmpty()) {
-      return ResultBuilder.createInfoResult(CliStrings.NO_CACHING_MEMBERS_FOUND_MESSAGE);
+      return ResultModel.createInfo(CliStrings.NO_CACHING_MEMBERS_FOUND_MESSAGE);
     }
+
     return toTabularResult(getDiskStoreListing(dataMembers));
   }
 
@@ -78,22 +78,23 @@ public class ListDiskStoresCommand extends InternalGfshCommand {
     return distributedSystemMemberDiskStores;
   }
 
-  private Result toTabularResult(final List<DiskStoreDetails> diskStoreList)
+  private ResultModel toTabularResult(final List<DiskStoreDetails> diskStoreList)
       throws ResultDataException {
     if (!diskStoreList.isEmpty()) {
-      final TabularResultData diskStoreData = ResultBuilder.createTabularResultData();
+      ResultModel result = new ResultModel();
+      TabularResultModel diskStoreData =
+          result.addTable(DescribeDiskStoreCommand.DISK_STORE_SECTION);
 
       for (final DiskStoreDetails diskStoreDetails : diskStoreList) {
         diskStoreData.accumulate("Member Name", diskStoreDetails.getMemberName());
         diskStoreData.accumulate("Member Id", diskStoreDetails.getMemberId());
         diskStoreData.accumulate("Disk Store Name", diskStoreDetails.getName());
-        diskStoreData.accumulate("Disk Store ID", diskStoreDetails.getId());
+        diskStoreData.accumulate("Disk Store ID", diskStoreDetails.getId().toString());
       }
 
-      return ResultBuilder.buildResult(diskStoreData);
+      return result;
     } else {
-      return ResultBuilder
-          .createInfoResult(CliStrings.LIST_DISK_STORE__DISK_STORES_NOT_FOUND_MESSAGE);
+      return ResultModel.createInfo(CliStrings.LIST_DISK_STORE__DISK_STORES_NOT_FOUND_MESSAGE);
     }
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/RevokeMissingDiskStoreCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/RevokeMissingDiskStoreCommand.java
index ebb2a1c..1014a71 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/RevokeMissingDiskStoreCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/RevokeMissingDiskStoreCommand.java
@@ -18,13 +18,11 @@ package org.apache.geode.management.internal.cli.commands;
 import org.springframework.shell.core.annotation.CliCommand;
 import org.springframework.shell.core.annotation.CliOption;
 
-import org.apache.geode.SystemFailure;
 import org.apache.geode.management.DistributedSystemMXBean;
 import org.apache.geode.management.ManagementService;
 import org.apache.geode.management.cli.CliMetaData;
-import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
@@ -34,28 +32,16 @@ public class RevokeMissingDiskStoreCommand extends InternalGfshCommand {
   @CliMetaData(relatedTopic = {CliStrings.TOPIC_GEODE_DISKSTORE})
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.MANAGE, target = ResourcePermission.Target.DISK)
-  public Result revokeMissingDiskStore(@CliOption(key = CliStrings.REVOKE_MISSING_DISK_STORE__ID,
-      mandatory = true, help = CliStrings.REVOKE_MISSING_DISK_STORE__ID__HELP) String id) {
+  public ResultModel revokeMissingDiskStore(
+      @CliOption(key = CliStrings.REVOKE_MISSING_DISK_STORE__ID, mandatory = true,
+          help = CliStrings.REVOKE_MISSING_DISK_STORE__ID__HELP) String id) {
 
-    try {
-      DistributedSystemMXBean dsMXBean =
-          ManagementService.getManagementService(getCache()).getDistributedSystemMXBean();
-      if (dsMXBean.revokeMissingDiskStores(id)) {
-        return ResultBuilder.createInfoResult("Missing disk store successfully revoked");
-      }
-
-      return ResultBuilder.createUserErrorResult("Unable to find missing disk store to revoke");
-    } catch (VirtualMachineError e) {
-      SystemFailure.initiateFailure(e);
-      throw e;
-    } catch (Throwable th) {
-      SystemFailure.checkFailure();
-      if (th.getMessage() == null) {
-        return ResultBuilder.createGemFireErrorResult(
-            "An error occurred while revoking missing disk stores: " + th);
-      }
-      return ResultBuilder.createGemFireErrorResult(
-          "An error occurred while revoking missing disk stores: " + th.getMessage());
+    DistributedSystemMXBean dsMXBean =
+        ManagementService.getManagementService(getCache()).getDistributedSystemMXBean();
+    if (dsMXBean.revokeMissingDiskStores(id)) {
+      return ResultModel.createInfo("Missing disk store successfully revoked");
     }
+
+    return ResultModel.createError("Unable to find missing disk store to revoke");
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ShowMissingDiskStoreCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ShowMissingDiskStoreCommand.java
index 9c89184..4f6fe52 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ShowMissingDiskStoreCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ShowMissingDiskStoreCommand.java
@@ -21,9 +21,7 @@ import java.util.Set;
 
 import org.springframework.shell.core.annotation.CliCommand;
 
-import org.apache.geode.SystemFailure;
 import org.apache.geode.cache.execute.Execution;
-import org.apache.geode.cache.execute.FunctionInvocationTargetException;
 import org.apache.geode.cache.execute.ResultCollector;
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.internal.cache.InternalCache;
@@ -31,51 +29,37 @@ import org.apache.geode.internal.cache.execute.AbstractExecution;
 import org.apache.geode.internal.cache.partitioned.ColocatedRegionDetails;
 import org.apache.geode.internal.cache.persistence.PersistentMemberPattern;
 import org.apache.geode.management.cli.CliMetaData;
-import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.functions.ShowMissingDiskStoresFunction;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.CompositeResultData;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
 import org.apache.geode.management.internal.cli.result.ResultDataException;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
 public class ShowMissingDiskStoreCommand extends InternalGfshCommand {
+  public static final String MISSING_DISK_STORES_SECTION = "missing-disk-stores";
+  public static final String MISSING_COLOCATED_REGIONS_SECTION = "missing-colocated-regions";
+
   @CliCommand(value = CliStrings.SHOW_MISSING_DISK_STORE,
       help = CliStrings.SHOW_MISSING_DISK_STORE__HELP)
   @CliMetaData(relatedTopic = {CliStrings.TOPIC_GEODE_DISKSTORE})
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.READ)
-  public Result showMissingDiskStore() {
+  public ResultModel showMissingDiskStore() {
 
-    try {
-      Set<DistributedMember> dataMembers =
-          DiskStoreCommandsUtils.getNormalMembers((InternalCache) getCache());
+    Set<DistributedMember> dataMembers =
+        DiskStoreCommandsUtils.getNormalMembers((InternalCache) getCache());
 
-      if (dataMembers.isEmpty()) {
-        return ResultBuilder.createInfoResult(CliStrings.NO_CACHING_MEMBERS_FOUND_MESSAGE);
-      }
-      List<Object> results = getMissingDiskStoresList(dataMembers);
-      return toMissingDiskStoresTabularResult(results);
-    } catch (FunctionInvocationTargetException ignore) {
-      return ResultBuilder.createGemFireErrorResult(CliStrings.format(
-          CliStrings.COULD_NOT_EXECUTE_COMMAND_TRY_AGAIN, CliStrings.SHOW_MISSING_DISK_STORE));
-    } catch (VirtualMachineError e) {
-      SystemFailure.initiateFailure(e);
-      throw e;
-    } catch (Throwable t) {
-      SystemFailure.checkFailure();
-      if (t.getMessage() == null) {
-        return ResultBuilder.createGemFireErrorResult(
-            String.format(CliStrings.SHOW_MISSING_DISK_STORE__ERROR_MESSAGE, t));
-      }
-      return ResultBuilder.createGemFireErrorResult(
-          String.format(CliStrings.SHOW_MISSING_DISK_STORE__ERROR_MESSAGE, t.getMessage()));
+    if (dataMembers.isEmpty()) {
+      return ResultModel.createInfo(CliStrings.NO_CACHING_MEMBERS_FOUND_MESSAGE);
     }
+    List<?> results = getMissingDiskStoresList(dataMembers);
+
+    return toMissingDiskStoresTabularResult(results);
   }
 
-  private List<Object> getMissingDiskStoresList(Set<DistributedMember> members) {
+  private List<?> getMissingDiskStoresList(Set<DistributedMember> members) {
     final Execution membersFunctionExecutor = getMembersFunctionExecutor(members);
     if (membersFunctionExecutor instanceof AbstractExecution) {
       ((AbstractExecution) membersFunctionExecutor).setIgnoreDepartedMembers(true);
@@ -85,18 +69,18 @@ public class ShowMissingDiskStoreCommand extends InternalGfshCommand {
         membersFunctionExecutor.execute(new ShowMissingDiskStoresFunction());
 
     final List<?> results = (List<?>) resultCollector.getResult();
-    final List<Object> distributedPersistentRecoveryDetails = new ArrayList<>(results.size());
+    final List<?> distributedPersistentRecoveryDetails = new ArrayList<>(results.size());
     for (final Object result : results) {
       if (result instanceof Set) {
-        distributedPersistentRecoveryDetails.addAll((Set<Object>) result);
+        distributedPersistentRecoveryDetails.addAll((Set) result);
       }
     }
     return distributedPersistentRecoveryDetails;
   }
 
-  private Result toMissingDiskStoresTabularResult(final List<Object> resultDetails)
+  private ResultModel toMissingDiskStoresTabularResult(final List<?> resultDetails)
       throws ResultDataException {
-    CompositeResultData crd = ResultBuilder.createCompositeResultData();
+    ResultModel result = new ResultModel();
     List<PersistentMemberPattern> missingDiskStores = new ArrayList<>();
     List<ColocatedRegionDetails> missingColocatedRegions = new ArrayList<>();
 
@@ -112,40 +96,36 @@ public class ShowMissingDiskStoreCommand extends InternalGfshCommand {
 
     boolean hasMissingDiskStores = !missingDiskStores.isEmpty();
     boolean hasMissingColocatedRegions = !missingColocatedRegions.isEmpty();
+    TabularResultModel missingDiskStoreSection = result.addTable(MISSING_DISK_STORES_SECTION);
+
     if (hasMissingDiskStores) {
-      CompositeResultData.SectionResultData missingDiskStoresSection = crd.addSection();
-      missingDiskStoresSection.setHeader("Missing Disk Stores");
-      TabularResultData missingDiskStoreData = missingDiskStoresSection.addTable();
+      missingDiskStoreSection.setHeader("Missing Disk Stores");
 
       for (PersistentMemberPattern persistentMemberDetails : missingDiskStores) {
-        missingDiskStoreData.accumulate("Disk Store ID", persistentMemberDetails.getUUID());
-        missingDiskStoreData.accumulate("Host", persistentMemberDetails.getHost());
-        missingDiskStoreData.accumulate("Directory", persistentMemberDetails.getDirectory());
+        missingDiskStoreSection.accumulate("Disk Store ID",
+            persistentMemberDetails.getUUID().toString());
+        missingDiskStoreSection.accumulate("Host", persistentMemberDetails.getHost().toString());
+        missingDiskStoreSection.accumulate("Directory", persistentMemberDetails.getDirectory());
       }
     } else {
-      CompositeResultData.SectionResultData noMissingDiskStores = crd.addSection();
-      noMissingDiskStores.setHeader("No missing disk store found");
-    }
-    if (hasMissingDiskStores || hasMissingColocatedRegions) {
-      // For clarity, separate disk store and colocated region information
-      crd.addSection().setHeader("\n");
+      missingDiskStoreSection.setHeader("No missing disk store found");
     }
 
+    TabularResultModel missingRegionsSection = result.addTable(MISSING_COLOCATED_REGIONS_SECTION);
     if (hasMissingColocatedRegions) {
-      CompositeResultData.SectionResultData missingRegionsSection = crd.addSection();
       missingRegionsSection.setHeader("Missing Colocated Regions");
-      TabularResultData missingRegionData = missingRegionsSection.addTable();
 
       for (ColocatedRegionDetails colocatedRegionDetails : missingColocatedRegions) {
-        missingRegionData.accumulate("Host", colocatedRegionDetails.getHost());
-        missingRegionData.accumulate("Distributed Member", colocatedRegionDetails.getMember());
-        missingRegionData.accumulate("Parent Region", colocatedRegionDetails.getParent());
-        missingRegionData.accumulate("Missing Colocated Region", colocatedRegionDetails.getChild());
+        missingRegionsSection.accumulate("Host", colocatedRegionDetails.getHost());
+        missingRegionsSection.accumulate("Distributed Member", colocatedRegionDetails.getMember());
+        missingRegionsSection.accumulate("Parent Region", colocatedRegionDetails.getParent());
+        missingRegionsSection.accumulate("Missing Colocated Region",
+            colocatedRegionDetails.getChild());
       }
     } else {
-      CompositeResultData.SectionResultData noMissingColocatedRegions = crd.addSection();
-      noMissingColocatedRegions.setHeader("No missing colocated region found");
+      missingRegionsSection.setHeader("No missing colocated region found");
     }
-    return ResultBuilder.buildResult(crd);
+
+    return result;
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/UpgradeOfflineDiskStoreCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/UpgradeOfflineDiskStoreCommand.java
index 3579dcc..dcf15a7 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/UpgradeOfflineDiskStoreCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/UpgradeOfflineDiskStoreCommand.java
@@ -17,32 +17,29 @@ package org.apache.geode.management.internal.cli.commands;
 
 import java.io.BufferedReader;
 import java.io.File;
-import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import org.springframework.shell.core.annotation.CliCommand;
 import org.springframework.shell.core.annotation.CliOption;
 
-import org.apache.geode.GemFireIOException;
-import org.apache.geode.internal.lang.StringUtils;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.Result;
-import org.apache.geode.management.internal.cli.GfshParser;
 import org.apache.geode.management.internal.cli.LogWrapper;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
-import org.apache.geode.management.internal.cli.shell.Gfsh;
+import org.apache.geode.management.internal.cli.result.model.InfoResultModel;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
 import org.apache.geode.management.internal.cli.util.DiskStoreUpgrader;
 
 public class UpgradeOfflineDiskStoreCommand extends InternalGfshCommand {
   @CliCommand(value = CliStrings.UPGRADE_OFFLINE_DISK_STORE,
       help = CliStrings.UPGRADE_OFFLINE_DISK_STORE__HELP)
   @CliMetaData(shellOnly = true, relatedTopic = {CliStrings.TOPIC_GEODE_DISKSTORE})
-  public Result upgradeOfflineDiskStore(
+  public ResultModel upgradeOfflineDiskStore(
       @CliOption(key = CliStrings.UPGRADE_OFFLINE_DISK_STORE__NAME, mandatory = true,
           help = CliStrings.UPGRADE_OFFLINE_DISK_STORE__NAME__HELP) String diskStoreName,
       @CliOption(key = CliStrings.UPGRADE_OFFLINE_DISK_STORE__DISKDIRS, mandatory = true,
@@ -53,12 +50,10 @@ public class UpgradeOfflineDiskStoreCommand extends InternalGfshCommand {
       @CliOption(key = CliStrings.UPGRADE_OFFLINE_DISK_STORE__J,
           help = CliStrings.UPGRADE_OFFLINE_DISK_STORE__J__HELP) String[] jvmProps) {
 
-    Result result;
+    ResultModel result = new ResultModel();
+    InfoResultModel infoResult = result.addInfo();
     LogWrapper logWrapper = LogWrapper.getInstance(getCache());
 
-    StringBuilder output = new StringBuilder();
-    StringBuilder error = new StringBuilder();
-    StringBuilder errorMessage = new StringBuilder();
     Process upgraderProcess = null;
 
     try {
@@ -103,62 +98,26 @@ public class UpgradeOfflineDiskStoreCommand extends InternalGfshCommand {
       commandList.add(CliStrings.UPGRADE_OFFLINE_DISK_STORE__MAXOPLOGSIZE + "=" + maxOplogSize);
 
       ProcessBuilder procBuilder = new ProcessBuilder(commandList);
-      // procBuilder.redirectErrorStream(true);
+      procBuilder.redirectErrorStream(true);
       upgraderProcess = procBuilder.start();
+
       InputStream inputStream = upgraderProcess.getInputStream();
-      InputStream errorStream = upgraderProcess.getErrorStream();
       BufferedReader inputReader = new BufferedReader(new InputStreamReader(inputStream));
-      BufferedReader errorReader = new BufferedReader(new InputStreamReader(errorStream));
 
       String line;
       while ((line = inputReader.readLine()) != null) {
-        output.append(line).append(GfshParser.LINE_SEPARATOR);
-      }
-
-      boolean switchToStackTrace = false;
-      while ((line = errorReader.readLine()) != null) {
-        if (!switchToStackTrace && DiskStoreUpgrader.STACKTRACE_START.equals(line)) {
-          switchToStackTrace = true;
-        } else if (switchToStackTrace) {
-          error.append(line).append(GfshParser.LINE_SEPARATOR);
-        } else {
-          errorMessage.append(line);
-        }
-      }
-
-      if (errorMessage.length() > 0) {
-        throw new GemFireIOException(errorMessage.toString());
+        infoResult.addLine(line);
       }
 
-      upgraderProcess.destroy();
-      result = ResultBuilder.createInfoResult(output.toString());
-    } catch (IOException e) {
-      if (output.length() != 0) {
-        Gfsh.println(output.toString());
+      upgraderProcess.waitFor(2, TimeUnit.SECONDS);
+      if (upgraderProcess.exitValue() != 0) {
+        result.setStatus(Result.Status.ERROR);
       }
-      String fieldsMessage = (maxOplogSize != -1
-          ? CliStrings.UPGRADE_OFFLINE_DISK_STORE__MAXOPLOGSIZE + "=" + maxOplogSize + "," : "");
-      fieldsMessage += StringUtils.arrayToString(diskDirs);
-      String errorString = CliStrings.format(
-          CliStrings.UPGRADE_OFFLINE_DISK_STORE__MSG__ERROR_WHILE_COMPACTING_DISKSTORE_0_WITH_1_REASON_2,
-          diskStoreName, fieldsMessage);
-      result = ResultBuilder.createUserErrorResult(errorString);
-      if (logWrapper.fineEnabled()) {
-        logWrapper.fine(e.getMessage(), e);
-      }
-    } catch (GemFireIOException e) {
-      if (output.length() != 0) {
-        Gfsh.println(output.toString());
-      }
-      result = ResultBuilder.createUserErrorResult(errorMessage.toString());
-      if (logWrapper.fineEnabled()) {
-        logWrapper.fine(error.toString());
-      }
-    } catch (IllegalArgumentException e) {
-      if (output.length() != 0) {
-        Gfsh.println(output.toString());
-      }
-      result = ResultBuilder.createUserErrorResult(e.getMessage());
+    } catch (Exception e) {
+      infoResult.addLine(
+          String.format("Error upgrading disk store %s: %s", diskStoreName, e.getMessage()));
+      result.setStatus(Result.Status.ERROR);
+      logWrapper.warning(e.getMessage(), e);
     } finally {
       if (upgraderProcess != null) {
         try {
@@ -171,6 +130,7 @@ public class UpgradeOfflineDiskStoreCommand extends InternalGfshCommand {
         }
       }
     }
+
     return result;
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ValidateDiskStoreCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ValidateDiskStoreCommand.java
index c7b2044..d25326a 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ValidateDiskStoreCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ValidateDiskStoreCommand.java
@@ -17,33 +17,40 @@ package org.apache.geode.management.internal.cli.commands;
 
 import java.io.BufferedReader;
 import java.io.File;
-import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import org.springframework.shell.core.annotation.CliCommand;
 import org.springframework.shell.core.annotation.CliOption;
 
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.Result;
-import org.apache.geode.management.internal.cli.GfshParser;
+import org.apache.geode.management.internal.cli.LogWrapper;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
+import org.apache.geode.management.internal.cli.result.model.InfoResultModel;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
 import org.apache.geode.management.internal.cli.util.DiskStoreValidater;
 
 public class ValidateDiskStoreCommand extends InternalGfshCommand {
   @CliCommand(value = CliStrings.VALIDATE_DISK_STORE, help = CliStrings.VALIDATE_DISK_STORE__HELP)
   @CliMetaData(shellOnly = true, relatedTopic = {CliStrings.TOPIC_GEODE_DISKSTORE})
-  public Result validateDiskStore(
+  public ResultModel validateDiskStore(
       @CliOption(key = CliStrings.VALIDATE_DISK_STORE__NAME, mandatory = true,
           help = CliStrings.VALIDATE_DISK_STORE__NAME__HELP) String diskStoreName,
       @CliOption(key = CliStrings.VALIDATE_DISK_STORE__DISKDIRS, mandatory = true,
           help = CliStrings.VALIDATE_DISK_STORE__DISKDIRS__HELP) String[] diskDirs,
       @CliOption(key = CliStrings.VALIDATE_DISK_STORE__J,
           help = CliStrings.VALIDATE_DISK_STORE__J__HELP) String[] jvmProps) {
+
+    ResultModel result = new ResultModel();
+    InfoResultModel infoResult = result.addInfo();
+    LogWrapper logWrapper = LogWrapper.getInstance(getCache());
+    Process validateDiskStoreProcess = null;
+
     try {
       // create a new process ...bug 46075
       StringBuilder dirList = new StringBuilder();
@@ -74,31 +81,40 @@ public class ValidateDiskStoreCommand extends InternalGfshCommand {
       commandList.add(dirList.toString());
 
       ProcessBuilder procBuilder = new ProcessBuilder(commandList);
-      StringBuilder output = new StringBuilder();
-      String errorString = "";
+      procBuilder.redirectErrorStream(true);
 
-      Process validateDiskStoreProcess = procBuilder.redirectErrorStream(true).start();
+      validateDiskStoreProcess = procBuilder.redirectErrorStream(true).start();
       InputStream inputStream = validateDiskStoreProcess.getInputStream();
       BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
-      String line;
 
+      String line;
       while ((line = br.readLine()) != null) {
-        output.append(line).append(GfshParser.LINE_SEPARATOR);
+        infoResult.addLine(line);
+      }
+
+      validateDiskStoreProcess.waitFor(2, TimeUnit.SECONDS);
+      if (validateDiskStoreProcess.exitValue() != 0) {
+        result.setStatus(Result.Status.ERROR);
+      }
+    } catch (Exception e) {
+      infoResult.addLine(
+          String.format("Error compacting disk store %s: %s", diskStoreName, e.getMessage()));
+      result.setStatus(Result.Status.ERROR);
+      logWrapper.warning(e.getMessage(), e);
+    } finally {
+      if (validateDiskStoreProcess != null) {
+        try {
+          // just to check whether the process has exited
+          // Process.exitValue() throws IllegalThreadStateException if Process
+          // is alive
+          validateDiskStoreProcess.exitValue();
+        } catch (IllegalThreadStateException ise) {
+          // not yet terminated, destroy the process
+          validateDiskStoreProcess.destroy();
+        }
       }
-      validateDiskStoreProcess.destroy();
-
-      output.append(errorString).append(GfshParser.LINE_SEPARATOR);
-      String resultString =
-          "Validating " + diskStoreName + GfshParser.LINE_SEPARATOR + output.toString();
-      return ResultBuilder.createInfoResult(resultString);
-    } catch (IOException ex) {
-      return ResultBuilder.createGemFireErrorResult(CliStrings
-          .format(CliStrings.VALIDATE_DISK_STORE__MSG__IO_ERROR, diskStoreName, ex.getMessage()));
-    } catch (Exception ex) {
-      // StringPrintWriter s = new StringPrintWriter();
-      // ex.printStackTrace(s);
-      return ResultBuilder.createGemFireErrorResult(CliStrings
-          .format(CliStrings.VALIDATE_DISK_STORE__MSG__ERROR, diskStoreName, ex.getMessage()));
     }
+
+    return result;
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CreateDiskStoreFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CreateDiskStoreFunction.java
index 5a52d04..bce28c2 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CreateDiskStoreFunction.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CreateDiskStoreFunction.java
@@ -20,62 +20,29 @@ package org.apache.geode.management.internal.cli.functions;
  * @since GemFire 8.0
  */
 
-import org.apache.logging.log4j.Logger;
-
-import org.apache.geode.SystemFailure;
-import org.apache.geode.cache.CacheClosedException;
 import org.apache.geode.cache.DiskStoreFactory;
 import org.apache.geode.cache.execute.FunctionContext;
-import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.internal.cache.DiskStoreAttributes;
 import org.apache.geode.internal.cache.InternalCache;
-import org.apache.geode.internal.cache.execute.InternalFunction;
-import org.apache.geode.internal.cache.xmlcache.CacheXml;
-import org.apache.geode.internal.logging.LogService;
-import org.apache.geode.management.internal.configuration.domain.XmlEntity;
+import org.apache.geode.management.cli.CliFunction;
+import org.apache.geode.management.cli.Result;
 
-public class CreateDiskStoreFunction implements InternalFunction {
-  private static final Logger logger = LogService.getLogger();
+public class CreateDiskStoreFunction extends CliFunction {
 
   private static final long serialVersionUID = 1L;
 
   @Override
-  public void execute(FunctionContext context) {
-    // Declared here so that it's available when returning a Throwable
-    String memberId = "";
-    try {
-      final Object[] args = (Object[]) context.getArguments();
-      final String diskStoreName = (String) args[0];
-      final DiskStoreAttributes diskStoreAttrs = (DiskStoreAttributes) args[01];
-
-      InternalCache cache = (InternalCache) context.getCache();
-
-      DistributedMember member = cache.getDistributedSystem().getDistributedMember();
-
-      memberId = member.getId();
-      // If they set a name use it instead
-      if (!member.getName().equals("")) {
-        memberId = member.getName();
-      }
-
-      DiskStoreFactory diskStoreFactory = cache.createDiskStoreFactory(diskStoreAttrs);
-      diskStoreFactory.create(diskStoreName);
-
-      XmlEntity xmlEntity = new XmlEntity(CacheXml.DISK_STORE, "name", diskStoreName);
-      context.getResultSender().lastResult(new CliFunctionResult(memberId, xmlEntity, "Success"));
-
-    } catch (CacheClosedException cce) {
-      context.getResultSender().lastResult(new CliFunctionResult(memberId, false, null));
+  public CliFunctionResult executeFunction(FunctionContext context) {
+    final Object[] args = (Object[]) context.getArguments();
+    final String diskStoreName = (String) args[0];
+    final DiskStoreAttributes diskStoreAttrs = (DiskStoreAttributes) args[1];
 
-    } catch (VirtualMachineError e) {
-      SystemFailure.initiateFailure(e);
-      throw e;
+    InternalCache cache = (InternalCache) context.getCache();
+    DiskStoreFactory diskStoreFactory = cache.createDiskStoreFactory(diskStoreAttrs);
+    diskStoreFactory.create(diskStoreName);
 
-    } catch (Throwable th) {
-      SystemFailure.checkFailure();
-      logger.error("Could not create disk store: {}", th.getMessage(), th);
-      context.getResultSender().lastResult(new CliFunctionResult(memberId, th, null));
-    }
+    return new CliFunctionResult(context.getMemberName(), Result.Status.OK,
+        "Created disk store " + diskStoreName);
   }
 
   @Override
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/DiskStoreCompacter.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/DiskStoreCompacter.java
index 72e5d13..4221443 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/DiskStoreCompacter.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/DiskStoreCompacter.java
@@ -47,6 +47,7 @@ public class DiskStoreCompacter {
     String[] diskDirs = null;;
     String maxOpLogSize = null;;
     long maxOplogSize = -1;
+    boolean errored = false;
     try {
       if (args.length < 3) {
         throw new IllegalArgumentException(
@@ -70,6 +71,7 @@ public class DiskStoreCompacter {
 
       compact(diskStoreName, diskDirs, maxOplogSize);
     } catch (GemFireIOException e) {
+      errored = true;
       Throwable cause = e.getCause();
       if (cause instanceof IllegalStateException) {
         String message = cause.getMessage();
@@ -104,6 +106,7 @@ public class DiskStoreCompacter {
       }
       stackTraceString = ExceptionUtils.getStackTrace(e);
     } catch (IllegalArgumentException e) {
+      errored = true;
       errorString = e.getMessage();
       stackTraceString = ExceptionUtils.getStackTrace(e);
     } finally {
@@ -114,6 +117,10 @@ public class DiskStoreCompacter {
         System.err.println(STACKTRACE_START);
         System.err.println(stackTraceString);
       }
+
+      if (errored) {
+        System.exit(1);
+      }
     }
   }
 
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/DiskStoreUpgrader.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/DiskStoreUpgrader.java
index 75cd42c..110f528 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/DiskStoreUpgrader.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/DiskStoreUpgrader.java
@@ -58,6 +58,7 @@ public class DiskStoreUpgrader {
           "Requires 3 arguments : <diskStoreName> <diskDirs> <maxOpLogSize>");
     }
 
+    boolean errored = false;
     try {
       diskStoreName = prop.getProperty(CliStrings.UPGRADE_OFFLINE_DISK_STORE__NAME);
       diskDirsStr = prop.getProperty(CliStrings.UPGRADE_OFFLINE_DISK_STORE__DISKDIRS);
@@ -67,6 +68,7 @@ public class DiskStoreUpgrader {
 
       upgrade(diskStoreName, diskDirs, maxOplogSize);
     } catch (GemFireIOException e) {
+      errored = true;
       Throwable cause = e.getCause();
       if (cause instanceof IllegalStateException) {
         String message = cause.getMessage();
@@ -101,6 +103,7 @@ public class DiskStoreUpgrader {
       }
       stackTraceString = ExceptionUtils.getStackTrace(e);
     } catch (IllegalArgumentException e) {
+      errored = true;
       errorString = e.getMessage();
       stackTraceString = ExceptionUtils.getStackTrace(e);
     } finally {
@@ -111,6 +114,10 @@ public class DiskStoreUpgrader {
         System.err.println(STACKTRACE_START);
         System.err.println(stackTraceString);
       }
+
+      if (errored) {
+        System.exit(1);
+      }
     }
   }
 
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/DiskStoreValidater.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/DiskStoreValidater.java
index 1fe6852..01b179a 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/DiskStoreValidater.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/DiskStoreValidater.java
@@ -27,29 +27,29 @@ import org.apache.geode.management.internal.cli.i18n.CliStrings;
 
 public class DiskStoreValidater {
   public static void main(String[] args) {
-    if (args.length < 2 || args.length > 2) {
-      throw new IllegalArgumentException("Requires only 2  arguments : <DiskStore> <Dirs>");
+    try {
+      if (args.length < 2 || args.length > 2) {
+        throw new IllegalArgumentException("Requires only 2  arguments : <DiskStore> <Dirs>");
+      }
+      validate(args[0], args[1]);
+    } catch (Exception ex) {
+      ex.printStackTrace();
+      System.exit(1);
     }
-    validate((String) args[0], (String) args[1]);
   }
 
-  static void validate(String diskStoreName, String diskDirs) {
-    try {
-      File[] dirs = null;
-      String[] dirList = null;
-      dirList = diskDirs.split(";");
-      if (dirList != null && dirList.length > 0) {
-        dirs = new File[dirList.length];
-        for (int i = 0; i < dirList.length; ++i) {
-          dirs[i] = new File(dirList[i]);
-        }
-      } else {
-        System.out.println(CliStrings.VALIDATE_DISK_STORE__MSG__NO_DIRS);
+  static void validate(String diskStoreName, String diskDirs) throws Exception {
+    File[] dirs = null;
+    String[] dirList = null;
+    dirList = diskDirs.split(";");
+    if (dirList != null && dirList.length > 0) {
+      dirs = new File[dirList.length];
+      for (int i = 0; i < dirList.length; ++i) {
+        dirs[i] = new File(dirList[i]);
       }
-      DiskStoreImpl.validate(diskStoreName, dirs);
-    } catch (Exception e) {
-      System.out.println(CliStrings.format(CliStrings.VALIDATE_DISK_STORE__MSG__ERROR,
-          diskStoreName, e.getMessage()));
+    } else {
+      System.out.println(CliStrings.VALIDATE_DISK_STORE__MSG__NO_DIRS);
     }
+    DiskStoreImpl.validate(diskStoreName, dirs);
   }
 }
diff --git a/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt b/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt
index 84e6546..929dbb1 100644
--- a/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt
+++ b/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt
@@ -123,6 +123,7 @@ org/apache/geode/cache/client/internal/pooling/ConnectionDestroyedException,true
 org/apache/geode/cache/configuration/CacheConfig$AsyncEventQueue,false,asyncEventListener:org/apache/geode/cache/configuration/DeclarableType,batchSize:java/lang/String,batchTimeInterval:java/lang/String,diskStoreName:java/lang/String,diskSynchronous:java/lang/Boolean,dispatcherThreads:java/lang/String,enableBatchConflation:java/lang/Boolean,forwardExpirationDestroy:java/lang/Boolean,gatewayEventFilters:java/util/List,gatewayEventSubstitutionFilter:org/apache/geode/cache/configuration/De [...]
 org/apache/geode/cache/configuration/ClassNameType,false,className:java/lang/String
 org/apache/geode/cache/configuration/DeclarableType,false,parameters:java/util/List
+org/apache/geode/cache/configuration/DiskStoreType,false,allowForceCompaction:java/lang/Boolean,autoCompact:java/lang/Boolean,compactionThreshold:java/lang/String,diskDirs:org/apache/geode/cache/configuration/DiskDirsType,diskUsageCriticalPercentage:java/lang/String,diskUsageWarningPercentage:java/lang/String,maxOplogSize:java/lang/String,name:java/lang/String,queueSize:java/lang/String,timeInterval:java/lang/String,writeBufferSize:java/lang/String
 org/apache/geode/cache/configuration/EnumActionDestroyOverflow,false,value:java/lang/String
 org/apache/geode/cache/configuration/EnumReadableWritable,false,value:java/lang/String
 org/apache/geode/cache/configuration/JndiBindingsType$JndiBinding,false,blockingTimeoutSeconds:java/lang/String,configProperties:java/util/List,connPooledDatasourceClass:java/lang/String,connectionUrl:java/lang/String,idleTimeoutSeconds:java/lang/String,initPoolSize:java/lang/String,jdbcDriverClass:java/lang/String,jndiName:java/lang/String,loginTimeoutSeconds:java/lang/String,managedConnFactoryClass:java/lang/String,maxPoolSize:java/lang/String,password:java/lang/String,transactionType: [...]