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 <48509719+mk...@users.noreply.github.com> 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"); + } }