[ 
https://issues.apache.org/jira/browse/GEODE-8609?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17214862#comment-17214862
 ] 

ASF GitHub Bot commented on GEODE-8609:
---------------------------------------

jdeppe-pivotal commented on a change in pull request #5625:
URL: https://github.com/apache/geode/pull/5625#discussion_r505718687



##########
File path: 
geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitLauncher.java
##########
@@ -343,59 +339,120 @@ public static void init(MasterRemote master) {
     System.setProperty(LAUNCHED_PROPERTY, "true");
   }
 
+  private static List<File> getDunitSuspectFiles() {
+    File[] suspectFiles = getDunitSuspectsDir()
+        .listFiles((dir, name) -> name.startsWith(SUSPECT_FILENAME_PREFIX));
+
+    return Arrays.asList(suspectFiles);
+  }
+
+  private static File getDunitSuspectsDir() {
+    return Paths.get(getWorkspaceDir()).toFile();
+  }
+
+  private static void deleteDunitSuspectFiles() {
+    getDunitSuspectFiles().forEach(File::delete);
+  }
+
+  private static File createDunitSuspectFile(int vmId, String workingDir) {
+    String suffix;
+
+    switch (vmId) {
+      case -2:
+        suffix = "locator";
+        break;
+      case -1:
+        suffix = "local";
+        break;
+      default:
+        suffix = "vm" + vmId;
+    }
+
+    File dunitSuspect = new File(getDunitSuspectsDir(),
+        String.format("%s-%s.log", SUSPECT_FILENAME_PREFIX, suffix));
+    dunitSuspect.deleteOnExit();
+
+    return dunitSuspect;
+  }
+
+  private static String getWorkspaceDir() {
+    String workspaceDir = 
System.getProperty(DUnitLauncher.WORKSPACE_DIR_PARAM);
+    workspaceDir = workspaceDir == null ? new File(".").getAbsolutePath() : 
workspaceDir;
+
+    return workspaceDir;
+  }
+
   public static void closeAndCheckForSuspects() {
-    if (isLaunched()) {
-      final List<Pattern> expectedStrings = ExpectedStrings.create("dunit");
-      final LogConsumer logConsumer = new LogConsumer(true, expectedStrings, 
"log4j", 5);
+    if (!isLaunched()) {
+      return;
+    }
 
-      final StringBuilder suspectStringBuilder = new StringBuilder();
+    List<File> suspectFiles = getDunitSuspectFiles();
 
-      BufferedReader buffReader = null;
-      FileChannel fileChannel = null;
-      try {
-        fileChannel = new FileOutputStream(DUNIT_SUSPECT_FILE, 
true).getChannel();
-        buffReader = new BufferedReader(new FileReader(DUNIT_SUSPECT_FILE));
-      } catch (FileNotFoundException e) {
-        System.err.println("Could not find the suspect string output file: " + 
e);
-        return;
-      }
+    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.");
+    }
+
+    for (File suspect : suspectFiles) {
+      checkSuspectFile(suspect);
+    }
+  }
+
+  public static void checkSuspectFile(File suspectFile) {
+    final List<Pattern> expectedStrings = ExpectedStrings.create("dunit");
+    final LogConsumer logConsumer = new LogConsumer(true, expectedStrings,
+        suspectFile.getName(), 5);
+
+    final StringBuilder suspectStringBuilder = new StringBuilder();
+
+    BufferedReader buffReader;
+    FileChannel fileChannel;
+    try {
+      fileChannel = new FileOutputStream(suspectFile, true).getChannel();
+      buffReader = new BufferedReader(new FileReader(suspectFile));
+    } catch (FileNotFoundException e) {
+      System.err.println("Could not find the suspect string output file: " + 
e);
+      return;
+    }
+
+    try {
+      String line;
       try {
-        String line;
-        try {
-          while ((line = buffReader.readLine()) != null) {
-            final StringBuilder builder = logConsumer.consume(line);
-            if (builder != null) {
-              suspectStringBuilder.append(builder);
-            }
+        while ((line = buffReader.readLine()) != null) {
+          final StringBuilder builder = logConsumer.consume(line);
+          if (builder != null) {
+            suspectStringBuilder.append(builder);
           }
-        } catch (IOException e) {
-          System.err.println("Could not read the suspect string output file: " 
+ e);
         }
+      } catch (IOException e) {
+        System.err.println("Could not read the suspect string output file: " + 
e);
+      }
 
-        try {
-          fileChannel.truncate(0);
-        } catch (IOException e) {
-          System.err.println("Could not truncate the suspect string output 
file: " + e);
-        }
+      try {
+        fileChannel.truncate(0);
+      } catch (IOException e) {
+        System.err.println("Could not truncate the suspect string output file: 
" + e);
+      }
 
-      } finally {
-        try {
-          buffReader.close();
-          fileChannel.close();
-        } catch (IOException e) {
-          System.err.println("Could not close the suspect string output file: 
" + e);
-        }
+    } finally {
+      try {
+        buffReader.close();
+        fileChannel.close();
+      } catch (IOException e) {
+        System.err.println("Could not close the suspect string output file: " 
+ e);
       }
+    }
 
-      if (suspectStringBuilder.length() != 0) {
-        System.err.println("Suspicious strings were written to the log during 
this run.\n"
-            + "Fix the strings or use IgnoredException.addIgnoredException to 
ignore.\n"
-            + suspectStringBuilder);
+    if (suspectStringBuilder.length() != 0) {

Review comment:
       Good point! Functionally it's fixed but I will also apply your other 
suggestion.




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


> Create a dunit suspect file per VM
> ----------------------------------
>
>                 Key: GEODE-8609
>                 URL: https://issues.apache.org/jira/browse/GEODE-8609
>             Project: Geode
>          Issue Type: Test
>          Components: tests
>            Reporter: Jens Deppe
>            Assignee: Jens Deppe
>            Priority: Major
>              Labels: pull-request-available
>
> In some situations, especially when restarting Dunit VMs, it appears that the 
> suspect log file can be corrupted since suspect processing reports errors 
> such as:
> {noformat}
> org.apache.geode.redis.internal.executor.CrashAndNoRepeatDUnitTest > 
> classMethod FAILED
>     java.lang.AssertionError: Suspicious strings were written to the log 
> during this run.
>     Fix the strings or use IgnoredException.addIgnoredException to ignore.
>     -----------------------------------------------------------------------
>     Found suspect string in log4j at line 19594      
> /home/geode/.gradle/caches/modules-2/files-2.1/antlr/antlr/2.7.7/83cd2cd674a21[warn
>  2020/10/11 15:23:24.988 GMT <GeodeRedisServer-Command-2> tid=105] Execution 
> of Redis command APPEND append-key-1 -append-key-1-17484-  failed: 
> org.apache.geode.cache.execute.FunctionException: 
> org.apache.geode.cache.execute.FunctionInvocationTargetException: 
> memberDeparted event for < 172.17.0.20(server-3:2004)<v15>:41003 > crashed, 
> true{noformat}
> Where the suspected string is corrupted.
> The proposed fix will create a new dunit_suspect log for each VM. The logs 
> will now be named {{dunit_suspect-vm<VMID>.log}}. The {{locator}} vm and the 
> test runner vm will have logs named {{dunit_suspect-locator.log}} and 
> {{dunit_suspect-local.log}} respectively.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to