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 {