diff --git a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JObjectKey.java b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JObjectKey.java index 26e5b347..b702069b 100644 --- a/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JObjectKey.java +++ b/dhfs-parent/objects/src/main/java/com/usatiuk/dhfs/objects/JObjectKey.java @@ -1,6 +1,9 @@ package com.usatiuk.dhfs.objects; +import com.usatiuk.dhfs.supportlib.UninitializedByteBuffer; + import java.io.Serializable; +import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; public record JObjectKey(String name) implements Serializable, Comparable { @@ -22,7 +25,20 @@ public record JObjectKey(String name) implements Serializable, Comparable _env; - private Dbi _db; + private Env _env; + private Dbi _db; private boolean _ready = false; private static final String DB_NAME = "objects"; @@ -47,7 +48,7 @@ public class LmdbObjectPersistentStore implements ObjectPersistentStore { Log.info("Initializing with root " + _root); _root.toFile().mkdirs(); } - _env = create(ByteArrayProxy.PROXY_BA) + _env = create() .setMapSize(1_000_000_000_000L) .setMaxDbs(1) .open(_root.toFile(), EnvFlags.MDB_NOTLS); @@ -80,20 +81,20 @@ public class LmdbObjectPersistentStore implements ObjectPersistentStore { return List.of(); } + @Nonnull @Override public Optional readObject(JObjectKey name) { verifyReady(); - try (Txn txn = _env.txnRead()) { - var key = name.toString().getBytes(StandardCharsets.UTF_8); - var value = _db.get(txn, key); + try (Txn txn = _env.txnRead()) { + var value = _db.get(txn, name.toByteBuffer()); return Optional.ofNullable(value).map(ByteString::copyFrom); } } private class LmdbKvIterator implements CloseableKvIterator { - private final Txn _txn = _env.txnRead(); - private final Cursor _cursor = _db.openCursor(_txn); + private final Txn _txn = _env.txnRead(); + private final Cursor _cursor = _db.openCursor(_txn); private boolean _hasNext = false; private static final Cleaner CLEANER = Cleaner.create(); @@ -108,11 +109,12 @@ public class LmdbObjectPersistentStore implements ObjectPersistentStore { }); verifyReady(); - if (!_cursor.get(key.toString().getBytes(StandardCharsets.UTF_8), GetOp.MDB_SET_RANGE)) { + if (!_cursor.get(key.toByteBuffer(), GetOp.MDB_SET_RANGE)) { return; } - var got = JObjectKey.fromBytes(_cursor.key()); + var got = JObjectKey.fromByteBuffer(_cursor.key()); + _cursor.key().flip(); var cmp = got.compareTo(key); assert cmp >= 0; @@ -163,7 +165,7 @@ public class LmdbObjectPersistentStore implements ObjectPersistentStore { if (!_hasNext) { throw new NoSuchElementException("No more elements"); } - var ret = Pair.of(JObjectKey.fromBytes(_cursor.key()), ByteString.copyFrom(_cursor.val())); + var ret = Pair.of(JObjectKey.fromByteBuffer(_cursor.key()), ByteString.copyFrom(_cursor.val())); _hasNext = _cursor.next(); Log.tracev("Read: {0}, hasNext: {1}", ret, _hasNext); return ret; @@ -174,7 +176,9 @@ public class LmdbObjectPersistentStore implements ObjectPersistentStore { if (!_hasNext) { throw new NoSuchElementException("No more elements"); } - return JObjectKey.fromBytes(_cursor.key()); + var ret = JObjectKey.fromByteBuffer(_cursor.key()); + _cursor.key().flip(); + return ret; } } @@ -186,14 +190,16 @@ public class LmdbObjectPersistentStore implements ObjectPersistentStore { @Override public void commitTx(TxManifestRaw names) { verifyReady(); - try (Txn txn = _env.txnWrite()) { + try (Txn txn = _env.txnWrite()) { for (var written : names.written()) { - var key = written.getKey().toString().getBytes(StandardCharsets.UTF_8); - _db.put(txn, key, written.getValue().toByteArray()); + // TODO: + var bb = UninitializedByteBuffer.allocateUninitialized(written.getValue().size()); + bb.put(written.getValue().asReadOnlyByteBuffer()); + bb.flip(); + _db.put(txn, written.getKey().toByteBuffer(), bb); } for (JObjectKey key : names.deleted()) { - var keyBytes = key.toString().getBytes(StandardCharsets.UTF_8); - _db.delete(txn, keyBytes); + _db.delete(txn, key.toByteBuffer()); } txn.commit(); }