You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by nn...@apache.org on 2021/07/20 16:13:44 UTC

[geode] branch support/1.14 updated: GEODE-8609: Check logs for suspicious logs when VM is stopped.

This is an automated email from the ASF dual-hosted git repository.

nnag pushed a commit to branch support/1.14
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/support/1.14 by this push:
     new 1637b7a  GEODE-8609: Check logs for suspicious logs when VM is stopped.
1637b7a is described below

commit 1637b7a3dce5edaa4317284e65d749e3333985e0
Author: Nabarun Nag <na...@cs.wisc.edu>
AuthorDate: Wed May 26 18:57:00 2021 -0700

    GEODE-8609: Check logs for suspicious logs when VM is stopped.
    
    	* When a VM is stopped, the suspect string file is deleted
    	* Log checker is called at the end of the test.
    	* If a VM is restarted during a test, the logs are deleted and is not checked at the end of the test.
    	* With the fix the logs are checked when the VM is stopped.
    
    (cherry picked from commit e39c4c5ad79ee07d7760c98a85259cfb68c64e4c)
---
 .../internal/SuspiciousLogCheckDUnitTest.java      | 92 ++++++++++++++++++++++
 .../geode/test/dunit/internal/DUnitLauncher.java   | 37 ++++++---
 .../geode/test/dunit/rules/ClusterStartupRule.java |  4 +-
 3 files changed, 120 insertions(+), 13 deletions(-)

diff --git a/geode-dunit/src/distributedTest/java/org/apache/geode/test/dunit/internal/SuspiciousLogCheckDUnitTest.java b/geode-dunit/src/distributedTest/java/org/apache/geode/test/dunit/internal/SuspiciousLogCheckDUnitTest.java
new file mode 100644
index 0000000..d096632
--- /dev/null
+++ b/geode-dunit/src/distributedTest/java/org/apache/geode/test/dunit/internal/SuspiciousLogCheckDUnitTest.java
@@ -0,0 +1,92 @@
+/*
+ * 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.test.dunit.internal;
+
+import static org.junit.Assert.fail;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.apache.logging.log4j.Logger;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import org.apache.geode.logging.internal.log4j.api.LogService;
+import org.apache.geode.test.dunit.rules.ClientVM;
+import org.apache.geode.test.dunit.rules.ClusterStartupRule;
+import org.apache.geode.test.dunit.rules.MemberVM;
+import org.apache.geode.test.junit.rules.VMProvider;
+import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactory;
+
+@RunWith(Parameterized.class)
+@Parameterized.UseParametersRunnerFactory(CategoryWithParameterizedRunnerFactory.class)
+public class SuspiciousLogCheckDUnitTest {
+
+  public SuspiciousLogCheckDUnitTest(String memberType) {
+    this.memberType = memberType;
+  }
+
+  @Parameterized.Parameters(name = "memberType_{0}")
+  public static Collection getMemberType() {
+    return Arrays.asList("locator", "server", "client");
+  }
+
+  public String memberType;
+
+  @Rule
+  public ClusterStartupRule clusterStartupRule = new ClusterStartupRule();
+
+  @Test
+  public void whenLocatorIsStoppedSuspiciousLogsMustBeChecked() throws Exception {
+    MemberVM locator = clusterStartupRule.startLocatorVM(0);
+    int locatorPort = locator.getPort();
+    VMProvider memberToCheck = null;
+    int vmIndex = -1;
+    switch (memberType) {
+      case "locator":
+        memberToCheck = locator;
+        vmIndex = 0;
+        break;
+      case "server":
+        MemberVM server =
+            clusterStartupRule.startServerVM(1, s -> s.withConnectionToLocator(locatorPort));
+        memberToCheck = server;
+        vmIndex = 1;
+        break;
+      case "client":
+        ClientVM client =
+            clusterStartupRule.startClientVM(2, c -> c.withLocatorConnection(locatorPort));
+        memberToCheck = client;
+        vmIndex = 2;
+        break;
+      default:
+        fail("Member type parameter is missing (accepted types are: locator,server,client)");
+    }
+    memberToCheck.invoke(() -> {
+      Logger logger = LogService.getLogger();
+      logger.fatal("Dummy fatal error message");
+    });
+    try {
+      clusterStartupRule.stop(vmIndex);
+      fail();
+    } catch (AssertionError error) {
+      // Assertion error is expected
+    } catch (Exception exception) {
+      fail();
+    }
+  }
+}
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitLauncher.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitLauncher.java
index 9a14733..25e9af4 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitLauncher.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitLauncher.java
@@ -370,7 +370,7 @@ public class DUnitLauncher {
     }
 
     File dunitSuspect = new File(getDunitSuspectsDir(),
-        String.format("%s-%s.log", SUSPECT_FILENAME_PREFIX, suffix));
+        getSuspectFileName(suffix));
     dunitSuspect.deleteOnExit();
 
     return dunitSuspect;
@@ -383,19 +383,19 @@ public class DUnitLauncher {
     return workspaceDir;
   }
 
-  public static void closeAndCheckForSuspects() {
-    if (!isLaunched()) {
-      return;
-    }
-
-    List<File> suspectFiles = getDunitSuspectFiles();
+  public static void closeAndCheckForSuspects(int vmIndex) {
+    String suffix = "vm" + vmIndex;
+    String fileName = getSuspectFileName(suffix);
+    File[] suspectFiles = getDunitSuspectsDir()
+        .listFiles((dir, name) -> name.startsWith(fileName));
+    closeAndCheckForSuspects(Arrays.asList(suspectFiles));
+  }
 
-    if (suspectFiles.isEmpty()) {
-      throw new IllegalStateException("No dunit suspect log files found in '"
-          + getDunitSuspectsDir().getAbsolutePath()
-          + "' - perhaps a rule that is cleaning up before suspect processing has already run.");
-    }
+  private static String getSuspectFileName(String suffix) {
+    return String.format("%s-%s.log", SUSPECT_FILENAME_PREFIX, suffix);
+  }
 
+  public static void closeAndCheckForSuspects(List<File> suspectFiles) {
     StringBuilder suspectStringCollector = new StringBuilder();
     for (File suspect : suspectFiles) {
       checkSuspectFile(suspect, suspectStringCollector);
@@ -412,6 +412,19 @@ public class DUnitLauncher {
     }
   }
 
+  public static void closeAndCheckForSuspects() {
+    if (!isLaunched()) {
+      return;
+    }
+    List<File> suspectFiles = getDunitSuspectFiles();
+    if (suspectFiles.isEmpty()) {
+      throw new IllegalStateException("No dunit suspect log files found in '"
+          + getDunitSuspectsDir().getAbsolutePath()
+          + "' - perhaps a rule that is cleaning up before suspect processing has already run.");
+    }
+    closeAndCheckForSuspects(suspectFiles);
+  }
+
   private static void checkSuspectFile(File suspectFile, StringBuilder suspectStringCollector) {
     final List<Pattern> expectedStrings = ExpectedStrings.create("dunit");
     final LogConsumer logConsumer = new LogConsumer(true, expectedStrings,
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/ClusterStartupRule.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/ClusterStartupRule.java
index c817f8c..fe96446 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/ClusterStartupRule.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/ClusterStartupRule.java
@@ -19,6 +19,7 @@ import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
 import static org.apache.geode.distributed.ConfigurationProperties.GROUPS;
 import static org.apache.geode.test.dunit.Host.getHost;
 import static org.apache.geode.test.dunit.internal.DUnitLauncher.NUM_VMS;
+import static org.apache.geode.test.dunit.internal.DUnitLauncher.closeAndCheckForSuspects;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -182,7 +183,7 @@ public class ClusterStartupRule implements SerializableTestRule {
     // any background thread can fill the dunit_suspect.log
     // after its been truncated if we do it before closing cache
     IgnoredException.removeAllExpectedExceptions();
-    DUnitLauncher.closeAndCheckForSuspects();
+    closeAndCheckForSuspects();
   }
 
 
@@ -351,6 +352,7 @@ public class ClusterStartupRule implements SerializableTestRule {
   }
 
   public void stop(int index, boolean cleanWorkingDir) {
+    closeAndCheckForSuspects(index);
     occupiedVMs.get(index).stop(cleanWorkingDir);
   }