You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ji...@apache.org on 2020/06/19 15:34:32 UTC
[geode] branch develop updated: GEODE-8251: make sure Configuration
can be deserialized post 1.12. (#5257)
This is an automated email from the ASF dual-hosted git repository.
jinmeiliao 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 4a825a8 GEODE-8251: make sure Configuration can be deserialized post 1.12. (#5257)
4a825a8 is described below
commit 4a825a8631d13b9f6979c66fd02fac3ea07ab751
Author: Jinmei Liao <ji...@pivotal.io>
AuthorDate: Fri Jun 19 08:33:45 2020 -0700
GEODE-8251: make sure Configuration can be deserialized post 1.12. (#5257)
Co-authoried-by: Alberto Gomez <al...@est.tech>
---
geode-core/build.gradle | 8 ++
.../RollingUpgrade2DUnitTestBase.java | 2 +
.../RollingUpgradeWithGfshDUnitTest.java | 145 +++++++++++++++++++++
.../geode/test/junit/rules/gfsh/GfshRule.java | 18 +++
.../configuration/AbstractConfiguration.java | 2 +-
.../geode/management/configuration/Deployment.java | 17 +--
.../sanctioned-geode-management-serializables.txt | 4 +-
7 files changed, 185 insertions(+), 11 deletions(-)
diff --git a/geode-core/build.gradle b/geode-core/build.gradle
index 07c0bf5..6822133 100755
--- a/geode-core/build.gradle
+++ b/geode-core/build.gradle
@@ -120,6 +120,14 @@ jar {
jar.dependsOn(createVersionPropertiesFile)
+upgradeTest {
+ environment 'GEODE_HOME', "$buildDir/../../geode-assembly/build/install/apache-geode/"
+}
+
+repeatUpgradeTest {
+ environment 'GEODE_HOME', "$buildDir/../../geode-assembly/build/install/apache-geode/"
+}
+
task raJar(type: Jar, dependsOn: classes) {
description 'Assembles the jar archive that contains the JCA classes'
from sourceSets.jca.output
diff --git a/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgrade2DUnitTestBase.java b/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgrade2DUnitTestBase.java
index 067c8c7..f77b775 100755
--- a/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgrade2DUnitTestBase.java
+++ b/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgrade2DUnitTestBase.java
@@ -1185,6 +1185,8 @@ public abstract class RollingUpgrade2DUnitTestBase extends JUnit4DistributedTest
props.setProperty(DistributionConfig.LOCATORS_NAME, locatorsString);
props.setProperty(DistributionConfig.LOG_LEVEL_NAME, DUnitLauncher.logLevel);
props.setProperty(DistributionConfig.ENABLE_CLUSTER_CONFIGURATION_NAME, enableCC + "");
+ // do not start http service to avoid port conflict between upgrade tests
+ props.setProperty(DistributionConfig.HTTP_SERVICE_PORT_NAME, "0");
return props;
}
diff --git a/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeWithGfshDUnitTest.java b/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeWithGfshDUnitTest.java
new file mode 100644
index 0000000..d16650e
--- /dev/null
+++ b/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeWithGfshDUnitTest.java
@@ -0,0 +1,145 @@
+/*
+ * 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.internal.cache.rollingupgrade;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import org.apache.geode.internal.UniquePortSupplier;
+import org.apache.geode.test.compiler.ClassBuilder;
+import org.apache.geode.test.junit.categories.BackwardCompatibilityTest;
+import org.apache.geode.test.junit.rules.gfsh.GfshExecution;
+import org.apache.geode.test.junit.rules.gfsh.GfshRule;
+import org.apache.geode.test.junit.rules.gfsh.GfshScript;
+import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactory;
+import org.apache.geode.test.version.TestVersion;
+import org.apache.geode.test.version.VersionManager;
+
+/**
+ * This test iterates through the versions of Geode and executes client compatibility with
+ * the current version of Geode.
+ */
+@Category({BackwardCompatibilityTest.class})
+@RunWith(Parameterized.class)
+@Parameterized.UseParametersRunnerFactory(CategoryWithParameterizedRunnerFactory.class)
+public class RollingUpgradeWithGfshDUnitTest {
+ private final UniquePortSupplier portSupplier = new UniquePortSupplier();
+ private final String oldVersion;
+
+ @Parameterized.Parameters(name = "{0}")
+ public static Collection<String> data() {
+ List<String> result = VersionManager.getInstance().getVersionsWithoutCurrent();
+ result.removeIf(s -> TestVersion.compare(s, "1.10.0") < 0);
+ return result;
+ }
+
+ @Rule
+ public GfshRule oldGfsh;
+
+ @Rule
+ public GfshRule currentGfsh = new GfshRule();
+
+ @Rule
+ public TemporaryFolder tempFolder = new TemporaryFolder();
+
+ public RollingUpgradeWithGfshDUnitTest(String version) {
+ oldVersion = version;
+ oldGfsh = new GfshRule(oldVersion);
+ }
+
+ @Test
+ public void testRollingUpgradeWithDeployment() throws Exception {
+ int locatorPort = portSupplier.getAvailablePort();
+ int locatorJmxPort = portSupplier.getAvailablePort();
+ int locator2Port = portSupplier.getAvailablePort();
+ int locator2JmxPort = portSupplier.getAvailablePort();
+ int server1Port = portSupplier.getAvailablePort();
+ int server2Port = portSupplier.getAvailablePort();
+
+ GfshExecution startupExecution =
+ GfshScript.of(startLocatorCommand("loc1", locatorPort, locatorJmxPort, -1))
+ .and(startLocatorCommand("loc2", locator2Port, locator2JmxPort, locatorPort))
+ .and(startServerCommand("server1", server1Port, locatorPort))
+ .and(startServerCommand("server2", server2Port, locatorPort))
+ .and(deployDirCommand())
+ .execute(oldGfsh);
+
+ // doing rolling upgrades
+ oldGfsh.stopLocator(startupExecution, "loc1");
+ GfshScript.of(startLocatorCommand("loc1", locatorPort, locatorJmxPort, locator2Port))
+ .execute(currentGfsh);
+ verifyListDeployed(locatorPort);
+
+ oldGfsh.stopLocator(startupExecution, "loc2");
+ GfshScript.of(startLocatorCommand("loc2", locator2Port, locator2JmxPort, locatorPort))
+ .execute(currentGfsh);
+ verifyListDeployed(locator2Port);
+
+ // make sure servers can do rolling upgrade too
+ oldGfsh.stopServer(startupExecution, "server1");
+ GfshScript.of(startServerCommand("server1", server1Port, locatorPort)).execute(currentGfsh);
+
+ oldGfsh.stopServer(startupExecution, "server2");
+ GfshScript.of(startServerCommand("server2", server2Port, locatorPort)).execute(currentGfsh);
+ }
+
+ private void verifyListDeployed(int locatorPort) {
+ GfshExecution list_deployed = GfshScript.of("connect --locator=localhost[" + locatorPort + "]")
+ .and("list deployed").execute(currentGfsh);
+ assertThat(list_deployed.getOutputText()).contains("DeployCommandsDUnit1.jar")
+ .contains("server1").contains("server2");
+ currentGfsh.execute("disconnect");
+ }
+
+ private String deployDirCommand() throws IOException {
+ ClassBuilder classBuilder = new ClassBuilder();
+ File jarsDir = tempFolder.newFolder();
+ String jarName1 = "DeployCommandsDUnit1.jar";
+ File jar1 = new File(jarsDir, jarName1);
+ String class1 = "DeployCommandsDUnitA";
+ classBuilder.writeJarFromName(class1, jar1);
+ return "deploy --dir=" + jarsDir.getAbsolutePath();
+ }
+
+ private String startServerCommand(String name, int port, int connectedLocatorPort) {
+ String command = "start server --name=" + name
+ + " --server-port=" + port
+ + " --locators=localhost[" + connectedLocatorPort + "]";
+ return command;
+ }
+
+ private String startLocatorCommand(String name, int port, int jmxPort,
+ int connectedLocatorPort) {
+ String command = "start locator --name=" + name
+ + " --port=" + port
+ + " --http-service-port=0";
+ if (connectedLocatorPort > 0) {
+ command += " --locators=localhost[" + connectedLocatorPort + "]";
+ }
+ command += " --J=-Dgemfire.jmx-manager-port=" + jmxPort;
+ return command;
+ }
+}
diff --git a/geode-junit/src/main/java/org/apache/geode/test/junit/rules/gfsh/GfshRule.java b/geode-junit/src/main/java/org/apache/geode/test/junit/rules/gfsh/GfshRule.java
index 622b7a1..9114cf6 100644
--- a/geode-junit/src/main/java/org/apache/geode/test/junit/rules/gfsh/GfshRule.java
+++ b/geode-junit/src/main/java/org/apache/geode/test/junit/rules/gfsh/GfshRule.java
@@ -174,6 +174,24 @@ public class GfshRule extends ExternalResource {
return processBuilder;
}
+ /**
+ * this will stop the server that's been started in this gfsh execution
+ */
+ public void stopServer(GfshExecution execution, String serverName) {
+ String command = "stop server --dir="
+ + execution.getWorkingDir().toPath().resolve(serverName).toAbsolutePath();
+ execute(GfshScript.of(command).withName("Stop-server-" + serverName));
+ }
+
+ /**
+ * this will stop the lcoator that's been started in this gfsh execution
+ */
+ public void stopLocator(GfshExecution execution, String locatorName) {
+ String command = "stop locator --dir="
+ + execution.getWorkingDir().toPath().resolve(locatorName).toAbsolutePath();
+ execute(GfshScript.of(command).withName("Stop-locator-" + locatorName));
+ }
+
private void stopMembers(GfshExecution gfshExecution) {
String[] stopMemberScripts = gfshExecution.getStopMemberCommands();
if (stopMemberScripts.length == 0) {
diff --git a/geode-management/src/main/java/org/apache/geode/management/configuration/AbstractConfiguration.java b/geode-management/src/main/java/org/apache/geode/management/configuration/AbstractConfiguration.java
index d354b80..7422450 100644
--- a/geode-management/src/main/java/org/apache/geode/management/configuration/AbstractConfiguration.java
+++ b/geode-management/src/main/java/org/apache/geode/management/configuration/AbstractConfiguration.java
@@ -47,7 +47,7 @@ import org.apache.geode.management.runtime.RuntimeInfo;
@Experimental
public abstract class AbstractConfiguration<R extends RuntimeInfo>
implements Identifiable<String>, JsonSerializable {
-
+ private static final long serialVersionUID = -6612840641128145954L;
/**
* The reserved group name that represents the predefined "cluster" group.
* Every member of a cluster automatically belongs to this group.
diff --git a/geode-management/src/main/java/org/apache/geode/management/configuration/Deployment.java b/geode-management/src/main/java/org/apache/geode/management/configuration/Deployment.java
index f4e7bcf..1f84114 100644
--- a/geode-management/src/main/java/org/apache/geode/management/configuration/Deployment.java
+++ b/geode-management/src/main/java/org/apache/geode/management/configuration/Deployment.java
@@ -27,8 +27,9 @@ import org.apache.geode.management.api.CommandType;
import org.apache.geode.management.runtime.DeploymentInfo;
public class Deployment extends GroupableConfiguration<DeploymentInfo> implements HasFile {
+ private static final long serialVersionUID = 6992732279452865384L;
public static final String DEPLOYMENT_ENDPOINT = "/deployments";
- private String fileName;
+ private String jarFileName;
@ApiModelProperty(accessMode = READ_ONLY)
private String deployedTime;
@ApiModelProperty(accessMode = READ_ONLY)
@@ -39,8 +40,8 @@ public class Deployment extends GroupableConfiguration<DeploymentInfo> implement
public Deployment() {}
- public Deployment(String fileName, String deployedBy, String deployedTime) {
- this.fileName = fileName;
+ public Deployment(String jarFileName, String deployedBy, String deployedTime) {
+ this.jarFileName = jarFileName;
this.deployedBy = deployedBy;
this.deployedTime = deployedTime;
}
@@ -62,11 +63,11 @@ public class Deployment extends GroupableConfiguration<DeploymentInfo> implement
}
public String getFileName() {
- return fileName;
+ return jarFileName;
}
public void setFileName(String jarFileName) {
- this.fileName = jarFileName;
+ this.jarFileName = jarFileName;
}
public String getDeployedTime() {
@@ -99,7 +100,7 @@ public class Deployment extends GroupableConfiguration<DeploymentInfo> implement
@Override
public String toString() {
return "Deployment{" +
- "jarFileName='" + fileName + '\'' +
+ "jarFileName='" + jarFileName + '\'' +
", deployedTime='" + deployedTime + '\'' +
", deployedBy='" + deployedBy + '\'' +
'}';
@@ -114,14 +115,14 @@ public class Deployment extends GroupableConfiguration<DeploymentInfo> implement
return false;
}
Deployment that = (Deployment) o;
- return Objects.equals(fileName, that.fileName) &&
+ return Objects.equals(jarFileName, that.jarFileName) &&
Objects.equals(deployedTime, that.deployedTime) &&
Objects.equals(deployedBy, that.deployedBy);
}
@Override
public int hashCode() {
- return Objects.hash(fileName, deployedTime, deployedBy);
+ return Objects.hash(jarFileName, deployedTime, deployedBy);
}
@Override
diff --git a/geode-management/src/main/resources/org/apache/geode/internal/sanctioned-geode-management-serializables.txt b/geode-management/src/main/resources/org/apache/geode/internal/sanctioned-geode-management-serializables.txt
index a05cc0b..6712b56 100644
--- a/geode-management/src/main/resources/org/apache/geode/internal/sanctioned-geode-management-serializables.txt
+++ b/geode-management/src/main/resources/org/apache/geode/internal/sanctioned-geode-management-serializables.txt
@@ -3,10 +3,10 @@ org/apache/geode/management/api/ClusterManagementRealizationException,false,resu
org/apache/geode/management/api/ClusterManagementResult$StatusCode,false
org/apache/geode/management/api/CommandType,false
org/apache/geode/management/api/RealizationResult,false,memberName:java/lang/String,message:java/lang/String,success:boolean
-org/apache/geode/management/configuration/AbstractConfiguration,false
+org/apache/geode/management/configuration/AbstractConfiguration,true,-6612840641128145954
org/apache/geode/management/configuration/AutoSerializer,true,1,patterns:java/util/List,portable:java/lang/Boolean
org/apache/geode/management/configuration/ClassName,true,1,className:java/lang/String,initProperties:java/util/Properties
-org/apache/geode/management/configuration/Deployment,false,deployedBy:java/lang/String,deployedTime:java/lang/String,fileName:java/lang/String
+org/apache/geode/management/configuration/Deployment,true,6992732279452865384,deployedBy:java/lang/String,deployedTime:java/lang/String,jarFileName:java/lang/String
org/apache/geode/management/configuration/GatewayReceiver,false,endPort:java/lang/Integer,gatewayTransportFilters:java/util/List,manualStart:java/lang/Boolean,maximumTimeBetweenPings:java/lang/Integer,socketBufferSize:java/lang/Integer,startPort:java/lang/Integer
org/apache/geode/management/configuration/GroupableConfiguration,false,group:java/lang/String
org/apache/geode/management/configuration/Index,false,expression:java/lang/String,indexType:org/apache/geode/management/configuration/IndexType,name:java/lang/String,regionPath:java/lang/String