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 <jde...@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: [...]