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