From d4c6ab42cd541e97f79ec650b2a35d9b2401bf88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Avard=20Ottestad?= Date: Wed, 16 Jul 2025 13:34:41 +0200 Subject: [PATCH 1/2] GH-5374 check if the LmdbRecordIterator is closed after getting the read lock --- .../eclipse/rdf4j/sail/TripleSourceIterationWrapper.java | 6 ------ .../org/eclipse/rdf4j/sail/lmdb/LmdbRecordIterator.java | 9 +++++++++ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/TripleSourceIterationWrapper.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/TripleSourceIterationWrapper.java index 1a057dc595a..b588a055046 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/TripleSourceIterationWrapper.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/TripleSourceIterationWrapper.java @@ -48,9 +48,6 @@ public boolean hasNext() throws QueryEvaluationException { } catch (QueryEvaluationException e) { throw e; } catch (Exception e) { - if (e instanceof InterruptedException) { - Thread.currentThread().interrupt(); - } throw new QueryEvaluationException(e); } } @@ -75,9 +72,6 @@ public T next() throws QueryEvaluationException { } catch (IllegalStateException | QueryEvaluationException e) { throw e; } catch (Exception e) { - if (e instanceof InterruptedException) { - Thread.currentThread().interrupt(); - } throw new QueryEvaluationException(e); } } diff --git a/core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/LmdbRecordIterator.java b/core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/LmdbRecordIterator.java index dbdb69479f7..029f4a3ad3a 100644 --- a/core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/LmdbRecordIterator.java +++ b/core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/LmdbRecordIterator.java @@ -24,6 +24,7 @@ import java.io.IOException; import java.nio.ByteBuffer; +import java.util.NoSuchElementException; import java.util.concurrent.locks.StampedLock; import org.eclipse.rdf4j.sail.SailException; @@ -33,11 +34,14 @@ import org.lwjgl.PointerBuffer; import org.lwjgl.system.MemoryStack; import org.lwjgl.util.lmdb.MDBVal; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * A record iterator that wraps a native LMDB iterator. */ class LmdbRecordIterator implements RecordIterator { + private static final Logger log = LoggerFactory.getLogger(LmdbRecordIterator.class); private final Pool pool; private final TripleIndex index; @@ -126,6 +130,11 @@ class LmdbRecordIterator implements RecordIterator { public long[] next() { long stamp = txnLock.readLock(); try { + if (closed) { + log.debug("Calling next() on an LmdbRecordIterator that is already closed, returning null"); + return null; + } + if (txnRefVersion != txnRef.version()) { // cursor must be renewed mdb_cursor_renew(txn, cursor); From e9719f74d083d73033615480bf37b3986f8a50a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Avard=20Ottestad?= Date: Thu, 17 Jul 2025 08:33:47 +0200 Subject: [PATCH 2/2] code cleanup --- .../java/org/eclipse/rdf4j/sail/lmdb/LmdbRecordIterator.java | 2 -- .../src/main/java/org/eclipse/rdf4j/sail/lmdb/LmdbUtil.java | 2 -- .../main/java/org/eclipse/rdf4j/sail/lmdb/TxnRecordCache.java | 1 - .../org/eclipse/rdf4j/sail/lmdb/benchmark/QueryBenchmark.java | 2 +- 4 files changed, 1 insertion(+), 6 deletions(-) diff --git a/core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/LmdbRecordIterator.java b/core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/LmdbRecordIterator.java index 029f4a3ad3a..896df84de25 100644 --- a/core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/LmdbRecordIterator.java +++ b/core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/LmdbRecordIterator.java @@ -24,10 +24,8 @@ import java.io.IOException; import java.nio.ByteBuffer; -import java.util.NoSuchElementException; import java.util.concurrent.locks.StampedLock; -import org.eclipse.rdf4j.sail.SailException; import org.eclipse.rdf4j.sail.lmdb.TripleStore.TripleIndex; import org.eclipse.rdf4j.sail.lmdb.TxnManager.Txn; import org.eclipse.rdf4j.sail.lmdb.Varint.GroupMatcher; diff --git a/core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/LmdbUtil.java b/core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/LmdbUtil.java index 9a2c68f7083..25459309f3c 100644 --- a/core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/LmdbUtil.java +++ b/core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/LmdbUtil.java @@ -16,7 +16,6 @@ import static org.lwjgl.system.MemoryStack.stackPush; import static org.lwjgl.system.MemoryUtil.NULL; -import static org.lwjgl.util.lmdb.LMDB.MDB_DBS_FULL; import static org.lwjgl.util.lmdb.LMDB.MDB_KEYEXIST; import static org.lwjgl.util.lmdb.LMDB.MDB_NOTFOUND; import static org.lwjgl.util.lmdb.LMDB.MDB_RDONLY; @@ -32,7 +31,6 @@ import java.nio.ByteBuffer; import java.nio.IntBuffer; import java.util.Comparator; -import java.util.concurrent.ConcurrentHashMap; import org.lwjgl.PointerBuffer; import org.lwjgl.system.MemoryStack; diff --git a/core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/TxnRecordCache.java b/core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/TxnRecordCache.java index 73dff3fb1a8..9974f6a2df2 100644 --- a/core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/TxnRecordCache.java +++ b/core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/TxnRecordCache.java @@ -45,7 +45,6 @@ import java.nio.file.Path; import org.apache.commons.io.FileUtils; -import org.eclipse.rdf4j.sail.SailException; import org.lwjgl.PointerBuffer; import org.lwjgl.system.MemoryStack; import org.lwjgl.util.lmdb.MDBStat; diff --git a/core/sail/lmdb/src/test/java/org/eclipse/rdf4j/sail/lmdb/benchmark/QueryBenchmark.java b/core/sail/lmdb/src/test/java/org/eclipse/rdf4j/sail/lmdb/benchmark/QueryBenchmark.java index 1f9f3311d40..504b9cd3b5c 100644 --- a/core/sail/lmdb/src/test/java/org/eclipse/rdf4j/sail/lmdb/benchmark/QueryBenchmark.java +++ b/core/sail/lmdb/src/test/java/org/eclipse/rdf4j/sail/lmdb/benchmark/QueryBenchmark.java @@ -112,7 +112,7 @@ public class QueryBenchmark { public static void main(String[] args) throws RunnerException { Options opt = new OptionsBuilder() - .include("QueryBenchmark") // adapt to run other benchmark tests + .include("QueryBenchmark.*") // adapt to run other benchmark tests .forks(1) .build();