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

reschke pushed a commit to branch OAK-11156
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git

commit 8ffe82537921f518e8f6aeee49c41f276f730510
Author: Julian Reschke <[email protected]>
AuthorDate: Sat Sep 28 15:29:39 2024 +0100

    OAK-11156: VersionGarbageCollectorIT fails to dispose some DocumentStore 
instances
---
 .../document/VersionGarbageCollectorIT.java        | 43 +++++++++++++++++++---
 1 file changed, 37 insertions(+), 6 deletions(-)

diff --git 
a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorIT.java
 
b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorIT.java
index 8d794747c4..4a53a8774e 100644
--- 
a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorIT.java
+++ 
b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorIT.java
@@ -130,7 +130,9 @@ import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Ignore;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TestName;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameter;
@@ -140,6 +142,9 @@ import org.slf4j.LoggerFactory;
 @RunWith(Parameterized.class)
 public class VersionGarbageCollectorIT {
 
+    @Rule
+    public TestName name = new TestName();
+
     private static final Logger LOG = 
LoggerFactory.getLogger(VersionGarbageCollectorIT.class);
 
     static class GCCounts {
@@ -198,12 +203,16 @@ public class VersionGarbageCollectorIT {
 
     private DocumentNodeStore store1, store2;
 
+    private List<DocumentStore> documentStoresToBeDisposedAfter = new 
ArrayList<>();
+
     private VersionGarbageCollector gc;
 
     private ExecutorService execService;
 
     private FullGCMode originalFullGcMode;
 
+    private long startTime = System.currentTimeMillis();
+
     @Parameterized.Parameters(name="{index}: {0} with {1}")
     public static java.util.Collection<Object[]> params() throws IOException {
         java.util.Collection<Object[]> params = new LinkedList<>();
@@ -250,7 +259,7 @@ public class VersionGarbageCollectorIT {
 
         originalFullGcMode = VersionGarbageCollector.getFullGcMode();
         writeStaticField(VersionGarbageCollector.class, "fullGcMode", 
fullGcMode, true);
-        LOG.info("setUp: DONE. fullGcMode = {}, fixture = {}", fullGcMode, 
fixture);
+        LOG.info("setUp: DONE. fullGcMode = {}, test = {}", fullGcMode, 
name.getMethodName());
     }
 
     @After
@@ -268,15 +277,32 @@ public class VersionGarbageCollectorIT {
         execService.shutdown();
         execService.awaitTermination(1, MINUTES);
         fixture.dispose();
-        LOG.info("tearDown: DONE. fullGcMode = {}, fixture = {}", fullGcMode, 
fixture);
+        for (DocumentStore ds : documentStoresToBeDisposedAfter) {
+            try {
+                LOG.info("Try to dispose {} used in test {}", ds, 
name.getMethodName());
+                ds.dispose();
+                LOG.info("Disposed {} used in test {}", ds, 
name.getMethodName());
+            } catch (Throwable e) {
+                LOG.error("Failed to dispose" + ds, e);
+            }
+        }
+
+        LOG.info("tearDown: DONE. fullGcMode = {}, test = {}, elapsed = {}ms", 
fullGcMode, name.getMethodName(),
+                System.currentTimeMillis() - startTime);
     }
 
-    private final String rdbTablePrefix = "T" + 
Long.toHexString(System.currentTimeMillis());
+    private final String internalRdbTablePrefix = "VGCIT" + 
Long.toHexString(startTime);
+
+    private String getRdbTablePrefix() {
+        // log which test case used which table prefix in case some leak
+        LOG.info("RDB table prefix for {} is {}", name.getMethodName(), 
internalRdbTablePrefix);
+        return internalRdbTablePrefix;
+    }
 
     private void createPrimaryStore() {
         if (fixture instanceof RDBFixture) {
             ((RDBFixture) fixture).setRDBOptions(
-                    new 
RDBOptions().tablePrefix(rdbTablePrefix).dropTablesOnClose(true));
+                    new 
RDBOptions().tablePrefix(getRdbTablePrefix()).dropTablesOnClose(true));
         }
         ds1 = fixture.createDocumentStore();
         documentMKBuilder = new 
DocumentMK.Builder().clock(clock).setClusterId(1)
@@ -296,10 +322,12 @@ public class VersionGarbageCollectorIT {
                 leaseCheckNode, withFailingDS);
         if (fixture instanceof RDBFixture) {
             ((RDBFixture) fixture).setRDBOptions(
-                    new 
RDBOptions().tablePrefix(rdbTablePrefix).dropTablesOnClose(false));
+                    // dropping the tables not needed here because done for 
the primary store
+                    new 
RDBOptions().tablePrefix(getRdbTablePrefix()).dropTablesOnClose(false));
         }
         ds2 = fixture.createDocumentStore();
         if (withFailingDS) {
+            documentStoresToBeDisposedAfter.add(ds2);
             FailingDocumentStore failingDs = new FailingDocumentStore(ds2);
             failingDs.noDispose();
             ds2 = failingDs;
@@ -943,7 +971,10 @@ public class VersionGarbageCollectorIT {
         if (store1 != null) {
             store1.dispose();
         }
-        final FailingDocumentStore fds = new 
FailingDocumentStore(fixture.createDocumentStore(), 42) {
+
+        DocumentStore hiddenStore = fixture.createDocumentStore();
+        documentStoresToBeDisposedAfter.add(hiddenStore);
+        final FailingDocumentStore fds = new FailingDocumentStore(hiddenStore, 
42) {
             @Override
             public void dispose() {}
         };

Reply via email to