mirror of
https://github.com/usatiuk/dhfs.git
synced 2025-10-28 12:37:48 +01:00
Compare commits
4 Commits
de211bb2d2
...
3eb7164c0f
| Author | SHA1 | Date | |
|---|---|---|---|
| 3eb7164c0f | |||
| f544a67fb5 | |||
| 964b3da951 | |||
| cb33472dc5 |
@@ -154,7 +154,7 @@ public class LazyFsIT {
|
|||||||
Thread.sleep(3000);
|
Thread.sleep(3000);
|
||||||
Log.info("Killing");
|
Log.info("Killing");
|
||||||
lazyFs1.crash();
|
lazyFs1.crash();
|
||||||
waitingConsumer1.waitUntil(frame -> frame.getUtf8String().contains("Caused by: org.lmdbjava"), 60, TimeUnit.SECONDS);
|
waitingConsumer1.waitUntil(frame -> frame.getUtf8String().contains("org.lmdbjava.LmdbNativeException"), 60, TimeUnit.SECONDS);
|
||||||
var client = DockerClientFactory.instance().client();
|
var client = DockerClientFactory.instance().client();
|
||||||
client.killContainerCmd(container1.getContainerId()).exec();
|
client.killContainerCmd(container1.getContainerId()).exec();
|
||||||
container1.stop();
|
container1.stop();
|
||||||
@@ -195,7 +195,7 @@ public class LazyFsIT {
|
|||||||
lazyFs1.crash();
|
lazyFs1.crash();
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
waitingConsumer1.waitUntil(frame -> frame.getUtf8String().contains("Caused by: org.lmdbjava"), 60, TimeUnit.SECONDS);
|
waitingConsumer1.waitUntil(frame -> frame.getUtf8String().contains("org.lmdbjava.LmdbNativeException"), 60, TimeUnit.SECONDS);
|
||||||
} catch (TimeoutException e) {
|
} catch (TimeoutException e) {
|
||||||
// Sometimes crash doesn't work
|
// Sometimes crash doesn't work
|
||||||
Log.info("Failed to crash: " + testInfo.getDisplayName());
|
Log.info("Failed to crash: " + testInfo.getDisplayName());
|
||||||
@@ -237,7 +237,7 @@ public class LazyFsIT {
|
|||||||
Thread.sleep(3000);
|
Thread.sleep(3000);
|
||||||
Log.info("Killing");
|
Log.info("Killing");
|
||||||
lazyFs1.crash();
|
lazyFs1.crash();
|
||||||
waitingConsumer1.waitUntil(frame -> frame.getUtf8String().contains("Caused by: org.lmdbjava"), 60, TimeUnit.SECONDS);
|
waitingConsumer1.waitUntil(frame -> frame.getUtf8String().contains("org.lmdbjava.LmdbNativeException"), 60, TimeUnit.SECONDS);
|
||||||
var client = DockerClientFactory.instance().client();
|
var client = DockerClientFactory.instance().client();
|
||||||
client.killContainerCmd(container1.getContainerId()).exec();
|
client.killContainerCmd(container1.getContainerId()).exec();
|
||||||
container1.stop();
|
container1.stop();
|
||||||
@@ -279,7 +279,7 @@ public class LazyFsIT {
|
|||||||
lazyFs1.crash();
|
lazyFs1.crash();
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
waitingConsumer1.waitUntil(frame -> frame.getUtf8String().contains("Caused by: org.lmdbjava"), 60, TimeUnit.SECONDS);
|
waitingConsumer1.waitUntil(frame -> frame.getUtf8String().contains("org.lmdbjava.LmdbNativeException"), 60, TimeUnit.SECONDS);
|
||||||
} catch (TimeoutException e) {
|
} catch (TimeoutException e) {
|
||||||
// Sometimes crash doesn't work
|
// Sometimes crash doesn't work
|
||||||
Log.info("Failed to crash: " + testInfo.getDisplayName());
|
Log.info("Failed to crash: " + testInfo.getDisplayName());
|
||||||
@@ -322,7 +322,7 @@ public class LazyFsIT {
|
|||||||
Log.info("Killing");
|
Log.info("Killing");
|
||||||
lazyFs2.crash();
|
lazyFs2.crash();
|
||||||
container1.execInContainer("/bin/sh", "-c", "touch /tmp/stopprinting1");
|
container1.execInContainer("/bin/sh", "-c", "touch /tmp/stopprinting1");
|
||||||
waitingConsumer2.waitUntil(frame -> frame.getUtf8String().contains("Caused by: org.lmdbjava"), 60, TimeUnit.SECONDS);
|
waitingConsumer2.waitUntil(frame -> frame.getUtf8String().contains("org.lmdbjava.LmdbNativeException"), 60, TimeUnit.SECONDS);
|
||||||
var client = DockerClientFactory.instance().client();
|
var client = DockerClientFactory.instance().client();
|
||||||
client.killContainerCmd(container2.getContainerId()).exec();
|
client.killContainerCmd(container2.getContainerId()).exec();
|
||||||
container2.stop();
|
container2.stop();
|
||||||
@@ -366,7 +366,7 @@ public class LazyFsIT {
|
|||||||
}
|
}
|
||||||
container1.execInContainer("/bin/sh", "-c", "touch /tmp/stopprinting2");
|
container1.execInContainer("/bin/sh", "-c", "touch /tmp/stopprinting2");
|
||||||
try {
|
try {
|
||||||
waitingConsumer2.waitUntil(frame -> frame.getUtf8String().contains("Caused by: org.lmdbjava"), 60, TimeUnit.SECONDS);
|
waitingConsumer2.waitUntil(frame -> frame.getUtf8String().contains("org.lmdbjava.LmdbNativeException"), 60, TimeUnit.SECONDS);
|
||||||
} catch (TimeoutException e) {
|
} catch (TimeoutException e) {
|
||||||
// Sometimes crash doesn't work
|
// Sometimes crash doesn't work
|
||||||
Log.info("Failed to crash: " + testInfo.getDisplayName());
|
Log.info("Failed to crash: " + testInfo.getDisplayName());
|
||||||
@@ -409,7 +409,7 @@ public class LazyFsIT {
|
|||||||
Log.info("Killing");
|
Log.info("Killing");
|
||||||
lazyFs2.crash();
|
lazyFs2.crash();
|
||||||
container1.execInContainer("/bin/sh", "-c", "touch /tmp/stopprinting1");
|
container1.execInContainer("/bin/sh", "-c", "touch /tmp/stopprinting1");
|
||||||
waitingConsumer2.waitUntil(frame -> frame.getUtf8String().contains("Caused by: org.lmdbjava"), 60, TimeUnit.SECONDS);
|
waitingConsumer2.waitUntil(frame -> frame.getUtf8String().contains("org.lmdbjava.LmdbNativeException"), 60, TimeUnit.SECONDS);
|
||||||
var client = DockerClientFactory.instance().client();
|
var client = DockerClientFactory.instance().client();
|
||||||
client.killContainerCmd(container2.getContainerId()).exec();
|
client.killContainerCmd(container2.getContainerId()).exec();
|
||||||
container2.stop();
|
container2.stop();
|
||||||
@@ -453,7 +453,7 @@ public class LazyFsIT {
|
|||||||
}
|
}
|
||||||
container1.execInContainer("/bin/sh", "-c", "touch /tmp/stopprinting2");
|
container1.execInContainer("/bin/sh", "-c", "touch /tmp/stopprinting2");
|
||||||
try {
|
try {
|
||||||
waitingConsumer2.waitUntil(frame -> frame.getUtf8String().contains("Caused by: org.lmdbjava"), 60, TimeUnit.SECONDS);
|
waitingConsumer2.waitUntil(frame -> frame.getUtf8String().contains("org.lmdbjava.LmdbNativeException"), 60, TimeUnit.SECONDS);
|
||||||
} catch (TimeoutException e) {
|
} catch (TimeoutException e) {
|
||||||
// Sometimes crash doesn't work
|
// Sometimes crash doesn't work
|
||||||
Log.info("Failed to crash: " + testInfo.getDisplayName());
|
Log.info("Failed to crash: " + testInfo.getDisplayName());
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
package com.usatiuk.objects.iterators;
|
package com.usatiuk.objects.iterators;
|
||||||
|
|
||||||
import com.usatiuk.utils.AutoCloseableNoThrow;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
public interface CloseableKvIterator<K extends Comparable<? super K>, V> extends Iterator<Pair<K, V>>, AutoCloseableNoThrow {
|
public interface CloseableKvIterator<K extends Comparable<? super K>, V> extends Iterator<Pair<K, V>>, AutoCloseable {
|
||||||
K peekNextKey();
|
K peekNextKey();
|
||||||
|
|
||||||
void skip();
|
void skip();
|
||||||
@@ -21,4 +20,7 @@ public interface CloseableKvIterator<K extends Comparable<? super K>, V> extends
|
|||||||
default CloseableKvIterator<K, V> reversed() {
|
default CloseableKvIterator<K, V> reversed() {
|
||||||
return new ReversedKvIterator<K, V>(this);
|
return new ReversedKvIterator<K, V>(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void close();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,19 +3,20 @@ package com.usatiuk.objects.snapshot;
|
|||||||
import com.usatiuk.objects.iterators.CloseableKvIterator;
|
import com.usatiuk.objects.iterators.CloseableKvIterator;
|
||||||
import com.usatiuk.objects.iterators.IteratorStart;
|
import com.usatiuk.objects.iterators.IteratorStart;
|
||||||
import com.usatiuk.objects.iterators.MaybeTombstone;
|
import com.usatiuk.objects.iterators.MaybeTombstone;
|
||||||
import com.usatiuk.objects.iterators.Tombstone;
|
|
||||||
import com.usatiuk.utils.AutoCloseableNoThrow;
|
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
public interface Snapshot<K extends Comparable<K>, V> extends AutoCloseableNoThrow {
|
public interface Snapshot<K extends Comparable<K>, V> extends AutoCloseable {
|
||||||
List<CloseableKvIterator<K, MaybeTombstone<V>>> getIterator(IteratorStart start, K key);
|
List<CloseableKvIterator<K, MaybeTombstone<V>>> getIterator(IteratorStart start, K key);
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
Optional<V> readObject(K name);
|
Optional<V> readObject(K name);
|
||||||
|
|
||||||
long id();
|
long id();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void close();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -178,12 +178,6 @@ public class LmdbObjectPersistentStore implements ObjectPersistentStore {
|
|||||||
return _root.toFile().getFreeSpace();
|
return _root.toFile().getFreeSpace();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getUsableSpace() {
|
|
||||||
verifyReady();
|
|
||||||
return _root.toFile().getUsableSpace();
|
|
||||||
}
|
|
||||||
|
|
||||||
private class LmdbKvIterator extends ReversibleKvIterator<JObjectKey, MaybeTombstone<ByteBuffer>> {
|
private class LmdbKvIterator extends ReversibleKvIterator<JObjectKey, MaybeTombstone<ByteBuffer>> {
|
||||||
private static final Cleaner CLEANER = Cleaner.create();
|
private static final Cleaner CLEANER = Cleaner.create();
|
||||||
private final Txn<ByteBuffer> _txn; // Managed by the snapshot
|
private final Txn<ByteBuffer> _txn; // Managed by the snapshot
|
||||||
|
|||||||
@@ -76,9 +76,4 @@ public class MemoryObjectPersistentStore implements ObjectPersistentStore {
|
|||||||
public long getFreeSpace() {
|
public long getFreeSpace() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getUsableSpace() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,4 @@ public interface ObjectPersistentStore {
|
|||||||
long getTotalSpace();
|
long getTotalSpace();
|
||||||
|
|
||||||
long getFreeSpace();
|
long getFreeSpace();
|
||||||
|
|
||||||
long getUsableSpace();
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,14 +5,13 @@ import com.usatiuk.objects.JDataVersionedWrapper;
|
|||||||
import com.usatiuk.objects.JObjectKey;
|
import com.usatiuk.objects.JObjectKey;
|
||||||
import com.usatiuk.objects.iterators.*;
|
import com.usatiuk.objects.iterators.*;
|
||||||
import com.usatiuk.objects.snapshot.Snapshot;
|
import com.usatiuk.objects.snapshot.Snapshot;
|
||||||
import com.usatiuk.utils.AutoCloseableNoThrow;
|
|
||||||
import com.usatiuk.utils.ListUtils;
|
import com.usatiuk.utils.ListUtils;
|
||||||
import io.quarkus.logging.Log;
|
import io.quarkus.logging.Log;
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
class TransactionImpl implements Transaction, AutoCloseableNoThrow {
|
class TransactionImpl implements Transaction, AutoCloseable {
|
||||||
private final Map<JObjectKey, Optional<JDataVersionedWrapper>> _readSet = new HashMap<>();
|
private final Map<JObjectKey, Optional<JDataVersionedWrapper>> _readSet = new HashMap<>();
|
||||||
private final NavigableMap<JObjectKey, TxRecord.TxObjectRecord<?>> _writes = new TreeMap<>();
|
private final NavigableMap<JObjectKey, TxRecord.TxObjectRecord<?>> _writes = new TreeMap<>();
|
||||||
private final List<Runnable> _onCommit = new LinkedList<>();
|
private final List<Runnable> _onCommit = new LinkedList<>();
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.usatiuk.objects.transaction;
|
package com.usatiuk.objects.transaction;
|
||||||
|
|
||||||
import com.usatiuk.utils.VoidFn;
|
|
||||||
import io.quarkus.logging.Log;
|
import io.quarkus.logging.Log;
|
||||||
|
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
@@ -41,9 +40,9 @@ public interface TransactionManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
default TransactionHandle runTries(VoidFn fn, int tries, boolean nest) {
|
default TransactionHandle runTries(Runnable fn, int tries, boolean nest) {
|
||||||
if (!nest && current() != null) {
|
if (!nest && current() != null) {
|
||||||
fn.apply();
|
fn.run();
|
||||||
return new TransactionHandle() {
|
return new TransactionHandle() {
|
||||||
@Override
|
@Override
|
||||||
public void onFlush(Runnable runnable) {
|
public void onFlush(Runnable runnable) {
|
||||||
@@ -56,7 +55,7 @@ public interface TransactionManager {
|
|||||||
begin();
|
begin();
|
||||||
boolean commit = false;
|
boolean commit = false;
|
||||||
try {
|
try {
|
||||||
fn.apply();
|
fn.run();
|
||||||
commit = true;
|
commit = true;
|
||||||
var ret = commit();
|
var ret = commit();
|
||||||
return ret;
|
return ret;
|
||||||
@@ -80,11 +79,11 @@ public interface TransactionManager {
|
|||||||
return runTries(supplier, tries, false);
|
return runTries(supplier, tries, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
default TransactionHandle runTries(VoidFn fn, int tries) {
|
default TransactionHandle runTries(Runnable fn, int tries) {
|
||||||
return runTries(fn, tries, false);
|
return runTries(fn, tries, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
default TransactionHandle run(VoidFn fn, boolean nest) {
|
default TransactionHandle run(Runnable fn, boolean nest) {
|
||||||
return runTries(fn, 10, nest);
|
return runTries(fn, 10, nest);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,7 +91,7 @@ public interface TransactionManager {
|
|||||||
return runTries(supplier, 10, nest);
|
return runTries(supplier, 10, nest);
|
||||||
}
|
}
|
||||||
|
|
||||||
default TransactionHandle run(VoidFn fn) {
|
default TransactionHandle run(Runnable fn) {
|
||||||
return run(fn, false);
|
return run(fn, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,7 +99,7 @@ public interface TransactionManager {
|
|||||||
return run(supplier, false);
|
return run(supplier, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
default void executeTx(VoidFn fn) {
|
default void executeTx(Runnable fn) {
|
||||||
run(fn, false);
|
run(fn, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
package com.usatiuk.utils;
|
|
||||||
|
|
||||||
@FunctionalInterface
|
|
||||||
public interface VoidFn {
|
|
||||||
void apply();
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
package com.usatiuk.utils;
|
|
||||||
|
|
||||||
@FunctionalInterface
|
|
||||||
public interface VoidFnThrows {
|
|
||||||
void apply() throws Throwable;
|
|
||||||
}
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user