You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by rs...@apache.org on 2021/02/02 12:08:28 UTC

[avro] branch master updated: AVRO-3033: Fix flaky file descriptor test (#1078)

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

rskraba pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/avro.git


The following commit(s) were added to refs/heads/master by this push:
     new 568ee67  AVRO-3033: Fix flaky file descriptor test (#1078)
568ee67 is described below

commit 568ee67c2d0c8d62049741ae78dc91910aa1b6f2
Author: RyanSkraba <ry...@skraba.com>
AuthorDate: Tue Feb 2 13:08:15 2021 +0100

    AVRO-3033: Fix flaky file descriptor test (#1078)
    
    It looks like before fixing the bug AVRO-2286, the number of openFilesBeforeOperation was always greater than openFilesAfterOperation. In practice, now they're usually the same value, which is promising evidence that there isn't a resource leak there.
    
    The flakiness of the test comes from the fact that "something" might be fuzzing either of them off by one. I used to see this in travis and local builds too (but infrequently). It might be a background, system-process or an action like garbage collection. I don't think it's instability of the machine, it's just not as deterministic as we'd like.
---
 .../java/org/apache/avro/TestDataFileReader.java   | 40 +++++++++++++---------
 1 file changed, 24 insertions(+), 16 deletions(-)

diff --git a/lang/java/avro/src/test/java/org/apache/avro/TestDataFileReader.java b/lang/java/avro/src/test/java/org/apache/avro/TestDataFileReader.java
index c222685..155ce6b 100644
--- a/lang/java/avro/src/test/java/org/apache/avro/TestDataFileReader.java
+++ b/lang/java/avro/src/test/java/org/apache/avro/TestDataFileReader.java
@@ -18,7 +18,6 @@
 package org.apache.avro;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.io.File;
@@ -45,23 +44,32 @@ public class TestDataFileReader {
   @Test
   // regression test for bug AVRO-2286
   public void testForLeakingFileDescriptors() throws IOException {
-    Path emptyFile = Files.createTempFile("empty", ".avro");
-    Files.deleteIfExists(emptyFile);
-    Files.createFile(emptyFile);
-
-    long openFilesBeforeOperation = getNumberOfOpenFileDescriptors();
-    try (DataFileReader<Object> reader = new DataFileReader<>(emptyFile.toFile(), new GenericDatumReader<>())) {
-      fail("Reading on empty file is supposed to fail.");
-    } catch (IOException e) {
-      // everything going as supposed to
-    }
-    Files.delete(emptyFile);
+    StringBuilder sb = new StringBuilder();
+    int maxTries = 3;
+    for (int tries = 0; tries < maxTries; tries++) {
+      Path emptyFile = Files.createTempFile("empty", ".avro");
+      Files.deleteIfExists(emptyFile);
+      Files.createFile(emptyFile);
+
+      long openFilesBeforeOperation = getNumberOfOpenFileDescriptors();
+      try (DataFileReader<Object> reader = new DataFileReader<>(emptyFile.toFile(), new GenericDatumReader<>())) {
+        fail("Reading on empty file is supposed to fail.");
+      } catch (IOException e) {
+        // everything going as supposed to
+      }
+      Files.delete(emptyFile);
 
-    long openFilesAfterOperation = getNumberOfOpenFileDescriptors();
+      long openFilesAfterOperation = getNumberOfOpenFileDescriptors();
+      if (openFilesBeforeOperation == openFilesAfterOperation)
+        return;
 
-    // Sometimes we have less open files because of a GC run during the test cycle.
-    assertTrue("File descriptor leaked from new DataFileReader() (expected:" + openFilesBeforeOperation + " actual:"
-        + openFilesAfterOperation + ")", openFilesBeforeOperation >= openFilesAfterOperation);
+      // Sometimes the number of file descriptors is off due to other processes or
+      // garbage
+      // collection. We note each inconsistency and retry.
+      sb.append(openFilesBeforeOperation).append("!=").append(openFilesAfterOperation).append(",");
+    }
+    fail("File descriptor leaked from new DataFileReader() over " + maxTries + " tries: ("
+        + sb.substring(0, sb.length() - 1) + ")");
   }
 
   private long getNumberOfOpenFileDescriptors() {