more iterator tests

This commit is contained in:
2025-02-23 16:38:36 +01:00
parent 05901f1acc
commit 74e5ee0925

View File

@@ -574,6 +574,160 @@ public class ObjectsTest {
curTx.delete(new JObjectKey(key3));
curTx.delete(new JObjectKey(key4));
});
txm.run(() -> {
var iter = curTx.getIterator(IteratorStart.GT, new JObjectKey(key));
Assertions.assertTrue(!iter.hasNext() || !iter.next().getKey().name().startsWith(key));
});
}
@RepeatedTest(100)
void concurrentIterator2() {
var key = "ConcurrentIterator2";
var key1 = key + "_1";
var key2 = key + "_2";
var key3 = key + "_3";
var key4 = key + "_4";
txm.run(() -> {
curTx.put(new Parent(JObjectKey.of(key), "John"));
curTx.put(new Parent(JObjectKey.of(key1), "John1"));
curTx.put(new Parent(JObjectKey.of(key2), "John2"));
curTx.put(new Parent(JObjectKey.of(key4), "John4"));
});
var barrier = new CyclicBarrier(2);
var barrier2 = new CyclicBarrier(2);
Just.runAll(() -> {
barrier.await();
txm.run(() -> {
Log.info("Thread 1 starting tx");
try {
barrier2.await();
} catch (Exception e) {
throw new RuntimeException(e);
}
curTx.put(new Parent(JObjectKey.of(key2), "John5"));
curTx.put(new Parent(JObjectKey.of(key3), "John3"));
Log.info("Thread 1 committing");
});
Log.info("Thread 1 commited");
return null;
}, () -> {
txm.run(() -> {
Log.info("Thread 2 starting tx");
try {
barrier.await();
barrier2.await();
var iter = curTx.getIterator(IteratorStart.GT, new JObjectKey(key));
var got = iter.next();
Assertions.assertEquals(key1, got.getKey().name());
got = iter.next();
Assertions.assertEquals(key2, got.getKey().name());
Assertions.assertEquals("John2", ((Parent) got.getValue()).name());
got = iter.next();
Assertions.assertEquals(key4, got.getKey().name());
} catch (Exception e) {
throw new RuntimeException(e);
}
});
Log.info("Thread 2 finished");
return null;
});
Log.info("All threads finished");
txm.run(() -> {
var iter = curTx.getIterator(IteratorStart.GT, new JObjectKey(key));
var got = iter.next();
Assertions.assertEquals(key1, got.getKey().name());
got = iter.next();
Assertions.assertEquals(key2, got.getKey().name());
Assertions.assertEquals("John5", ((Parent) got.getValue()).name());
got = iter.next();
Assertions.assertEquals(key3, got.getKey().name());
got = iter.next();
Assertions.assertEquals(key4, got.getKey().name());
});
txm.run(() -> {
curTx.delete(new JObjectKey(key));
curTx.delete(new JObjectKey(key1));
curTx.delete(new JObjectKey(key2));
curTx.delete(new JObjectKey(key3));
curTx.delete(new JObjectKey(key4));
});
txm.run(() -> {
var iter = curTx.getIterator(IteratorStart.GT, new JObjectKey(key));
Assertions.assertTrue(!iter.hasNext() || !iter.next().getKey().name().startsWith(key));
});
}
@RepeatedTest(100)
void concurrentIterator3() {
var key = "ConcurrentIterator3";
var key1 = key + "_1";
var key2 = key + "_2";
var key3 = key + "_3";
var key4 = key + "_4";
txm.run(() -> {
curTx.put(new Parent(JObjectKey.of(key), "John"));
curTx.put(new Parent(JObjectKey.of(key1), "John1"));
curTx.put(new Parent(JObjectKey.of(key2), "John2"));
curTx.put(new Parent(JObjectKey.of(key4), "John4"));
});
var barrier = new CyclicBarrier(2);
var barrier2 = new CyclicBarrier(2);
Just.runAll(() -> {
barrier.await();
txm.run(() -> {
Log.info("Thread 1 starting tx");
try {
barrier2.await();
} catch (Exception e) {
throw new RuntimeException(e);
}
curTx.put(new Parent(JObjectKey.of(key3), "John3"));
curTx.delete(new JObjectKey(key2));
Log.info("Thread 1 committing");
});
Log.info("Thread 1 commited");
return null;
}, () -> {
txm.run(() -> {
Log.info("Thread 2 starting tx");
try {
barrier.await();
barrier2.await();
var iter = curTx.getIterator(IteratorStart.GT, new JObjectKey(key));
var got = iter.next();
Assertions.assertEquals(key1, got.getKey().name());
got = iter.next();
Assertions.assertEquals(key2, got.getKey().name());
Assertions.assertEquals("John2", ((Parent) got.getValue()).name());
got = iter.next();
Assertions.assertEquals(key4, got.getKey().name());
} catch (Exception e) {
throw new RuntimeException(e);
}
});
Log.info("Thread 2 finished");
return null;
});
Log.info("All threads finished");
txm.run(() -> {
var iter = curTx.getIterator(IteratorStart.GT, new JObjectKey(key));
var got = iter.next();
Assertions.assertEquals(key1, got.getKey().name());
got = iter.next();
Assertions.assertEquals(key3, got.getKey().name());
got = iter.next();
Assertions.assertEquals(key4, got.getKey().name());
});
txm.run(() -> {
curTx.delete(new JObjectKey(key));
curTx.delete(new JObjectKey(key1));
curTx.delete(new JObjectKey(key3));
curTx.delete(new JObjectKey(key4));
});
txm.run(() -> {
var iter = curTx.getIterator(IteratorStart.GT, new JObjectKey(key));
Assertions.assertTrue(!iter.hasNext() || !iter.next().getKey().name().startsWith(key));
});
}
// }