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

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


The following commit(s) were added to refs/heads/trunk by this push:
     new c30369268f OAK-11619 - Fix flaky ConcurrentMultiplexingIndexWriterTest
c30369268f is described below

commit c30369268f0f420dba746a688546d621b4a4e147
Author: Nuno Santos <[email protected]>
AuthorDate: Fri Mar 21 22:10:25 2025 +0100

    OAK-11619 - Fix flaky ConcurrentMultiplexingIndexWriterTest
---
 .../index/lucene/LuceneIndexWriterFactory.java     |  2 +-
 .../ConcurrentMultiplexingIndexWriterTest.java     | 63 +++++++++++-----------
 2 files changed, 32 insertions(+), 33 deletions(-)

diff --git 
a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexWriterFactory.java
 
b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexWriterFactory.java
index 024544ddab..43960f6c11 100644
--- 
a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexWriterFactory.java
+++ 
b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexWriterFactory.java
@@ -26,7 +26,7 @@ import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.lucene.index.IndexableField;
 
-public interface LuceneIndexWriterFactory extends 
FulltextIndexWriterFactory<Iterable<? extends IndexableField>> {
+public interface LuceneIndexWriterFactory extends 
FulltextIndexWriterFactory<Iterable<? extends IndexableField>>, AutoCloseable {
     @Override
     LuceneIndexWriter newInstance(IndexDefinition definition, NodeBuilder 
definitionBuilder, CommitInfo commitInfo, boolean reindex);
 }
diff --git 
a/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/writer/ConcurrentMultiplexingIndexWriterTest.java
 
b/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/writer/ConcurrentMultiplexingIndexWriterTest.java
index f9ff1d9f07..8828c010bf 100644
--- 
a/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/writer/ConcurrentMultiplexingIndexWriterTest.java
+++ 
b/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/writer/ConcurrentMultiplexingIndexWriterTest.java
@@ -26,8 +26,8 @@ import java.io.File;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
 
+import org.apache.jackrabbit.oak.commons.concurrent.ExecutorCloser;
 import org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexDefinition;
 import org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexWriterFactory;
 import 
org.apache.jackrabbit.oak.plugins.index.lucene.directory.DefaultDirectoryFactory;
@@ -44,54 +44,53 @@ public class ConcurrentMultiplexingIndexWriterTest {
     @Rule
     public TemporaryFolder folder = new TemporaryFolder(new File("target"));
 
-    private NodeState root = INITIAL_CONTENT;
-    private NodeBuilder builder = EMPTY_NODE.builder();
-    private LuceneIndexDefinition defn = new LuceneIndexDefinition(root, 
builder.getNodeState(), "/foo");
-    private MountInfoProvider mip = Mounts.newBuilder()
+    private final NodeState root = INITIAL_CONTENT;
+    private final NodeBuilder builder = EMPTY_NODE.builder();
+    private final LuceneIndexDefinition defn = new LuceneIndexDefinition(root, 
builder.getNodeState(), "/foo");
+    private final MountInfoProvider mip = Mounts.newBuilder()
             .mount("foo", "/libs", "/apps")
             .readOnlyMount("ro", "/ro-tree")
             .build();
-    private LuceneIndexWriterConfig writerConfig = new 
LuceneIndexWriterConfig();
+    private final LuceneIndexWriterConfig writerConfig = new 
LuceneIndexWriterConfig();
 
     @Test
     public void concurrentWrite() throws Exception{
-        LuceneIndexWriterFactory factory = newDirectoryFactory();
-        final LuceneIndexWriter writer = factory.newInstance(defn, builder, 
null, true);
-        
         int THREAD_COUNT = 100;
         final int LOOP_COUNT = 10;
         ExecutorService executorService = 
Executors.newFixedThreadPool(THREAD_COUNT);
         CountDownLatch startLatch = new CountDownLatch(1);
         CountDownLatch doneLatch = new CountDownLatch(THREAD_COUNT);
         Exception[] firstException = new Exception[1];
-        
-        for (int i = 0; i < THREAD_COUNT; i++) {
-            executorService.submit(() -> {
-                try {
-                    // wait for the signal
-                    startLatch.await(); 
-                    for (int j = 0; j < LOOP_COUNT; j++) {
-                        writer.updateDocument("/libs/config", 
newDoc("/libs/config"));
+
+        try (LuceneIndexWriterFactory factory = newDirectoryFactory()) {
+            LuceneIndexWriter writer = factory.newInstance(defn, builder, 
null, true);
+            for (int i = 0; i < THREAD_COUNT; i++) {
+                executorService.submit(() -> {
+                    try {
+                        // wait for the signal
+                        startLatch.await();
+                        for (int j = 0; j < LOOP_COUNT; j++) {
+                            writer.updateDocument("/libs/config", 
newDoc("/libs/config"));
+                        }
+                    } catch (InterruptedException e) {
+                        Thread.currentThread().interrupt();
+                    } catch (Exception e) {
+                        firstException[0] = e;
+                    } finally {
+                        doneLatch.countDown();
                     }
-                } catch (InterruptedException e) {
-                    Thread.currentThread().interrupt();
-                } catch (Exception e) {
-                    firstException[0] = e;
-                } finally {
-                    doneLatch.countDown();
-                }
-            });
+                });
+            }
+            // signal
+            startLatch.countDown();
+            doneLatch.await();
+            writer.close(0);
         }
-        // signal
-        startLatch.countDown();
-        doneLatch.await();
-        executorService.shutdown();
-        executorService.awaitTermination(10, TimeUnit.SECONDS);
+        new ExecutorCloser(executorService).close();
         if (firstException[0] != null) {
             throw firstException[0];
         }
-        writer.close(0);
-    }    
+    }
 
     private LuceneIndexWriterFactory newDirectoryFactory(){
         return newDirectoryFactory(mip);

Reply via email to