You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jp...@apache.org on 2022/01/11 14:25:13 UTC

[lucene] branch branch_9x updated: LUCENE-10369: Move DelegatingCacheHelper to FilterDirectoryReader (#596)

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

jpountz pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/lucene.git


The following commit(s) were added to refs/heads/branch_9x by this push:
     new 842ef16  LUCENE-10369: Move DelegatingCacheHelper to FilterDirectoryReader (#596)
842ef16 is described below

commit 842ef165e42bc7540676840697e13f28bf6e6230
Author: Nikola Grcevski <62...@users.noreply.github.com>
AuthorDate: Tue Jan 11 09:22:06 2022 -0500

    LUCENE-10369: Move DelegatingCacheHelper to FilterDirectoryReader (#596)
---
 .../apache/lucene/index/FilterDirectoryReader.java | 33 +++++++++++++
 .../index/SoftDeletesDirectoryReaderWrapper.java   | 22 ---------
 .../lucene/index/TestFilterDirectoryReader.java    | 54 ++++++++++++++++++++++
 3 files changed, 87 insertions(+), 22 deletions(-)

diff --git a/lucene/core/src/java/org/apache/lucene/index/FilterDirectoryReader.java b/lucene/core/src/java/org/apache/lucene/index/FilterDirectoryReader.java
index 42b8d24..725abda 100644
--- a/lucene/core/src/java/org/apache/lucene/index/FilterDirectoryReader.java
+++ b/lucene/core/src/java/org/apache/lucene/index/FilterDirectoryReader.java
@@ -147,4 +147,37 @@ public abstract class FilterDirectoryReader extends DirectoryReader {
   public DirectoryReader getDelegate() {
     return in;
   }
+
+  /**
+   * A DelegatingCacheHelper is a CacheHelper specialization for implementing long-lived caching
+   * behaviour for FilterDirectoryReader subclasses. It uses a unique CacheKey for the purpose of
+   * implementing the onClose listener delegation for the reader.
+   */
+  protected static class DelegatingCacheHelper implements CacheHelper {
+    private final CacheHelper delegate;
+    private final CacheKey cacheKey = new CacheKey();
+
+    /**
+     * Create a new DelegatingCacheHelper that delegates the cache onClose listener to another
+     * CacheHelper, but with its own unique CacheKey.
+     *
+     * @param delegate the CacheHelper to delegate the close listener to
+     */
+    protected DelegatingCacheHelper(CacheHelper delegate) {
+      this.delegate = delegate;
+    }
+
+    @Override
+    public CacheKey getKey() {
+      return cacheKey;
+    }
+
+    @Override
+    public void addClosedListener(ClosedListener listener) {
+      // here we wrap the listener and call it with our cache key
+      // this is important since this key will be used to cache the reader and otherwise we won't
+      // free caches etc.
+      delegate.addClosedListener(unused -> listener.onClose(cacheKey));
+    }
+  }
 }
diff --git a/lucene/core/src/java/org/apache/lucene/index/SoftDeletesDirectoryReaderWrapper.java b/lucene/core/src/java/org/apache/lucene/index/SoftDeletesDirectoryReaderWrapper.java
index fbf5171..e0998d21 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SoftDeletesDirectoryReaderWrapper.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SoftDeletesDirectoryReaderWrapper.java
@@ -259,26 +259,4 @@ public final class SoftDeletesDirectoryReaderWrapper extends FilterDirectoryRead
       return readerCacheHelper;
     }
   }
-
-  private static class DelegatingCacheHelper implements CacheHelper {
-    private final CacheHelper delegate;
-    private final CacheKey cacheKey = new CacheKey();
-
-    public DelegatingCacheHelper(CacheHelper delegate) {
-      this.delegate = delegate;
-    }
-
-    @Override
-    public CacheKey getKey() {
-      return cacheKey;
-    }
-
-    @Override
-    public void addClosedListener(ClosedListener listener) {
-      // here we wrap the listener and call it with our cache key
-      // this is important since this key will be used to cache the reader and otherwise we won't
-      // free caches etc.
-      delegate.addClosedListener(unused -> listener.onClose(cacheKey));
-    }
-  }
 }
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestFilterDirectoryReader.java b/lucene/core/src/test/org/apache/lucene/index/TestFilterDirectoryReader.java
index 620e5d3..6bd144d 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestFilterDirectoryReader.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestFilterDirectoryReader.java
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.index.FilterDirectoryReader.SubReaderWrapper;
@@ -143,4 +144,57 @@ public class TestFilterDirectoryReader extends LuceneTestCase {
     directoryReader.close();
     dir.close();
   }
+
+  private static class DummyLastingFilterDirectoryReader extends FilterDirectoryReader {
+    private final CacheHelper cacheHelper;
+
+    public DummyLastingFilterDirectoryReader(DirectoryReader in) throws IOException {
+      super(in, new DummySubReaderWrapper());
+      cacheHelper =
+          (in.getReaderCacheHelper() == null)
+              ? null
+              : new DelegatingCacheHelper(in.getReaderCacheHelper());
+    }
+
+    @Override
+    protected DirectoryReader doWrapDirectoryReader(DirectoryReader in) throws IOException {
+      return new DummyFilterDirectoryReader(in);
+    }
+
+    @Override
+    public CacheHelper getReaderCacheHelper() {
+      return cacheHelper;
+    }
+  }
+
+  public void testDelegatingCacheHelper() throws IOException {
+    Directory dir = newDirectory();
+    IndexWriter w = new IndexWriter(dir, newIndexWriterConfig());
+    w.addDocument(new Document());
+
+    DirectoryReader reader = DirectoryReader.open(w);
+    DirectoryReader wrapped = new DummyLastingFilterDirectoryReader(reader);
+
+    assertNotEquals(reader.getReaderCacheHelper(), wrapped.getReaderCacheHelper());
+    assertNotEquals(
+        reader.getReaderCacheHelper().getKey(), wrapped.getReaderCacheHelper().getKey());
+
+    AtomicInteger closeCalledCounter = new AtomicInteger(0);
+
+    wrapped
+        .getReaderCacheHelper()
+        .addClosedListener(
+            key -> {
+              closeCalledCounter.incrementAndGet();
+              assertSame(key, wrapped.getReaderCacheHelper().getKey());
+            });
+
+    reader.close();
+    assertEquals(1, closeCalledCounter.get());
+    wrapped.close();
+    assertEquals(1, closeCalledCounter.get());
+
+    w.close();
+    dir.close();
+  }
 }