diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/CloseableKvIterator.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/CloseableKvIterator.java index 82227750..bcc3474c 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/CloseableKvIterator.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/CloseableKvIterator.java @@ -7,4 +7,6 @@ import java.util.Iterator; public interface CloseableKvIterator, V> extends Iterator>, AutoCloseableNoThrow { K peekNextKey(); + + void skip(); } diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/InconsistentKvIteratorWrapper.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/InconsistentKvIteratorWrapper.java index de5b6766..d3da5bfa 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/InconsistentKvIteratorWrapper.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/InconsistentKvIteratorWrapper.java @@ -30,6 +30,7 @@ public class InconsistentKvIteratorWrapper, V> implement } private void refresh() { + Log.tracev("Refreshing iterator: {0}", _backing); _backing.close(); if (_peekedKey != null) { _backing = _iteratorSupplier.apply(Pair.of(IteratorStart.GE, _peekedKey)); @@ -69,6 +70,25 @@ public class InconsistentKvIteratorWrapper, V> implement } } + @Override + public void skip() { + while (true) { + try { + _lastReturnedKey = _backing.peekNextKey(); + _backing.skip(); + _peekedNext = false; + _peekedKey = null; + return; + } catch (NoSuchElementException ignored) { + assert !_peekedNext; + throw ignored; + } catch (StaleIteratorException ignored) { + refresh(); + continue; + } + } + } + @Override public void close() { _backing.close(); diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/InconsistentSelfRefreshingKvIterator.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/InconsistentSelfRefreshingKvIterator.java index 41088677..c296f255 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/InconsistentSelfRefreshingKvIterator.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/InconsistentSelfRefreshingKvIterator.java @@ -91,6 +91,20 @@ public class InconsistentSelfRefreshingKvIterator, V> im } } + @Override + public void skip() { + _lock.lock(); + try { + maybeRefresh(); + _lastReturnedKey = _backing.peekNextKey(); + _backing.skip(); + _peekedNext = false; + _peekedKey = null; + } finally { + _lock.unlock(); + } + } + @Override public void close() { _backing.close(); diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/InvalidatableKvIterator.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/InvalidatableKvIterator.java index 712499c3..a83b36a4 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/InvalidatableKvIterator.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/InvalidatableKvIterator.java @@ -37,6 +37,17 @@ public class InvalidatableKvIterator, V> implements Clos } } + @Override + public void skip() { + _lock.lock(); + try { + checkVersion(); + _backing.skip(); + } finally { + _lock.unlock(); + } + } + @Override public void close() { _backing.close(); diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/MappingKvIterator.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/MappingKvIterator.java index f131e4f9..6a374c34 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/MappingKvIterator.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/MappingKvIterator.java @@ -18,6 +18,11 @@ public class MappingKvIterator, V, V_T> implements Close return _backing.peekNextKey(); } + @Override + public void skip() { + _backing.skip(); + } + @Override public void close() { _backing.close(); diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/MergingKvIterator.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/MergingKvIterator.java index f1c8b1fe..72736b89 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/MergingKvIterator.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/MergingKvIterator.java @@ -49,7 +49,7 @@ public class MergingKvIterator, V> implements CloseableK _sortedIterators.put(key, iterator); advanceIterator(them); } else { - iterator.next(); + iterator.skip(); advanceIterator(iterator); } } @@ -61,6 +61,17 @@ public class MergingKvIterator, V> implements CloseableK return _sortedIterators.firstKey(); } + @Override + public void skip() { + var cur = _sortedIterators.pollFirstEntry(); + if (cur == null) { + throw new NoSuchElementException(); + } + cur.getValue().skip(); + advanceIterator(cur.getValue()); + Log.tracev("{0} Skip: {1}, next: {2}", _name, cur, _sortedIterators); + } + @Override public void close() { for (CloseableKvIterator iterator : _iterators.keySet()) { @@ -81,7 +92,7 @@ public class MergingKvIterator, V> implements CloseableK } var curVal = cur.getValue().next(); advanceIterator(cur.getValue()); - Log.tracev("{0} Read: {1}, next: {2}", _name, curVal, _sortedIterators); + Log.tracev("{0} Read from {1}: {2}, next: {3}", _name, cur.getValue(), curVal, _sortedIterators); return curVal; } diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/NavigableMapKvIterator.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/NavigableMapKvIterator.java index 1ced2e15..f14c2997 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/NavigableMapKvIterator.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/NavigableMapKvIterator.java @@ -40,6 +40,15 @@ public class NavigableMapKvIterator, V> implements Close return _next.getKey(); } + @Override + public void skip() { + if (_next == null) { + throw new NoSuchElementException(); + } + _next = null; + fillNext(); + } + @Override public void close() { } diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/PredicateKvIterator.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/PredicateKvIterator.java index a6836983..b0be5636 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/PredicateKvIterator.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/PredicateKvIterator.java @@ -33,6 +33,14 @@ public class PredicateKvIterator, V, V_T> implements Clo return _next.getKey(); } + @Override + public void skip() { + if (_next == null) + throw new NoSuchElementException(); + _next = null; + fillNext(); + } + @Override public void close() { _backing.close(); diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/SelfRefreshingKvIterator.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/SelfRefreshingKvIterator.java index bf9691c3..f1d851d9 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/SelfRefreshingKvIterator.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/SelfRefreshingKvIterator.java @@ -91,6 +91,14 @@ public class SelfRefreshingKvIterator, V> implements Clo return _next.getKey(); } + @Override + public void skip() { + if (_next == null) { + throw new NoSuchElementException(); + } + prepareNext(); + } + @Override public void close() { _backing.close(); diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/SnapshotManager.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/SnapshotManager.java index e1aa640a..791b1221 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/SnapshotManager.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/SnapshotManager.java @@ -280,6 +280,14 @@ public class SnapshotManager { return _next.getKey(); } + @Override + public void skip() { + if (_next == null) + throw new NoSuchElementException(); + _next = null; + fillNext(); + } + @Override public void close() { _backing.close(); @@ -321,6 +329,11 @@ public class SnapshotManager { return _backing.peekNextKey(); } + @Override + public void skip() { + _backing.skip(); + } + @Override public void close() { _backing.close(); diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/TombstoneMergingKvIterator.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/TombstoneMergingKvIterator.java index 4d84d357..bcbbd681 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/TombstoneMergingKvIterator.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/TombstoneMergingKvIterator.java @@ -41,6 +41,11 @@ public class TombstoneMergingKvIterator, V> implements C return _backing.peekNextKey(); } + @Override + public void skip() { + _backing.skip(); + } + @Override public void close() { _backing.close(); diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/persistence/CachingObjectPersistentStore.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/persistence/CachingObjectPersistentStore.java index c7fbeb6d..04a40286 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/persistence/CachingObjectPersistentStore.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/persistence/CachingObjectPersistentStore.java @@ -155,6 +155,11 @@ public class CachingObjectPersistentStore { return _delegate.peekNextKey(); } + @Override + public void skip() { + _delegate.skip(); + } + @Override public void close() { _delegate.close(); @@ -179,6 +184,7 @@ public class CachingObjectPersistentStore { // Warning: it has a nasty side effect of global caching, so in this case don't even call next on it, // if some objects are still in writeback public CloseableKvIterator getIterator(IteratorStart start, JObjectKey key) { + Log.tracev("Getting cache iterator: {0}, {1}", start, key); _cacheVersionLock.readLock().lock(); try { return new InconsistentSelfRefreshingKvIterator<>( diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/persistence/LmdbObjectPersistentStore.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/persistence/LmdbObjectPersistentStore.java index aa7e7705..b8f7f270 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/persistence/LmdbObjectPersistentStore.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/persistence/LmdbObjectPersistentStore.java @@ -171,6 +171,11 @@ public class LmdbObjectPersistentStore implements ObjectPersistentStore { return ret; } + @Override + public void skip() { + _hasNext = _cursor.next(); + } + @Override public JObjectKey peekNextKey() { if (!_hasNext) { diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/persistence/SerializingObjectPersistentStore.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/persistence/SerializingObjectPersistentStore.java index 4eef745b..2ccddadf 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/persistence/SerializingObjectPersistentStore.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/persistence/SerializingObjectPersistentStore.java @@ -43,6 +43,11 @@ public class SerializingObjectPersistentStore { return _delegate.peekNextKey(); } + @Override + public void skip() { + _delegate.skip(); + } + @Override public void close() { _delegate.close(); diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/transaction/ReadTrackingObjectSourceFactory.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/transaction/ReadTrackingObjectSourceFactory.java index 65985dc6..a163bac6 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/transaction/ReadTrackingObjectSourceFactory.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/transaction/ReadTrackingObjectSourceFactory.java @@ -83,6 +83,11 @@ public class ReadTrackingObjectSourceFactory { return _backing.peekNextKey(); } + @Override + public void skip() { + _backing.skip(); + } + @Override public void close() { _backing.close(); diff --git a/dhfs-parent/objects/src/test/java/com/usatiuk/dhfs/objects/MergingKvIteratorTest.java b/dhfs-parent/objects/src/test/java/com/usatiuk/dhfs/objects/MergingKvIteratorTest.java index 2f7db033..45c73eea 100644 --- a/dhfs-parent/objects/src/test/java/com/usatiuk/dhfs/objects/MergingKvIteratorTest.java +++ b/dhfs-parent/objects/src/test/java/com/usatiuk/dhfs/objects/MergingKvIteratorTest.java @@ -33,6 +33,15 @@ public class MergingKvIteratorTest { return _next.getKey(); } + @Override + public void skip() { + if (_next == null) { + throw new NoSuchElementException(); + } + _next = null; + fillNext(); + } + @Override public void close() { }