This is an automated email from the ASF dual-hosted git repository.
mivanac 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 e88d57d GEODE-9969: Fix unescaping the region name with underscore
(#7320)
e88d57d is described below
commit e88d57da17cc86278754fece3f9d56ba5bb1440d
Author: Mario Kevo <[email protected]>
AuthorDate: Fri Mar 25 07:33:32 2022 +0100
GEODE-9969: Fix unescaping the region name with underscore (#7320)
* GEODE-9969: Fix unescaping the region name with underscore
* changes after review
* add acceptanceTest
* fix test
* fix windows test
* rebase on the latest develop
* empty commit to releaunch CI
---
...gDiskStoreAfterServerRestartAcceptanceTest.java | 161 +++++++++++++++++++++
.../internal/cache/PartitionedRegionHelper.java | 2 +
.../cache/PartitionedRegionHelperJUnitTest.java | 40 +++--
3 files changed, 187 insertions(+), 16 deletions(-)
diff --git
a/geode-assembly/src/acceptanceTest/java/org/apache/geode/cache/persistence/MissingDiskStoreAfterServerRestartAcceptanceTest.java
b/geode-assembly/src/acceptanceTest/java/org/apache/geode/cache/persistence/MissingDiskStoreAfterServerRestartAcceptanceTest.java
new file mode 100644
index 0000000..825c1ad
--- /dev/null
+++
b/geode-assembly/src/acceptanceTest/java/org/apache/geode/cache/persistence/MissingDiskStoreAfterServerRestartAcceptanceTest.java
@@ -0,0 +1,161 @@
+/*
+ * 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.cache.persistence;
+
+import static org.apache.geode.cache.Region.SEPARATOR;
+import static
org.apache.geode.internal.AvailablePortHelper.getRandomAvailableTCPPorts;
+import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import org.apache.geode.test.assertj.LogFileAssert;
+import org.apache.geode.test.junit.rules.gfsh.GfshRule;
+
+public class MissingDiskStoreAfterServerRestartAcceptanceTest {
+
+ private static final String SERVER_1_NAME = "server1";
+ private static final String SERVER_2_NAME = "server2";
+ private static final String SERVER_3_NAME = "server3";
+ private static final String SERVER_4_NAME = "server4";
+ private static final String SERVER_5_NAME = "server5";
+ private static final String LOCATOR_NAME = "locator";
+ private static final String REGION_NAME_WITH_UNDERSCORE = "_myRegion";
+
+ private Path server4Folder;
+ private Path server5Folder;
+ private TemporaryFolder temporaryFolder;
+
+ private int locatorPort;
+
+ private String startServer1Command;
+ private String startServer2Command;
+ private String startServer3Command;
+ private String startServer4Command;
+ private String startServer5Command;
+
+ private String createRegionWithUnderscoreCommand;
+ private String connectToLocatorCommand;
+ private String queryCommand;
+
+ @Rule
+ public GfshRule gfshRule = new GfshRule();
+
+ @Before
+ public void setUp() throws Exception {
+ temporaryFolder = gfshRule.getTemporaryFolder();
+ server4Folder =
temporaryFolder.newFolder(SERVER_4_NAME).toPath().toAbsolutePath();
+ server5Folder =
temporaryFolder.newFolder(SERVER_5_NAME).toPath().toAbsolutePath();
+
+ int[] ports = getRandomAvailableTCPPorts(6);
+ locatorPort = ports[0];
+ int server1Port = ports[1];
+ int server2Port = ports[2];
+ int server3Port = ports[3];
+ int server4Port = ports[4];
+ int server5Port = ports[5];
+
+ String startLocatorCommand = String.join(" ",
+ "start locator",
+ "--name=" + LOCATOR_NAME,
+ "--port=" + locatorPort,
+ "--locators=localhost[" + locatorPort + "]");
+
+ startServer1Command = String.join(" ",
+ "start server",
+ "--name=" + SERVER_1_NAME,
+ "--locators=localhost[" + locatorPort + "]",
+ "--server-port=" + server1Port);
+
+ startServer2Command = String.join(" ",
+ "start server",
+ "--name=" + SERVER_2_NAME,
+ "--locators=localhost[" + locatorPort + "]",
+ "--server-port=" + server2Port);
+
+ startServer3Command = String.join(" ",
+ "start server",
+ "--name=" + SERVER_3_NAME,
+ "--locators=localhost[" + locatorPort + "]",
+ "--server-port=" + server3Port);
+
+ startServer4Command = String.join(" ",
+ "start server",
+ "--name=" + SERVER_4_NAME,
+ "--dir=" + server4Folder,
+ "--locators=localhost[" + locatorPort + "]",
+ "--server-port=" + server4Port);
+
+ startServer5Command = String.join(" ",
+ "start server",
+ "--name=" + SERVER_5_NAME,
+ "--dir=" + server5Folder,
+ "--locators=localhost[" + locatorPort + "]",
+ "--server-port=" + server5Port);
+
+ createRegionWithUnderscoreCommand = String.join(" ",
+ "create region",
+ "--name=" + REGION_NAME_WITH_UNDERSCORE,
+ "--type=PARTITION_REDUNDANT_PERSISTENT",
+ "--redundant-copies=1",
+ "--enable-synchronous-disk=false");
+
+ connectToLocatorCommand = "connect --locator=localhost[" + locatorPort +
"]";
+
+ queryCommand =
+ "query --query=\'select * from " + SEPARATOR +
REGION_NAME_WITH_UNDERSCORE + "\'";
+
+ gfshRule.execute(startLocatorCommand, startServer1Command,
startServer2Command,
+ startServer3Command, startServer4Command,
+ createRegionWithUnderscoreCommand);
+ }
+
+ @Test
+ public void serverLauncherUnderscore() throws IOException {
+ gfshRule.execute(connectToLocatorCommand, queryCommand);
+ gfshRule.execute(connectToLocatorCommand, "stop server --name=" +
SERVER_4_NAME);
+ assertThat(
+ gfshRule.execute(connectToLocatorCommand, "show
missing-disk-stores").getOutputText())
+ .contains("Missing Disk Stores");
+
+ Path server4Path = Paths.get(String.valueOf(server4Folder));
+ Path server5Path = Paths.get(String.valueOf(server5Folder));
+ Files.move(server4Path, server5Path, StandardCopyOption.REPLACE_EXISTING);
+
+ gfshRule.execute(startServer5Command);
+
+ await().untilAsserted(() -> {
+ String waitingForMembersMessage = String.format(
+ "Server server5 startup completed in");
+
+ LogFileAssert.assertThat(server5Folder.resolve(SERVER_5_NAME +
".log").toFile())
+ .exists()
+ .contains(waitingForMembersMessage);
+ });
+
+ String showDiskStoresOutput =
+ gfshRule.execute(connectToLocatorCommand, "show
missing-disk-stores").getOutputText();
+ assertThat(showDiskStoresOutput).contains("No missing disk store found");
+ }
+}
diff --git
a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionHelper.java
b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionHelper.java
index 2d22db5..9562afe 100644
---
a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionHelper.java
+++
b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionHelper.java
@@ -783,9 +783,11 @@ public class PartitionedRegionHelper {
public static final String TWO_SEPARATORS = SEPARATOR + SEPARATOR;
+ public static final String THREE_SEPARATORS = TWO_SEPARATORS + SEPARATOR;
public static String unescapePRPath(String escapedPath) {
String path = escapedPath.replace('_', SEPARATOR_CHAR);
+ path = path.replace(THREE_SEPARATORS, SEPARATOR + "_");
path = path.replace(TWO_SEPARATORS, "_");
return path;
}
diff --git
a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionHelperJUnitTest.java
b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionHelperJUnitTest.java
index 9b04282..8d68afe 100644
---
a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionHelperJUnitTest.java
+++
b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionHelperJUnitTest.java
@@ -16,7 +16,6 @@ package org.apache.geode.internal.cache;
import static org.apache.geode.cache.Region.SEPARATOR;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -29,21 +28,17 @@ public class PartitionedRegionHelperJUnitTest {
@Test
public void testEscapeUnescape() {
- {
- String bucketName =
- PartitionedRegionHelper.getBucketName(SEPARATOR + "root" + SEPARATOR
+ "region", 5);
- assertEquals("Name = " + bucketName, -1, bucketName.indexOf(SEPARATOR));
- assertEquals(SEPARATOR + "root" + SEPARATOR + "region",
- PartitionedRegionHelper.getPRPath(bucketName));
- }
-
- {
- String bucketName =
- PartitionedRegionHelper.getBucketName(SEPARATOR + "root" + SEPARATOR
+ "region_one", 5);
- assertEquals("Name = " + bucketName, -1, bucketName.indexOf(SEPARATOR));
- assertEquals(SEPARATOR + "root" + SEPARATOR + "region_one",
- PartitionedRegionHelper.getPRPath(bucketName));
- }
+ String bucketName =
+ PartitionedRegionHelper.getBucketName(SEPARATOR + "root" + SEPARATOR +
"region", 5);
+ assertThat(bucketName).as("Name = " +
bucketName).doesNotContain(SEPARATOR);
+ assertThat(PartitionedRegionHelper.getPRPath(bucketName))
+ .isEqualTo(SEPARATOR + "root" + SEPARATOR + "region");
+
+ bucketName =
+ PartitionedRegionHelper.getBucketName(SEPARATOR + "root" + SEPARATOR +
"region_one", 5);
+ assertThat(bucketName).as("Name = " +
bucketName).doesNotContain(SEPARATOR);
+ assertThat(PartitionedRegionHelper.getPRPath(bucketName))
+ .isEqualTo(SEPARATOR + "root" + SEPARATOR + "region_one");
}
@Test
@@ -80,4 +75,17 @@ public class PartitionedRegionHelperJUnitTest {
.isEqualTo(partitionedRegion);
}
+ public void testEscapeUnescapeWhenRegionHasUnderscoreInTheName() {
+ String bucketName =
+ PartitionedRegionHelper.getBucketName(SEPARATOR + "_region", 5);
+ assertThat(bucketName).as("Name = " +
bucketName).doesNotContain(SEPARATOR);
+ assertThat(PartitionedRegionHelper.getPRPath(bucketName))
+ .isEqualTo(SEPARATOR + "_region");
+
+ bucketName =
+ PartitionedRegionHelper.getBucketName(SEPARATOR + "root" + SEPARATOR +
"_region_one", 5);
+ assertThat(bucketName).as("Name = " +
bucketName).doesNotContain(SEPARATOR);
+ assertThat(PartitionedRegionHelper.getPRPath(bucketName))
+ .isEqualTo(SEPARATOR + "root" + SEPARATOR + "_region_one");
+ }
}