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

upthewaterspout 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 8e32605  GEODE-6329, GEODE-6328: Fix issues with show 
missing-disk-stores (#3136)
8e32605 is described below

commit 8e32605e8ca026eb28f4c6095dfbcaca5cbd09a1
Author: Dan Smith <[email protected]>
AuthorDate: Thu Jan 31 15:23:20 2019 -0800

    GEODE-6329, GEODE-6328: Fix issues with show missing-disk-stores (#3136)
    
    * Using consistent logic for finding missing disk stores
    
    The gfsh command for finding missing disk stores was not ignoring
    present disk stores. However, the JMX command was. The gfsh command was 
also not deduplicating the missing disk stores. Changing the gfsh command to 
use the JMX logic.
    
    * Making sure member is removed from persistent view
    
    When we start up a member that has persistent data that it should delete
    (due to already established redundancy), the member was not correctly
    removing members from it's persistent view in
    PersistenceAdvisorImpl.updateMembershipView. This was due to the fact
    that the destroyOfflineData method was clearing the recoveredMembers
    set, but not the underlying persistentMemberView.
    
    The persistentMemberView probably should be preserved, in case the
    member is killed and restarted before it gets a new view. So we should
    reset the recoveredMembers set to the correct value.
    
    * Simplifying the logic for reporting present disk stores
    
    The logic for reporting what disk stores were actually running on a
    node, for the purposes of not reporting those disk stores as missing,
    was overly complicated. Due to that, it only included disk stores that
    actually had any persistent regions/buckets on that node, rather than
    all disk stores.
    
    Refactoring the code to just list all disk stores.
---
 ...PersistentPartitionedRegionDistributedTest.java |  44 ++++++
 .../PersistentRecoveryOrderDUnitTest.java          |   6 +-
 .../geode/management/DiskManagementDUnitTest.java  |  10 +-
 .../ShowMissingDiskStoreCommandDUnitTest.java      | 167 +++++++++++++++++++++
 .../commands/ShowMissingDiskStoresDUnitTest.java   | 152 -------------------
 .../admin/remote/MissingPersistentIDsRequest.java  |   7 +-
 .../geode/internal/cache/AbstractDiskRegion.java   |   2 +-
 .../apache/geode/internal/cache/DiskStoreImpl.java |   2 +-
 .../geode/internal/cache/PartitionedRegion.java    |   2 +-
 .../cache/partitioned/RedundancyLogger.java        |   2 +-
 .../cache/persistence/PersistenceAdvisorImpl.java  |  13 +-
 .../cache/persistence/PersistentMemberManager.java |  19 ---
 .../internal/beans/DistributedSystemBridge.java    |   4 +-
 .../cli/commands/ShowMissingDiskStoreCommand.java  |  60 ++++----
 14 files changed, 262 insertions(+), 228 deletions(-)

diff --git 
a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/partitioned/PersistentPartitionedRegionDistributedTest.java
 
b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/partitioned/PersistentPartitionedRegionDistributedTest.java
index 3466a23..956e44d 100644
--- 
a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/partitioned/PersistentPartitionedRegionDistributedTest.java
+++ 
b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/partitioned/PersistentPartitionedRegionDistributedTest.java
@@ -59,6 +59,7 @@ import org.junit.runner.RunWith;
 import org.apache.geode.admin.AdminDistributedSystem;
 import org.apache.geode.admin.AdminException;
 import org.apache.geode.admin.DistributedSystemConfig;
+import org.apache.geode.admin.internal.AdminDistributedSystemImpl;
 import org.apache.geode.cache.CacheClosedException;
 import org.apache.geode.cache.DiskAccessException;
 import org.apache.geode.cache.PartitionAttributesFactory;
@@ -1269,6 +1270,49 @@ public class PersistentPartitionedRegionDistributedTest 
implements Serializable
     });
   }
 
+  @Test
+  public void rebalanceWithMembersOfflineDoesNotResultInMissingDiskStores() 
throws Exception {
+    int numBuckets = 12;
+
+    vm0.invoke(() -> createPartitionedRegion(1, -1, numBuckets, true));
+    vm1.invoke(() -> createPartitionedRegion(1, -1, numBuckets, true));
+    vm2.invoke(() -> createPartitionedRegion(1, -1, numBuckets, true));
+    vm3.invoke(() -> createPartitionedRegion(1, -1, numBuckets, true));
+
+    vm0.invoke(() -> createData(0, numBuckets, "a"));
+
+    // Stop vm0, rebalance, stop vm1, rebalance
+    vm0.invoke(() -> getCache().close());
+    rebalance(vm3);
+    vm1.invoke(() -> getCache().close());
+    rebalance(vm3);
+
+    // Check missing disk stores (should include vm0 and vm1)
+    Set<PersistentID> missingMembers = getMissingPersistentMembers(vm3);
+    assertThat(missingMembers).hasSize(2);
+
+    vm1.invoke(() -> createPartitionedRegion(1, -1, numBuckets, true));
+    vm0.invoke(() -> createPartitionedRegion(1, -1, numBuckets, true));
+
+
+    missingMembers = getMissingPersistentMembers(vm3);
+    assertThat(missingMembers).isEmpty();
+  }
+
+  private void rebalance(VM vm) {
+    vm.invoke(() -> 
getCache().getResourceManager().createRebalanceFactory().start().getResults());
+  }
+
+  private void revokePersistentMember(PersistentID missingMember, VM vm) {
+    vm.invoke(() -> AdminDistributedSystemImpl
+        .revokePersistentMember(getCache().getDistributionManager(), 
missingMember.getUUID()));
+  }
+
+  private Set<PersistentID> getMissingPersistentMembers(VM vm) {
+    return vm.invoke(() -> AdminDistributedSystemImpl
+        .getMissingPersistentMembers(getCache().getDistributionManager()));
+  }
+
   private void moveBucketToMe(final int bucketId, final 
InternalDistributedMember sourceMember) {
     PartitionedRegion region = (PartitionedRegion) 
getCache().getRegion(partitionedRegionName);
     assertThat(region.getDataStore().moveBucket(bucketId, sourceMember, 
false)).isTrue();
diff --git 
a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/persistence/PersistentRecoveryOrderDUnitTest.java
 
b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/persistence/PersistentRecoveryOrderDUnitTest.java
index 4ee0f37..bc41513 100644
--- 
a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/persistence/PersistentRecoveryOrderDUnitTest.java
+++ 
b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/persistence/PersistentRecoveryOrderDUnitTest.java
@@ -415,17 +415,17 @@ public class PersistentRecoveryOrderDUnitTest extends 
PersistentReplicatedTestBa
     });
 
     getLogWriter().info("closing region in vm0");
-    closeRegion(vm0);
+    closeCache(vm0);
 
     updateTheEntry(vm1);
 
     getLogWriter().info("closing region in vm1");
-    closeRegion(vm1);
+    closeCache(vm1);
 
     updateTheEntry(vm2, "D");
 
     getLogWriter().info("closing region in vm2");
-    closeRegion(vm2);
+    closeCache(vm2);
 
 
     // These ought to wait for VM2 to come back
diff --git 
a/geode-core/src/distributedTest/java/org/apache/geode/management/DiskManagementDUnitTest.java
 
b/geode-core/src/distributedTest/java/org/apache/geode/management/DiskManagementDUnitTest.java
index 76b976e..4b7ea10 100644
--- 
a/geode-core/src/distributedTest/java/org/apache/geode/management/DiskManagementDUnitTest.java
+++ 
b/geode-core/src/distributedTest/java/org/apache/geode/management/DiskManagementDUnitTest.java
@@ -152,14 +152,14 @@ public class DiskManagementDUnitTest implements 
Serializable {
       DistributedSystemMXBean distributedSystemMXBean = 
service.getDistributedSystemMXBean();
       PersistentMemberDetails[] missingDiskStores = 
distributedSystemMXBean.listMissingDiskStores();
 
-      assertThat(missingDiskStores).isNull();
+      assertThat(missingDiskStores).isEmpty();
     });
 
-    closeRegion(memberVM1);
+    closeCache(memberVM1);
 
     updateTheEntry(memberVM2, "C");
 
-    closeRegion(memberVM2);
+    closeCache(memberVM2);
 
     AsyncInvocation creatingPersistentRegionAsync = 
createPersistentRegionAsync(memberVM1);
 
@@ -333,11 +333,11 @@ public class DiskManagementDUnitTest implements 
Serializable {
     });
   }
 
-  private void closeRegion(final VM memberVM) {
+  private void closeCache(final VM memberVM) {
     memberVM.invoke("closeRegion", () -> {
       Cache cache = this.managementTestRule.getCache();
       Region region = cache.getRegion(REGION_NAME);
-      region.close();
+      cache.close();
     });
   }
 
diff --git 
a/geode-core/src/distributedTest/java/org/apache/geode/management/internal/cli/commands/ShowMissingDiskStoreCommandDUnitTest.java
 
b/geode-core/src/distributedTest/java/org/apache/geode/management/internal/cli/commands/ShowMissingDiskStoreCommandDUnitTest.java
new file mode 100644
index 0000000..e6634cf
--- /dev/null
+++ 
b/geode-core/src/distributedTest/java/org/apache/geode/management/internal/cli/commands/ShowMissingDiskStoreCommandDUnitTest.java
@@ -0,0 +1,167 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license
+ * agreements. See the NOTICE file distributed with this work for additional 
information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache 
License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the 
License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software 
distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
KIND, either express
+ * or implied. See the License for the specific language governing permissions 
and limitations under
+ * the License.
+ */
+package org.apache.geode.management.internal.cli.commands;
+
+import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.TestName;
+
+import org.apache.geode.cache.CacheFactory;
+import org.apache.geode.cache.Region;
+import org.apache.geode.cache.RegionShortcut;
+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.model.ResultModel;
+import 
org.apache.geode.management.internal.cli.result.model.TabularResultModel;
+import org.apache.geode.management.internal.cli.util.CommandStringBuilder;
+import org.apache.geode.test.dunit.rules.ClusterStartupRule;
+import org.apache.geode.test.dunit.rules.MemberVM;
+import org.apache.geode.test.junit.categories.PersistenceTest;
+import org.apache.geode.test.junit.rules.GfshCommandRule;
+
+@Category({PersistenceTest.class})
+public class ShowMissingDiskStoreCommandDUnitTest {
+
+  private MemberVM locator;
+
+  @Rule
+  public TestName testName = new TestName();
+
+  @Rule
+  public ClusterStartupRule lsRule = new ClusterStartupRule();
+
+  @Rule
+  public GfshCommandRule gfshConnector = new GfshCommandRule();
+
+  @Before
+  public void before() throws Exception {
+    locator = lsRule.startLocatorVM(0);
+    gfshConnector.connect(locator);
+    assertThat(gfshConnector.isConnected()).isTrue();
+
+    // start a server so that we can execute data commands that requires at 
least a server running
+  }
+
+  @Test
+  public void showMissingDiskStoresDoesNotDuplicateDiskStores() throws 
Exception {
+    MemberVM server1 = lsRule.startServerVM(1, locator.getPort());
+    MemberVM server2 = lsRule.startServerVM(2, locator.getPort());
+    MemberVM server3 = lsRule.startServerVM(3, locator.getPort());
+
+    final String testRegionName = "regionA";
+    CommandStringBuilder csb;
+    csb = new CommandStringBuilder(CliStrings.CREATE_DISK_STORE)
+        .addOption(CliStrings.CREATE_DISK_STORE__NAME, "diskStore")
+        .addOption(CliStrings.CREATE_DISK_STORE__DIRECTORY_AND_SIZE, 
"diskStoreDir");
+    
gfshConnector.executeAndAssertThat(csb.getCommandString()).statusIsSuccess();
+
+    CommandStringBuilder createRegion = new 
CommandStringBuilder(CliStrings.CREATE_REGION)
+        .addOption(CliStrings.CREATE_REGION__REGION, testRegionName)
+        .addOption(CliStrings.CREATE_REGION__DISKSTORE, "diskStore")
+        .addOption(CliStrings.CREATE_REGION__REGIONSHORTCUT,
+            RegionShortcut.PARTITION_PERSISTENT.toString());
+    await().untilAsserted(() -> 
gfshConnector.executeAndAssertThat(createRegion.getCommandString())
+        .statusIsSuccess());
+
+    // Add data to the region
+    addData(server1, testRegionName);
+
+    lsRule.stop(1);
+
+    csb = new CommandStringBuilder(CliStrings.SHOW_MISSING_DISK_STORE);
+    ResultModel result =
+        (ResultModel) 
gfshConnector.executeCommand(csb.getCommandString()).getResultData();
+    TabularResultModel tableSection = 
result.getTableSection("missing-disk-stores");
+    List<String> missingDiskStoreIds = tableSection.getValuesInColumn("Disk 
Store ID");
+    assertThat(missingDiskStoreIds).hasSize(1);
+
+    String missingId = missingDiskStoreIds.iterator().next();
+
+    csb = new CommandStringBuilder(CliStrings.REVOKE_MISSING_DISK_STORE)
+        .addOption(CliStrings.REVOKE_MISSING_DISK_STORE__ID, missingId);
+    
gfshConnector.executeAndAssertThat(csb.getCommandString()).statusIsSuccess();
+  }
+
+  @Test
+  public void stoppingAndRestartingMemberDoesNotResultInMissingDiskStore() 
throws Exception {
+    MemberVM server1 = lsRule.startServerVM(1, locator.getPort());
+    MemberVM server2 = lsRule.startServerVM(2, locator.getPort());
+    MemberVM server3 = lsRule.startServerVM(3, locator.getPort());
+    MemberVM server4 = lsRule.startServerVM(4, locator.getPort());
+
+    final String testRegionName = "regionA";
+    CommandStringBuilder csb;
+    csb = new CommandStringBuilder(CliStrings.CREATE_DISK_STORE)
+        .addOption(CliStrings.CREATE_DISK_STORE__NAME, "diskStore")
+        .addOption(CliStrings.CREATE_DISK_STORE__DIRECTORY_AND_SIZE, 
"diskStoreDir");
+    
gfshConnector.executeAndAssertThat(csb.getCommandString()).statusIsSuccess();
+
+    CommandStringBuilder createRegion = new 
CommandStringBuilder(CliStrings.CREATE_REGION)
+        .addOption(CliStrings.CREATE_REGION__REGION, testRegionName)
+        .addOption(CliStrings.CREATE_REGION__DISKSTORE, "diskStore")
+        .addOption(CliStrings.CREATE_REGION__REGIONSHORTCUT,
+            RegionShortcut.PARTITION_REDUNDANT_PERSISTENT.toString());
+    await().untilAsserted(() -> 
gfshConnector.executeAndAssertThat(createRegion.getCommandString())
+        .statusIsSuccess());
+
+
+    // Add data to the region
+    addData(server1, testRegionName);
+
+    rebalance();
+
+    lsRule.stop(1, false);
+
+    rebalance();
+
+    lsRule.stop(2, false);
+
+    rebalance();
+
+    lsRule.startServerVM(1, locator.getPort());
+
+    lsRule.startServerVM(2, locator.getPort());
+
+    csb = new CommandStringBuilder(CliStrings.SHOW_MISSING_DISK_STORE);
+    CommandResult commandResult = 
gfshConnector.executeCommand(csb.getCommandString());
+    ResultModel result =
+        (ResultModel) commandResult.getResultData();
+    TabularResultModel tableSection = 
result.getTableSection("missing-disk-stores");
+    List<String> missingDiskStoreIds = tableSection.getValuesInColumn("Disk 
Store ID");
+    assertThat(missingDiskStoreIds).isNull();
+  }
+
+  private void addData(MemberVM server1, String testRegionName) {
+    server1.invoke(() -> {
+      Region<Object, Object> region = 
CacheFactory.getAnyInstance().getRegion(testRegionName);
+      for (int i = 0; i < 113; i++) {
+        region.put(i, "A");
+      }
+    });
+  }
+
+  private void rebalance() {
+    CommandStringBuilder rebalance = new 
CommandStringBuilder(CliStrings.REBALANCE);
+    await().untilAsserted(
+        () -> 
gfshConnector.executeAndAssertThat(rebalance.getCommandString()).statusIsSuccess());
+  }
+}
diff --git 
a/geode-core/src/distributedTest/java/org/apache/geode/management/internal/cli/commands/ShowMissingDiskStoresDUnitTest.java
 
b/geode-core/src/distributedTest/java/org/apache/geode/management/internal/cli/commands/ShowMissingDiskStoresDUnitTest.java
deleted file mode 100644
index d31b81f..0000000
--- 
a/geode-core/src/distributedTest/java/org/apache/geode/management/internal/cli/commands/ShowMissingDiskStoresDUnitTest.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license
- * agreements. See the NOTICE file distributed with this work for additional 
information regarding
- * copyright ownership. The ASF licenses this file to You under the Apache 
License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the 
License. You may obtain a
- * copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software 
distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
KIND, either express
- * or implied. See the License for the specific language governing permissions 
and limitations under
- * the License.
- */
-package org.apache.geode.management.internal.cli.commands;
-
-import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
-import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.io.File;
-import java.util.concurrent.TimeUnit;
-
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.rules.TestName;
-
-import org.apache.geode.cache.RegionShortcut;
-import org.apache.geode.distributed.ServerLauncher;
-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.util.CommandStringBuilder;
-import org.apache.geode.test.dunit.AsyncInvocation;
-import org.apache.geode.test.dunit.rules.ClusterStartupRule;
-import org.apache.geode.test.dunit.rules.MemberVM;
-import org.apache.geode.test.junit.categories.PersistenceTest;
-import org.apache.geode.test.junit.rules.GfshCommandRule;
-
-@Category({PersistenceTest.class})
-public class ShowMissingDiskStoresDUnitTest {
-
-  // private static final String DISK_STORE = "diskStore";
-  private static final String DISK_STORE_DIR = "myDiskStores";
-  private MemberVM locator;
-  private MemberVM server1;
-  private MemberVM server2;
-
-  @Rule
-  public TestName testName = new TestName();
-
-  @Rule
-  public ClusterStartupRule lsRule = new ClusterStartupRule();
-
-  @Rule
-  public GfshCommandRule gfshConnector = new GfshCommandRule();
-
-  @Before
-  public void before() throws Exception {
-    locator = lsRule.startLocatorVM(0);
-    gfshConnector.connect(locator);
-    assertThat(gfshConnector.isConnected()).isTrue();
-
-    // start a server so that we can execute data commands that requires at 
least a server running
-    server1 = lsRule.startServerVM(1, locator.getPort());
-    server2 = lsRule.startServerVM(2, locator.getPort());
-  }
-
-  @Ignore("WIP: new test for GEODE-2681 fix")
-  @Test
-  public void missingDiskStores_gfshDoesntHang() throws Exception {
-    final String testRegionName = "regionA";
-    CommandStringBuilder csb;
-    // TODO: Need to ensure that the diskstores are created in "user.dir" as 
set by the
-    // *StarterRules, see DiskStoreFactoryImpl.setDiskDirsAndSizes
-    csb = new CommandStringBuilder(CliStrings.CREATE_DISK_STORE)
-        .addOption(CliStrings.CREATE_DISK_STORE__NAME, "diskStore")
-        .addOption(CliStrings.CREATE_DISK_STORE__DIRECTORY_AND_SIZE, 
"diskStoreDir");
-    
gfshConnector.executeAndAssertThat(csb.getCommandString()).statusIsSuccess();
-
-    await().until(() -> {
-      return new File(server1.getWorkingDir(), "diskStoreDir").exists()
-          && new File(server2.getWorkingDir(), "diskStoreDir").exists();
-    });
-
-    csb = new CommandStringBuilder(CliStrings.CREATE_REGION)
-        .addOption(CliStrings.CREATE_REGION__REGION, testRegionName)
-        .addOption(CliStrings.CREATE_REGION__DISKSTORE, "diskStore")
-        .addOption(CliStrings.CREATE_REGION__REGIONSHORTCUT,
-            RegionShortcut.REPLICATE_PERSISTENT.toString());
-    
gfshConnector.executeAndAssertThat(csb.getCommandString()).statusIsSuccess();
-
-    // Add data to the region
-    putUsingGfsh(gfshConnector, testRegionName, 1, "A");
-    putUsingGfsh(gfshConnector, testRegionName, 2, "B");
-    putUsingGfsh(gfshConnector, testRegionName, 3, "C");
-
-    lsRule.stop(1);
-    lsRule.stop(2);
-
-    AsyncInvocation restart1 = restartServerAsync(server1);
-    checkAsyncResults(restart1, gfshConnector, 5);
-
-    AsyncInvocation restart2 = restartServerAsync(server2);
-    checkAsyncResults(restart2, gfshConnector, 5);
-
-    for (AsyncInvocation ai : new AsyncInvocation[] {restart1, restart2}) {
-      if (ai.isAlive()) {
-        restart1.cancel(true);
-      }
-    }
-  }
-
-  private AsyncInvocation restartServerAsync(MemberVM member) throws Exception 
{
-    String memberWorkingDir = member.getWorkingDir().getAbsolutePath();
-    int locatorPort = locator.getPort();
-    AsyncInvocation restart = member.invokeAsync(() -> {
-      ServerLauncher serverLauncher =
-          new ServerLauncher.Builder().setWorkingDirectory(memberWorkingDir)
-              .setMemberName("server-1").set(LOCATORS, "localhost[" + 
locatorPort + "]").build();
-      serverLauncher.start();
-    });
-
-    return restart;
-  }
-
-  private void checkAsyncResults(AsyncInvocation ai, GfshCommandRule gfsh, int 
secsToWait)
-      throws Exception {
-    try {
-      await().atLeast(secsToWait, TimeUnit.SECONDS).until(() -> ai.isDone());
-    } catch (Exception e) {
-      // e.printStackTrace();
-    }
-
-    CommandResult result;
-
-    result = gfsh.executeCommand("list members");
-    System.out.println(result);
-    result = gfsh.executeCommand("show missing-disk-stores");
-    System.out.println(result);
-  }
-
-  private void putUsingGfsh(GfshCommandRule gfsh, String regionName, int key, 
String val)
-      throws Exception {
-    CommandStringBuilder csb = new CommandStringBuilder(CliStrings.PUT)
-        .addOption(CliStrings.PUT__KEY, 
Integer.toString(key)).addOption(CliStrings.PUT__VALUE, val)
-        .addOption(CliStrings.PUT__REGIONNAME, regionName);
-    gfsh.executeAndAssertThat(csb.getCommandString()).statusIsSuccess();
-  }
-}
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/admin/remote/MissingPersistentIDsRequest.java
 
b/geode-core/src/main/java/org/apache/geode/internal/admin/remote/MissingPersistentIDsRequest.java
index 63073d2..1f4ab36 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/admin/remote/MissingPersistentIDsRequest.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/admin/remote/MissingPersistentIDsRequest.java
@@ -25,11 +25,13 @@ import java.util.TreeSet;
 import org.apache.logging.log4j.Logger;
 
 import org.apache.geode.CancelException;
+import org.apache.geode.cache.DiskStore;
 import org.apache.geode.cache.persistence.PersistentID;
 import org.apache.geode.distributed.internal.ClusterDistributionManager;
 import org.apache.geode.distributed.internal.DistributionManager;
 import org.apache.geode.distributed.internal.DistributionMessage;
 import org.apache.geode.distributed.internal.ReplyException;
+import org.apache.geode.internal.cache.DiskStoreImpl;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.cache.persistence.PersistentMemberID;
 import org.apache.geode.internal.cache.persistence.PersistentMemberManager;
@@ -89,8 +91,9 @@ public class MissingPersistentIDsRequest extends 
CliLegacyMessage {
           missingIds.add(new PersistentMemberPattern(id));
         }
       }
-      Set<PersistentMemberID> localIds = mm.getPersistentIDs();
-      for (PersistentMemberID id : localIds) {
+
+      for (DiskStore diskStore : cache.listDiskStoresIncludingRegionOwned()) {
+        PersistentMemberID id = ((DiskStoreImpl) 
diskStore).generatePersistentID();
         localPatterns.add(new PersistentMemberPattern(id));
       }
     }
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractDiskRegion.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractDiskRegion.java
index 9a2abfb..7d95e37 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractDiskRegion.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractDiskRegion.java
@@ -605,7 +605,7 @@ public abstract class AbstractDiskRegion implements 
DiskRegionView {
 
   @Override
   public PersistentMemberID generatePersistentID() {
-    return this.ds.generatePersistentID(this);
+    return this.ds.generatePersistentID();
   }
 
   @Override
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/DiskStoreImpl.java 
b/geode-core/src/main/java/org/apache/geode/internal/cache/DiskStoreImpl.java
index 5886b13..39e1b65 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/DiskStoreImpl.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/DiskStoreImpl.java
@@ -3147,7 +3147,7 @@ public class DiskStoreImpl implements DiskStore {
     }
   }
 
-  public PersistentMemberID generatePersistentID(DiskRegionView dr) {
+  public PersistentMemberID generatePersistentID() {
     File firstDir = getInfoFileDir().getDir();
     InternalDistributedSystem ids = getCache().getInternalDistributedSystem();
     InternalDistributedMember memberId = 
ids.getDistributionManager().getDistributionManagerId();
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java
index 74213de..35f55d6 100755
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java
@@ -4945,7 +4945,7 @@ public class PartitionedRegion extends LocalRegion
     profile.asyncEventQueueIds = getVisibleAsyncEventQueueIds();
 
     if (getDataPolicy().withPersistence()) {
-      profile.persistentID = getDiskStore().generatePersistentID(null);
+      profile.persistentID = getDiskStore().generatePersistentID();
     }
 
     fillInProfile((PartitionProfile) profile);
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/RedundancyLogger.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/RedundancyLogger.java
index 5bb6ec6..f8b98ac 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/RedundancyLogger.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/RedundancyLogger.java
@@ -255,7 +255,7 @@ public class RedundancyLogger extends RecoveryRunnable 
implements PersistentStat
        * We have a DiskStore? Great! Simply have it generate the id.
        */
       if (null != diskStore) {
-        return diskStore.generatePersistentID(null);
+        return diskStore.generatePersistentID();
       }
 
       /*
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/persistence/PersistenceAdvisorImpl.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/persistence/PersistenceAdvisorImpl.java
index bfb9a78..6a787d0 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/persistence/PersistenceAdvisorImpl.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/persistence/PersistenceAdvisorImpl.java
@@ -810,6 +810,7 @@ public class PersistenceAdvisorImpl implements 
InternalPersistenceAdvisor {
     }
     synchronized (lock) {
       recoveredMembers.clear();
+      recoveredMembers.addAll(getPersistedMembers());
     }
   }
 
@@ -1214,17 +1215,5 @@ public class PersistenceAdvisorImpl implements 
InternalPersistenceAdvisor {
     public boolean matches(PersistentMemberPattern pattern) {
       return pattern.matches(getPersistentID()) || 
pattern.matches(getInitializingID());
     }
-
-    @Override
-    public void addPersistentIDs(Set<PersistentMemberID> localData) {
-      PersistentMemberID id = getPersistentID();
-      if (id != null) {
-        localData.add(id);
-      }
-      id = getInitializingID();
-      if (id != null) {
-        localData.add(id);
-      }
-    }
   }
 }
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/persistence/PersistentMemberManager.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/persistence/PersistentMemberManager.java
index 94a9737..ed0c110 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/persistence/PersistentMemberManager.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/persistence/PersistentMemberManager.java
@@ -129,20 +129,6 @@ public class PersistentMemberManager {
     }
   }
 
-  /**
-   * Returns a set of the persistent ids that are running on this member.
-   */
-  public Set<PersistentMemberID> getPersistentIDs() {
-    synchronized (this) {
-      Set<PersistentMemberID> localData = new HashSet<PersistentMemberID>();
-      for (MemberRevocationListener listener : revocationListeners) {
-        String regionPath = listener.getRegionPath();
-        listener.addPersistentIDs(localData);
-      }
-      return localData;
-    }
-  }
-
   public boolean isRevoked(String regionPath, PersistentMemberID id) {
     for (PersistentMemberPattern member : revokedMembers.keySet()) {
       if (member.matches(id)) {
@@ -208,11 +194,6 @@ public class PersistentMemberManager {
     void revoked(PersistentMemberPattern pattern);
 
     /**
-     * Add the persistent id(s) of this listener to the passed in set.
-     */
-    void addPersistentIDs(Set<PersistentMemberID> localData);
-
-    /**
      * Return true if this is a listener for a resource that matches the 
persistent member pattern
      * in question.
      */
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 379e708..b160f09 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
@@ -882,7 +882,7 @@ public class DistributedSystemBridge {
    * @return Array of PersistentMemberDetails (which contains host, directory 
and disk store id)
    */
   public PersistentMemberDetails[] listMissingDiskStores() {
-    PersistentMemberDetails[] missingDiskStores = null;
+    PersistentMemberDetails[] missingDiskStores = new 
PersistentMemberDetails[0];
 
     // No need to try and send anything if we're a Loner
     if (dm.isLoner()) {
@@ -890,7 +890,7 @@ public class DistributedSystemBridge {
     }
 
     Set<PersistentID> persistentMemberSet = 
MissingPersistentIDsRequest.send(dm);
-    if (persistentMemberSet != null && persistentMemberSet.size() > 0) {
+    if (persistentMemberSet != null) {
       missingDiskStores = new 
PersistentMemberDetails[persistentMemberSet.size()];
       int j = 0;
       for (PersistentID id : persistentMemberSet) {
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 3b41277..e628ba9 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
@@ -15,9 +15,9 @@
 
 package org.apache.geode.management.internal.cli.commands;
 
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.springframework.shell.core.annotation.CliCommand;
 
@@ -27,7 +27,9 @@ 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.internal.cache.partitioned.ColocatedRegionDetails;
-import org.apache.geode.internal.cache.persistence.PersistentMemberPattern;
+import org.apache.geode.management.DistributedSystemMXBean;
+import org.apache.geode.management.ManagementService;
+import org.apache.geode.management.PersistentMemberDetails;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.GfshCommand;
 import 
org.apache.geode.management.internal.cli.functions.ShowMissingDiskStoresFunction;
@@ -55,12 +57,17 @@ public class ShowMissingDiskStoreCommand extends 
GfshCommand {
     if (dataMembers.isEmpty()) {
       return 
ResultModel.createInfo(CliStrings.NO_CACHING_MEMBERS_FOUND_MESSAGE);
     }
-    List<?> results = getMissingDiskStoresList(dataMembers);
+    List<ColocatedRegionDetails> missingRegions = 
getMissingColocatedRegionList(dataMembers);
 
-    return toMissingDiskStoresTabularResult(results);
+    DistributedSystemMXBean dsMXBean =
+        
ManagementService.getManagementService(getCache()).getDistributedSystemMXBean();
+    PersistentMemberDetails[] missingDiskStores = 
dsMXBean.listMissingDiskStores();
+
+    return toMissingDiskStoresTabularResult(missingDiskStores, missingRegions);
   }
 
-  private List<?> getMissingDiskStoresList(Set<DistributedMember> members) {
+  private List<ColocatedRegionDetails> getMissingColocatedRegionList(
+      Set<DistributedMember> members) {
     final Execution membersFunctionExecutor = 
getMembersFunctionExecutor(members);
     if (membersFunctionExecutor instanceof AbstractExecution) {
       ((AbstractExecution) 
membersFunctionExecutor).setIgnoreDepartedMembers(true);
@@ -70,42 +77,37 @@ public class ShowMissingDiskStoreCommand extends 
GfshCommand {
         membersFunctionExecutor.execute(new ShowMissingDiskStoresFunction());
 
     final List<?> results = (List<?>) resultCollector.getResult();
-    final List<?> distributedPersistentRecoveryDetails = new 
ArrayList<>(results.size());
-    for (final Object result : results) {
-      if (result instanceof Set) {
-        distributedPersistentRecoveryDetails.addAll((Set) result);
-      }
-    }
-    return distributedPersistentRecoveryDetails;
+
+    // Clean up the data. For backwards compatibility, the 
ShowMissingDiskStoresFunction
+    // sends a List of Sets. Some of the sets are Set<PersistentMemberIds>, 
some are
+    // Set<ColocatedRegionDetails>. We want to return a List of all of the 
ColocatedRegionDetails,
+    // and ignore the PersistentMemberIds
+    return results.stream().filter(Set.class::isInstance)
+        .map(Set.class::cast)
+        .flatMap(Set::stream)
+        .filter(ColocatedRegionDetails.class::isInstance)
+        .map(ColocatedRegionDetails.class::cast)
+        .collect(Collectors.toList());
   }
 
-  private ResultModel toMissingDiskStoresTabularResult(final List<?> 
resultDetails)
+  private ResultModel toMissingDiskStoresTabularResult(
+      PersistentMemberDetails[] missingDiskStores,
+      final List<ColocatedRegionDetails> missingColocatedRegions)
       throws ResultDataException {
     ResultModel result = new ResultModel();
-    List<PersistentMemberPattern> missingDiskStores = new ArrayList<>();
-    List<ColocatedRegionDetails> missingColocatedRegions = new ArrayList<>();
-
-    for (Object detail : resultDetails) {
-      if (detail instanceof PersistentMemberPattern) {
-        missingDiskStores.add((PersistentMemberPattern) detail);
-      } else if (detail instanceof ColocatedRegionDetails) {
-        missingColocatedRegions.add((ColocatedRegionDetails) detail);
-      } else {
-        throw new ResultDataException("Unknown type of 
PersistentRecoveryFailures result");
-      }
-    }
 
-    boolean hasMissingDiskStores = !missingDiskStores.isEmpty();
+    boolean hasMissingDiskStores = missingDiskStores.length != 0;
     boolean hasMissingColocatedRegions = !missingColocatedRegions.isEmpty();
+
     TabularResultModel missingDiskStoreSection = 
result.addTable(MISSING_DISK_STORES_SECTION);
 
     if (hasMissingDiskStores) {
       missingDiskStoreSection.setHeader("Missing Disk Stores");
 
-      for (PersistentMemberPattern persistentMemberDetails : 
missingDiskStores) {
+      for (PersistentMemberDetails persistentMemberDetails : 
missingDiskStores) {
         missingDiskStoreSection.accumulate("Disk Store ID",
-            persistentMemberDetails.getUUID().toString());
-        missingDiskStoreSection.accumulate("Host", 
persistentMemberDetails.getHost().toString());
+            persistentMemberDetails.getDiskStoreId());
+        missingDiskStoreSection.accumulate("Host", 
persistentMemberDetails.getHost());
         missingDiskStoreSection.accumulate("Directory", 
persistentMemberDetails.getDirectory());
       }
     } else {

Reply via email to