diff --git a/debug-logging.properties b/debug-logging.properties new file mode 100644 index 0000000..4a15a28 --- /dev/null +++ b/debug-logging.properties @@ -0,0 +1,8 @@ +handlers= java.util.logging.ConsoleHandler +.level= INFO +java.util.logging.ConsoleHandler.level = ALL +java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter +java.util.logging.SimpleFormatter.format= [%1$tF %1$tT] [%4$-7s] %5$s %n + +# your specific logger level +db.requests.level = ALL diff --git a/src/main/java/it/cavallium/rockserver/core/client/EmbeddedConnection.java b/src/main/java/it/cavallium/rockserver/core/client/EmbeddedConnection.java index 7fc3c48..94d1a6d 100644 --- a/src/main/java/it/cavallium/rockserver/core/client/EmbeddedConnection.java +++ b/src/main/java/it/cavallium/rockserver/core/client/EmbeddedConnection.java @@ -1,5 +1,6 @@ package it.cavallium.rockserver.core.client; +import it.cavallium.rockserver.core.common.Keys; import it.cavallium.rockserver.core.common.RequestType; import it.cavallium.rockserver.core.common.RequestType.RequestGet; import it.cavallium.rockserver.core.common.RequestType.RequestPut; @@ -102,7 +103,7 @@ public class EmbeddedConnection extends BaseConnection implements RocksDBAPI { public T put(Arena arena, long transactionOrUpdateId, long columnId, - @NotNull MemorySegment @NotNull [] keys, + @NotNull Keys keys, @NotNull MemorySegment value, RequestPut requestType) throws RocksDBException { return db.put(arena, transactionOrUpdateId, columnId, keys, value, requestType); @@ -112,7 +113,7 @@ public class EmbeddedConnection extends BaseConnection implements RocksDBAPI { public List putMulti(Arena arena, long transactionOrUpdateId, long columnId, - @NotNull List<@NotNull MemorySegment @NotNull []> keys, + @NotNull List keys, @NotNull List<@NotNull MemorySegment> values, RequestPut requestType) throws RocksDBException { return db.putMulti(arena, transactionOrUpdateId, columnId, keys, values, requestType); @@ -122,7 +123,7 @@ public class EmbeddedConnection extends BaseConnection implements RocksDBAPI { public T get(Arena arena, long transactionOrUpdateId, long columnId, - MemorySegment @NotNull [] keys, + Keys keys, RequestGet requestType) throws RocksDBException { return db.get(arena, transactionOrUpdateId, columnId, keys, requestType); } @@ -131,8 +132,8 @@ public class EmbeddedConnection extends BaseConnection implements RocksDBAPI { public long openIterator(Arena arena, long transactionId, long columnId, - @NotNull MemorySegment @NotNull [] startKeysInclusive, - @Nullable MemorySegment[] endKeysExclusive, + @NotNull Keys startKeysInclusive, + @Nullable Keys endKeysExclusive, boolean reverse, long timeoutMs) throws RocksDBException { return db.openIterator(arena, transactionId, columnId, startKeysInclusive, endKeysExclusive, reverse, timeoutMs); @@ -144,7 +145,7 @@ public class EmbeddedConnection extends BaseConnection implements RocksDBAPI { } @Override - public void seekTo(Arena arena, long iterationId, MemorySegment @NotNull [] keys) throws RocksDBException { + public void seekTo(Arena arena, long iterationId, Keys keys) throws RocksDBException { db.seekTo(arena, iterationId, keys); } diff --git a/src/main/java/it/cavallium/rockserver/core/client/LoggingClient.java b/src/main/java/it/cavallium/rockserver/core/client/LoggingClient.java new file mode 100644 index 0000000..9979a02 --- /dev/null +++ b/src/main/java/it/cavallium/rockserver/core/client/LoggingClient.java @@ -0,0 +1,88 @@ +package it.cavallium.rockserver.core.client; + +import it.cavallium.rockserver.core.common.RocksDBAPICommand; +import it.cavallium.rockserver.core.common.RocksDBAsyncAPI; +import it.cavallium.rockserver.core.common.RocksDBSyncAPI; +import java.io.IOException; +import java.net.URI; +import java.util.concurrent.CompletionStage; +import java.util.function.Supplier; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class LoggingClient implements RocksDBConnection { + + private final RocksDBConnection client; + private final LoggingSyncApi syncApi; + private final LoggingAsyncApi asyncApi; + private final Logger logger; + + public LoggingClient(RocksDBConnection client) { + this.client = client; + this.syncApi = new LoggingSyncApi(client.getSyncApi()); + this.asyncApi = new LoggingAsyncApi(client.getAsyncApi()); + this.logger = Logger.getLogger("db.requests"); + } + + @Override + public URI getUrl() { + return client.getUrl(); + } + + @Override + public RocksDBSyncAPI getSyncApi() { + return syncApi; + } + + @Override + public RocksDBAsyncAPI getAsyncApi() { + return asyncApi; + } + + @Override + public void close() throws IOException { + client.close(); + } + + private class LoggingSyncApi implements RocksDBSyncAPI { + + private final RocksDBSyncAPI syncApi; + + public LoggingSyncApi(RocksDBSyncAPI syncApi) { + this.syncApi = syncApi; + } + + @Override + public R requestSync(RocksDBAPICommand req) { + R result; + try { + result = syncApi.requestSync(req); + } catch (Throwable e) { + logger.log(Level.FINEST, "Request failed: {0} Error: {1}", new Object[] {req, e.getMessage()}); + throw e; + } + logger.log(Level.FINEST, "Request executed: {0} Result: {1}", new Object[] {req, result}); + return result; + } + } + + private class LoggingAsyncApi implements RocksDBAsyncAPI { + + private final RocksDBAsyncAPI asyncApi; + + public LoggingAsyncApi(RocksDBAsyncAPI asyncApi) { + this.asyncApi = asyncApi; + } + + @Override + public CompletionStage requestAsync(RocksDBAPICommand req) { + return asyncApi.requestAsync(req).whenComplete((result, e) -> { + if (e != null) { + logger.log(Level.FINEST, "Request failed: {0} Error: {1}", new Object[] {req, e.getMessage()}); + } else { + logger.log(Level.FINEST, "Request executed: {0} Result: {1}", new Object[] {req, result}); + } + }); + } + } +} diff --git a/src/main/java/it/cavallium/rockserver/core/common/Keys.java b/src/main/java/it/cavallium/rockserver/core/common/Keys.java new file mode 100644 index 0000000..4b35d1d --- /dev/null +++ b/src/main/java/it/cavallium/rockserver/core/common/Keys.java @@ -0,0 +1,31 @@ +package it.cavallium.rockserver.core.common; + +import java.lang.foreign.MemorySegment; +import java.util.Arrays; +import java.util.stream.Collectors; +import org.jetbrains.annotations.NotNull; + +public record Keys(@NotNull MemorySegment @NotNull [] keys) { + + @Override + public String toString() { + return Arrays.stream(keys).map(Utils::toPrettyString).collect(Collectors.joining(";", "[", "]")); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Keys keys1 = (Keys) o; + return Arrays.equals(keys, keys1.keys); + } + + @Override + public int hashCode() { + return Arrays.hashCode(keys); + } +} diff --git a/src/main/java/it/cavallium/rockserver/core/common/RocksDBAPICommand.java b/src/main/java/it/cavallium/rockserver/core/common/RocksDBAPICommand.java index 3807a6c..9dd8961 100644 --- a/src/main/java/it/cavallium/rockserver/core/common/RocksDBAPICommand.java +++ b/src/main/java/it/cavallium/rockserver/core/common/RocksDBAPICommand.java @@ -5,6 +5,7 @@ import it.cavallium.rockserver.core.common.RequestType.RequestPut; import java.lang.foreign.Arena; import java.lang.foreign.MemorySegment; import java.util.List; +import java.util.StringJoiner; import java.util.concurrent.CompletionStage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -138,7 +139,7 @@ public sealed interface RocksDBAPICommand { record Put(Arena arena, long transactionOrUpdateId, long columnId, - @NotNull MemorySegment @NotNull [] keys, + Keys keys, @NotNull MemorySegment value, RequestPut requestType) implements RocksDBAPICommand { @@ -152,6 +153,18 @@ public sealed interface RocksDBAPICommand { return api.putAsync(arena, transactionOrUpdateId, columnId, keys, value, requestType); } + @Override + public String toString() { + var sb = new StringBuilder("PUT"); + if (transactionOrUpdateId != 0) { + sb.append(" tx:").append(transactionOrUpdateId); + } + sb.append(" column:").append(columnId); + sb.append(" keys:").append(keys); + sb.append(" value:").append(Utils.toPrettyString(value)); + sb.append(" expected:").append(requestType.getRequestTypeId()); + return sb.toString(); + } } /** * Put multiple elements into the specified positions @@ -163,7 +176,7 @@ public sealed interface RocksDBAPICommand { * @param requestType the request type determines which type of data will be returned. */ record PutMulti(Arena arena, long transactionOrUpdateId, long columnId, - @NotNull List<@NotNull MemorySegment @NotNull []> keys, + @NotNull List keys, @NotNull List<@NotNull MemorySegment> values, RequestPut requestType) implements RocksDBAPICommand> { @@ -177,6 +190,23 @@ public sealed interface RocksDBAPICommand { return api.putMultiAsync(arena, transactionOrUpdateId, columnId, keys, values, requestType); } + @Override + public String toString() { + var sb = new StringBuilder("PUT_MULTI"); + if (transactionOrUpdateId != 0) { + sb.append(" tx:").append(transactionOrUpdateId); + } + sb.append(" column:").append(columnId); + sb.append(" expected:").append(requestType.getRequestTypeId()); + sb.append(" multi:["); + for (int i = 0; i < keys.size(); i++) { + if (i > 0) sb.append(","); + sb.append(" keys:").append(keys.get(i)); + sb.append(" value:").append(Utils.toPrettyString(values.get(i))); + } + sb.append("]"); + return sb.toString(); + } } /** * Get an element from the specified position @@ -189,7 +219,7 @@ public sealed interface RocksDBAPICommand { record Get(Arena arena, long transactionOrUpdateId, long columnId, - @NotNull MemorySegment @NotNull [] keys, + Keys keys, RequestGet requestType) implements RocksDBAPICommand { @Override @@ -202,6 +232,17 @@ public sealed interface RocksDBAPICommand { return api.getAsync(arena, transactionOrUpdateId, columnId, keys, requestType); } + @Override + public String toString() { + var sb = new StringBuilder("GET"); + if (transactionOrUpdateId != 0) { + sb.append(" tx:").append(transactionOrUpdateId); + } + sb.append(" column:").append(columnId); + sb.append(" keys:").append(keys); + sb.append(" expected:").append(requestType.getRequestTypeId()); + return sb.toString(); + } } /** * Open an iterator @@ -217,8 +258,8 @@ public sealed interface RocksDBAPICommand { record OpenIterator(Arena arena, long transactionId, long columnId, - @NotNull MemorySegment @NotNull [] startKeysInclusive, - @NotNull MemorySegment @Nullable [] endKeysExclusive, + Keys startKeysInclusive, + @Nullable Keys endKeysExclusive, boolean reverse, long timeoutMs) implements RocksDBAPICommand { @@ -264,7 +305,7 @@ public sealed interface RocksDBAPICommand { * @param iterationId iteration id * @param keys keys, inclusive. [] means "the beginning" */ - record SeekTo(Arena arena, long iterationId, @NotNull MemorySegment @NotNull [] keys) implements + record SeekTo(Arena arena, long iterationId, Keys keys) implements RocksDBAPICommand { @Override diff --git a/src/main/java/it/cavallium/rockserver/core/common/RocksDBAsyncAPI.java b/src/main/java/it/cavallium/rockserver/core/common/RocksDBAsyncAPI.java index c60a84f..72baae9 100644 --- a/src/main/java/it/cavallium/rockserver/core/common/RocksDBAsyncAPI.java +++ b/src/main/java/it/cavallium/rockserver/core/common/RocksDBAsyncAPI.java @@ -18,7 +18,6 @@ import it.cavallium.rockserver.core.common.RocksDBAPICommand.Subsequent; import java.lang.foreign.Arena; import java.lang.foreign.MemorySegment; import java.util.List; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -59,7 +58,7 @@ public interface RocksDBAsyncAPI extends RocksDBAsyncAPIRequestHandler { default CompletionStage putAsync(Arena arena, long transactionOrUpdateId, long columnId, - @NotNull MemorySegment @NotNull [] keys, + @NotNull Keys keys, @NotNull MemorySegment value, RequestPut requestType) throws RocksDBException { return requestAsync(new Put<>(arena, transactionOrUpdateId, columnId, keys, value, requestType)); @@ -69,7 +68,7 @@ public interface RocksDBAsyncAPI extends RocksDBAsyncAPIRequestHandler { default CompletionStage> putMultiAsync(Arena arena, long transactionOrUpdateId, long columnId, - @NotNull List<@NotNull MemorySegment @NotNull []> keys, + @NotNull List<@NotNull Keys> keys, @NotNull List<@NotNull MemorySegment> values, RequestPut requestType) throws RocksDBException { return requestAsync(new PutMulti<>(arena, transactionOrUpdateId, columnId, keys, values, requestType)); @@ -79,7 +78,7 @@ public interface RocksDBAsyncAPI extends RocksDBAsyncAPIRequestHandler { default CompletionStage getAsync(Arena arena, long transactionOrUpdateId, long columnId, - @NotNull MemorySegment @NotNull [] keys, + @NotNull Keys keys, RequestGet requestType) throws RocksDBException { return requestAsync(new Get<>(arena, transactionOrUpdateId, columnId, keys, requestType)); } @@ -88,8 +87,8 @@ public interface RocksDBAsyncAPI extends RocksDBAsyncAPIRequestHandler { default CompletionStage openIteratorAsync(Arena arena, long transactionId, long columnId, - @NotNull MemorySegment @NotNull [] startKeysInclusive, - @NotNull MemorySegment @Nullable [] endKeysExclusive, + @NotNull Keys startKeysInclusive, + @Nullable Keys endKeysExclusive, boolean reverse, long timeoutMs) throws RocksDBException { return requestAsync(new OpenIterator(arena, @@ -108,7 +107,7 @@ public interface RocksDBAsyncAPI extends RocksDBAsyncAPIRequestHandler { } /** See: {@link SeekTo}. */ - default CompletionStage seekToAsync(Arena arena, long iterationId, @NotNull MemorySegment @NotNull [] keys) throws RocksDBException { + default CompletionStage seekToAsync(Arena arena, long iterationId, @NotNull Keys keys) throws RocksDBException { return requestAsync(new SeekTo(arena, iterationId, keys)); } diff --git a/src/main/java/it/cavallium/rockserver/core/common/RocksDBSyncAPI.java b/src/main/java/it/cavallium/rockserver/core/common/RocksDBSyncAPI.java index ec26f4e..c0d1a41 100644 --- a/src/main/java/it/cavallium/rockserver/core/common/RocksDBSyncAPI.java +++ b/src/main/java/it/cavallium/rockserver/core/common/RocksDBSyncAPI.java @@ -57,7 +57,7 @@ public interface RocksDBSyncAPI extends RocksDBSyncAPIRequestHandler { default T put(Arena arena, long transactionOrUpdateId, long columnId, - @NotNull MemorySegment @NotNull [] keys, + Keys keys, @NotNull MemorySegment value, RequestPut requestType) throws RocksDBException { return requestSync(new Put<>(arena, transactionOrUpdateId, columnId, keys, value, requestType)); @@ -67,7 +67,7 @@ public interface RocksDBSyncAPI extends RocksDBSyncAPIRequestHandler { default List putMulti(Arena arena, long transactionOrUpdateId, long columnId, - @NotNull List<@NotNull MemorySegment @NotNull []> keys, + @NotNull List keys, @NotNull List<@NotNull MemorySegment> values, RequestPut requestType) throws RocksDBException { return requestSync(new PutMulti<>(arena, transactionOrUpdateId, columnId, keys, values, requestType)); @@ -77,7 +77,7 @@ public interface RocksDBSyncAPI extends RocksDBSyncAPIRequestHandler { default T get(Arena arena, long transactionOrUpdateId, long columnId, - @NotNull MemorySegment @NotNull [] keys, + Keys keys, RequestGet requestType) throws RocksDBException { return requestSync(new Get<>(arena, transactionOrUpdateId, columnId, keys, requestType)); } @@ -86,8 +86,8 @@ public interface RocksDBSyncAPI extends RocksDBSyncAPIRequestHandler { default long openIterator(Arena arena, long transactionId, long columnId, - @NotNull MemorySegment @NotNull [] startKeysInclusive, - @NotNull MemorySegment @Nullable [] endKeysExclusive, + Keys startKeysInclusive, + @Nullable Keys endKeysExclusive, boolean reverse, long timeoutMs) throws RocksDBException { return requestSync(new OpenIterator(arena, transactionId, columnId, startKeysInclusive, endKeysExclusive, reverse, timeoutMs)); @@ -99,7 +99,7 @@ public interface RocksDBSyncAPI extends RocksDBSyncAPIRequestHandler { } /** See: {@link SeekTo}. */ - default void seekTo(Arena arena, long iterationId, @NotNull MemorySegment @NotNull [] keys) throws RocksDBException { + default void seekTo(Arena arena, long iterationId, Keys keys) throws RocksDBException { requestSync(new SeekTo(arena, iterationId, keys)); } diff --git a/src/main/java/it/cavallium/rockserver/core/common/Utils.java b/src/main/java/it/cavallium/rockserver/core/common/Utils.java index ed05da9..1de1399 100644 --- a/src/main/java/it/cavallium/rockserver/core/common/Utils.java +++ b/src/main/java/it/cavallium/rockserver/core/common/Utils.java @@ -15,6 +15,7 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; +import java.util.HexFormat; import java.util.List; import java.util.function.Function; import java.util.stream.Stream; @@ -160,4 +161,9 @@ public class Utils { return port; } } + + public static String toPrettyString(MemorySegment s) { + var b = s.toArray(BIG_ENDIAN_BYTES); + return HexFormat.of().formatHex(b); + } } diff --git a/src/main/java/it/cavallium/rockserver/core/impl/EmbeddedDB.java b/src/main/java/it/cavallium/rockserver/core/impl/EmbeddedDB.java index d5ad765..8c2a00c 100644 --- a/src/main/java/it/cavallium/rockserver/core/impl/EmbeddedDB.java +++ b/src/main/java/it/cavallium/rockserver/core/impl/EmbeddedDB.java @@ -6,9 +6,9 @@ import static org.rocksdb.KeyMayExist.KeyMayExistEnum.kExistsWithValue; import static org.rocksdb.KeyMayExist.KeyMayExistEnum.kExistsWithoutValue; import it.cavallium.rockserver.core.common.ColumnHashType; +import it.cavallium.rockserver.core.common.Keys; import it.cavallium.rockserver.core.common.RequestType; import it.cavallium.rockserver.core.common.RequestType.RequestGet; -import it.cavallium.rockserver.core.common.RequestType.RequestNothing; import it.cavallium.rockserver.core.common.RequestType.RequestPut; import it.cavallium.rockserver.core.common.ColumnSchema; import it.cavallium.rockserver.core.common.Delta; @@ -392,7 +392,7 @@ public class EmbeddedDB implements RocksDBSyncAPI, Closeable { public T put(Arena arena, long transactionOrUpdateId, long columnId, - @NotNull MemorySegment @NotNull [] keys, + @NotNull Keys keys, @NotNull MemorySegment value, RequestPut requestType) throws it.cavallium.rockserver.core.common.RocksDBException { ops.beginOp(); @@ -420,7 +420,7 @@ public class EmbeddedDB implements RocksDBSyncAPI, Closeable { public List putMulti(Arena arena, long transactionOrUpdateId, long columnId, - @NotNull List<@NotNull MemorySegment @NotNull []> keys, + @NotNull List keys, @NotNull List<@NotNull MemorySegment> values, RequestPut requestType) throws it.cavallium.rockserver.core.common.RocksDBException { if (keys.size() != values.size()) { @@ -480,7 +480,7 @@ public class EmbeddedDB implements RocksDBSyncAPI, Closeable { @Nullable Tx optionalTxOrUpdate, ColumnInstance col, long updateId, - @NotNull MemorySegment @NotNull[] keys, + @NotNull Keys keys, @NotNull MemorySegment value, RequestPut callback) throws it.cavallium.rockserver.core.common.RocksDBException { // Check for null value @@ -501,14 +501,14 @@ public class EmbeddedDB implements RocksDBSyncAPI, Closeable { } return wrapWithTransactionIfNeeded(optionalTxOrUpdate, needsTx, tx -> { MemorySegment previousValue; - MemorySegment calculatedKey = col.calculateKey(arena, keys); + MemorySegment calculatedKey = col.calculateKey(arena, keys.keys()); if (updateId != 0L) { assert tx != null; tx.val().setSavePoint(); } if (col.hasBuckets()) { assert tx != null; - var bucketElementKeys = col.getBucketElementKeys(keys); + var bucketElementKeys = col.getBucketElementKeys(keys.keys()); try (var readOptions = new ReadOptions()) { var previousRawBucketByteArray = tx.val().getForUpdate(readOptions, col.cfh(), calculatedKey.toArray(BIG_ENDIAN_BYTES), true); MemorySegment previousRawBucket = toMemorySegment(arena, previousRawBucketByteArray); @@ -589,7 +589,7 @@ public class EmbeddedDB implements RocksDBSyncAPI, Closeable { public T get(Arena arena, long transactionOrUpdateId, long columnId, - MemorySegment @NotNull [] keys, + Keys keys, RequestGet requestType) throws it.cavallium.rockserver.core.common.RocksDBException { // Column id var col = getColumn(columnId); @@ -620,7 +620,7 @@ public class EmbeddedDB implements RocksDBSyncAPI, Closeable { Tx tx, long updateId, ColumnInstance col, - MemorySegment @NotNull [] keys, + Keys keys, RequestGet callback) throws it.cavallium.rockserver.core.common.RocksDBException { ops.beginOp(); try { @@ -631,9 +631,9 @@ public class EmbeddedDB implements RocksDBSyncAPI, Closeable { MemorySegment foundValue; boolean existsValue; - MemorySegment calculatedKey = col.calculateKey(arena, keys); + MemorySegment calculatedKey = col.calculateKey(arena, keys.keys()); if (col.hasBuckets()) { - var bucketElementKeys = col.getBucketElementKeys(keys); + var bucketElementKeys = col.getBucketElementKeys(keys.keys()); try (var readOptions = new ReadOptions()) { MemorySegment previousRawBucket = dbGet(tx, col, arena, readOptions, calculatedKey); if (previousRawBucket != null) { @@ -689,8 +689,8 @@ public class EmbeddedDB implements RocksDBSyncAPI, Closeable { public long openIterator(Arena arena, long transactionId, long columnId, - MemorySegment @NotNull [] startKeysInclusive, - @Nullable MemorySegment[] endKeysExclusive, + Keys startKeysInclusive, + @Nullable Keys endKeysExclusive, boolean reverse, long timeoutMs) throws it.cavallium.rockserver.core.common.RocksDBException { // Open an operation that ends when the iterator is closed @@ -725,7 +725,7 @@ public class EmbeddedDB implements RocksDBSyncAPI, Closeable { } @Override - public void seekTo(Arena arena, long iterationId, @NotNull MemorySegment @NotNull [] keys) + public void seekTo(Arena arena, long iterationId, @NotNull Keys keys) throws it.cavallium.rockserver.core.common.RocksDBException { ops.beginOp(); try { diff --git a/src/main/java/it/cavallium/rockserver/core/server/Server.java b/src/main/java/it/cavallium/rockserver/core/server/Server.java index ec23579..c4fc7d6 100644 --- a/src/main/java/it/cavallium/rockserver/core/server/Server.java +++ b/src/main/java/it/cavallium/rockserver/core/server/Server.java @@ -1,5 +1,6 @@ package it.cavallium.rockserver.core.server; +import it.cavallium.rockserver.core.client.LoggingClient; import it.cavallium.rockserver.core.client.RocksDBConnection; import java.io.Closeable; import java.io.IOException; @@ -9,7 +10,11 @@ public class Server implements Closeable { private final RocksDBConnection client; public Server(RocksDBConnection client) { - this.client = client; + this.client = new LoggingClient(client); + } + + public RocksDBConnection getClient() { + return client; } @Override diff --git a/src/main/java/it/cavallium/rockserver/core/server/ThriftServer.java b/src/main/java/it/cavallium/rockserver/core/server/ThriftServer.java index 92067bb..a1af7b6 100644 --- a/src/main/java/it/cavallium/rockserver/core/server/ThriftServer.java +++ b/src/main/java/it/cavallium/rockserver/core/server/ThriftServer.java @@ -1,6 +1,7 @@ package it.cavallium.rockserver.core.server; import it.cavallium.rockserver.core.client.RocksDBConnection; +import it.cavallium.rockserver.core.common.Keys; import it.cavallium.rockserver.core.common.RequestType; import it.cavallium.rockserver.core.common.UpdateContext; import it.cavallium.rockserver.core.common.api.ColumnHashType; @@ -32,7 +33,7 @@ public class ThriftServer extends Server { public ThriftServer(RocksDBConnection client, String http2Host, int http2Port) throws IOException { super(client); - var handler = new ThriftHandler(client); + var handler = new ThriftHandler(this.getClient()); try { var serverTransport = new TNonblockingServerSocket(new InetSocketAddress(http2Host, http2Port)); @@ -46,11 +47,11 @@ public class ThriftServer extends Server { } } - private static @NotNull List<@NotNull MemorySegment[]> keysToRecords(Arena arena, @NotNull List<@NotNull List< @NotNull ByteBuffer>> keysMulti) { + private static @NotNull List<@NotNull Keys> keysToRecords(Arena arena, @NotNull List<@NotNull List< @NotNull ByteBuffer>> keysMulti) { return keysMulti.stream().map(keys -> keysToRecord(arena, keys)).toList(); } - private static MemorySegment[] keysToRecord(Arena arena, List<@NotNull ByteBuffer> keys) { + private static Keys keysToRecord(Arena arena, List<@NotNull ByteBuffer> keys) { if (keys == null) { return null; } @@ -60,7 +61,7 @@ public class ThriftServer extends Server { result[i] = keyToRecord(arena, key); i++; } - return result; + return new Keys(result); } private static @NotNull List<@NotNull MemorySegment> keyToRecords(Arena arena, @NotNull List<@NotNull ByteBuffer> keyMulti) { diff --git a/src/test/java/it/cavallium/rockserver/core/impl/test/EmbeddedDBFixedWithValueTest.java b/src/test/java/it/cavallium/rockserver/core/impl/test/EmbeddedDBFixedWithValueTest.java index e6ab89b..2b05476 100644 --- a/src/test/java/it/cavallium/rockserver/core/impl/test/EmbeddedDBFixedWithValueTest.java +++ b/src/test/java/it/cavallium/rockserver/core/impl/test/EmbeddedDBFixedWithValueTest.java @@ -3,54 +3,55 @@ package it.cavallium.rockserver.core.impl.test; import static it.cavallium.rockserver.core.common.Utils.toMemorySegmentSimple; import it.cavallium.rockserver.core.common.ColumnHashType; +import it.cavallium.rockserver.core.common.Keys; import it.unimi.dsi.fastutil.objects.ObjectList; import java.lang.foreign.MemorySegment; public class EmbeddedDBFixedWithValueTest extends EmbeddedDBTest { @Override - protected MemorySegment[] getKeyI(int i) { - return new MemorySegment[] { + protected Keys getKeyI(int i) { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 3), toMemorySegmentSimple(arena, 4, 7), toMemorySegmentSimple(arena, i) - }; + }); } @Override - protected MemorySegment[] getNotFoundKeyI(int i) { - return new MemorySegment[] { + protected Keys getNotFoundKeyI(int i) { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 3), toMemorySegmentSimple(arena, 5, 6), toMemorySegmentSimple(arena, i) - }; + }); } @Override - protected MemorySegment[] getKey1() { - return new MemorySegment[] { + protected Keys getKey1() { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 3), toMemorySegmentSimple(arena, 4, 6), toMemorySegmentSimple(arena, 3) - }; + }); } @Override - protected MemorySegment[] getKey2() { - return new MemorySegment[] { + protected Keys getKey2() { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 3), toMemorySegmentSimple(arena, 4, 6), toMemorySegmentSimple(arena, 4) - }; + }); } @Override - protected MemorySegment[] getCollidingKey1() { - return new MemorySegment[] { + protected Keys getCollidingKey1() { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 3), toMemorySegmentSimple(arena, 4, 6), toMemorySegmentSimple(arena, 5) - }; + }); } @Override diff --git a/src/test/java/it/cavallium/rockserver/core/impl/test/EmbeddedDBFixedWithoutValueTest.java b/src/test/java/it/cavallium/rockserver/core/impl/test/EmbeddedDBFixedWithoutValueTest.java index f36c195..b8103f0 100644 --- a/src/test/java/it/cavallium/rockserver/core/impl/test/EmbeddedDBFixedWithoutValueTest.java +++ b/src/test/java/it/cavallium/rockserver/core/impl/test/EmbeddedDBFixedWithoutValueTest.java @@ -3,6 +3,7 @@ package it.cavallium.rockserver.core.impl.test; import static it.cavallium.rockserver.core.common.Utils.toMemorySegmentSimple; import it.cavallium.rockserver.core.common.ColumnHashType; +import it.cavallium.rockserver.core.common.Keys; import it.unimi.dsi.fastutil.objects.ObjectList; import java.lang.foreign.MemorySegment; @@ -14,48 +15,48 @@ public class EmbeddedDBFixedWithoutValueTest extends EmbeddedDBTest { } @Override - protected MemorySegment[] getKeyI(int i) { - return new MemorySegment[] { + protected Keys getKeyI(int i) { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 3), toMemorySegmentSimple(arena, 4, 7), toMemorySegmentSimple(arena, i) - }; + }); } @Override - protected MemorySegment[] getNotFoundKeyI(int i) { - return new MemorySegment[] { + protected Keys getNotFoundKeyI(int i) { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 3), toMemorySegmentSimple(arena, 5, 6), toMemorySegmentSimple(arena, i) - }; + }); } @Override - protected MemorySegment[] getKey1() { - return new MemorySegment[] { + protected Keys getKey1() { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 3), toMemorySegmentSimple(arena, 4, 6), toMemorySegmentSimple(arena, 3) - }; + }); } @Override - protected MemorySegment[] getKey2() { - return new MemorySegment[] { + protected Keys getKey2() { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 3), toMemorySegmentSimple(arena, 4, 6), toMemorySegmentSimple(arena, 4) - }; + }); } @Override - protected MemorySegment[] getCollidingKey1() { - return new MemorySegment[] { + protected Keys getCollidingKey1() { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 3), toMemorySegmentSimple(arena, 4, 6), toMemorySegmentSimple(arena, 5) - }; + }); } @Override diff --git a/src/test/java/it/cavallium/rockserver/core/impl/test/EmbeddedDBTest.java b/src/test/java/it/cavallium/rockserver/core/impl/test/EmbeddedDBTest.java index e99684d..218b17c 100644 --- a/src/test/java/it/cavallium/rockserver/core/impl/test/EmbeddedDBTest.java +++ b/src/test/java/it/cavallium/rockserver/core/impl/test/EmbeddedDBTest.java @@ -3,6 +3,7 @@ package it.cavallium.rockserver.core.impl.test; import static it.cavallium.rockserver.core.common.Utils.toMemorySegmentSimple; import it.cavallium.rockserver.core.client.EmbeddedConnection; +import it.cavallium.rockserver.core.common.Keys; import it.cavallium.rockserver.core.common.RequestType; import it.cavallium.rockserver.core.common.ColumnHashType; import it.cavallium.rockserver.core.common.ColumnSchema; @@ -26,9 +27,9 @@ abstract class EmbeddedDBTest { protected long colId = 0L; protected Arena arena; protected MemorySegment bigValue; - protected MemorySegment[] key1; - protected MemorySegment[] collidingKey1; - protected MemorySegment[] key2; + protected Keys key1; + protected Keys collidingKey1; + protected Keys key2; protected MemorySegment value1; protected MemorySegment value2; @@ -56,34 +57,34 @@ abstract class EmbeddedDBTest { return Utils.toMemorySegment(arena, bigValueArray); } - protected MemorySegment[] getKey2() { - return new MemorySegment[] { + protected Keys getKey2() { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 3), toMemorySegmentSimple(arena, 4, 6), toMemorySegmentSimple(arena, 3), toMemorySegmentSimple(arena, 1, 2, 3), toMemorySegmentSimple(arena, 6, 7, 7) - }; + }); } - protected MemorySegment[] getCollidingKey1() { - return new MemorySegment[] { + protected Keys getCollidingKey1() { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 3), toMemorySegmentSimple(arena, 4, 6), toMemorySegmentSimple(arena, 3), toMemorySegmentSimple(arena, 1, 2, 3), toMemorySegmentSimple(arena, 6, 7, -48) - }; + }); } - protected MemorySegment[] getKey1() { - return new MemorySegment[] { + protected Keys getKey1() { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 3), toMemorySegmentSimple(arena, 4, 6), toMemorySegmentSimple(arena, 3), toMemorySegmentSimple(arena, 1, 2, 3), toMemorySegmentSimple(arena, 6, 7, 8) - }; + }); } protected boolean getHasValues() { @@ -120,24 +121,24 @@ abstract class EmbeddedDBTest { } } - protected MemorySegment[] getKeyI(int i) { - return new MemorySegment[] { + protected Keys getKeyI(int i) { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 3), toMemorySegmentSimple(arena, 4, 6), toMemorySegmentSimple(arena, 3), toMemorySegmentSimple(arena, 1, 2, 3), toMemorySegmentSimple(arena, 8, 2, 5, 1, 7, i) - }; + }); } - protected MemorySegment[] getNotFoundKeyI(int i) { - return new MemorySegment[] { + protected Keys getNotFoundKeyI(int i) { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 3), toMemorySegmentSimple(arena, 4, 6), toMemorySegmentSimple(arena, 3), toMemorySegmentSimple(arena, 1, 2, 3), toMemorySegmentSimple(arena, 8, 2, 5, 1, 0, i) - }; + }); } protected MemorySegment getValueI(int i) { diff --git a/src/test/java/it/cavallium/rockserver/core/impl/test/EmbeddedDBVarKeysWithValueTest.java b/src/test/java/it/cavallium/rockserver/core/impl/test/EmbeddedDBVarKeysWithValueTest.java index 16b8e61..1ebbac4 100644 --- a/src/test/java/it/cavallium/rockserver/core/impl/test/EmbeddedDBVarKeysWithValueTest.java +++ b/src/test/java/it/cavallium/rockserver/core/impl/test/EmbeddedDBVarKeysWithValueTest.java @@ -2,44 +2,45 @@ package it.cavallium.rockserver.core.impl.test; import static it.cavallium.rockserver.core.common.Utils.toMemorySegmentSimple; +import it.cavallium.rockserver.core.common.Keys; import it.unimi.dsi.fastutil.ints.IntList; import java.lang.foreign.MemorySegment; public class EmbeddedDBVarKeysWithValueTest extends EmbeddedDBTest { - protected MemorySegment[] getKeyI(int i) { - return new MemorySegment[] { + protected Keys getKeyI(int i) { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 1, 2, 3), toMemorySegmentSimple(arena, 8, 2, 5, 1, 7, i) - }; + }); } - protected MemorySegment[] getNotFoundKeyI(int i) { - return new MemorySegment[] { + protected Keys getNotFoundKeyI(int i) { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 1, 2, 3), toMemorySegmentSimple(arena, 8, 2, 5, 1, 0, i) - }; + }); } - protected MemorySegment[] getKey2() { - return new MemorySegment[] { + protected Keys getKey2() { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 1, 2, 3), toMemorySegmentSimple(arena, 6, 7, 7) - }; + }); } - protected MemorySegment[] getCollidingKey1() { - return new MemorySegment[] { + protected Keys getCollidingKey1() { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 1, 2, 3), toMemorySegmentSimple(arena, 6, 7, -48) - }; + }); } - protected MemorySegment[] getKey1() { - return new MemorySegment[] { + protected Keys getKey1() { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 1, 2, 3), toMemorySegmentSimple(arena, 6, 7, 8) - }; + }); } @Override diff --git a/src/test/java/it/cavallium/rockserver/core/impl/test/EmbeddedDBVarKeysWithoutValueTest.java b/src/test/java/it/cavallium/rockserver/core/impl/test/EmbeddedDBVarKeysWithoutValueTest.java index fc250d0..45cd978 100644 --- a/src/test/java/it/cavallium/rockserver/core/impl/test/EmbeddedDBVarKeysWithoutValueTest.java +++ b/src/test/java/it/cavallium/rockserver/core/impl/test/EmbeddedDBVarKeysWithoutValueTest.java @@ -2,44 +2,45 @@ package it.cavallium.rockserver.core.impl.test; import static it.cavallium.rockserver.core.common.Utils.toMemorySegmentSimple; +import it.cavallium.rockserver.core.common.Keys; import it.unimi.dsi.fastutil.ints.IntList; import java.lang.foreign.MemorySegment; public class EmbeddedDBVarKeysWithoutValueTest extends EmbeddedDBTest { - protected MemorySegment[] getKeyI(int i) { - return new MemorySegment[] { + protected Keys getKeyI(int i) { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 1, 2, 3), toMemorySegmentSimple(arena, 8, 2, 5, 1, 7, i) - }; + }); } - protected MemorySegment[] getNotFoundKeyI(int i) { - return new MemorySegment[] { + protected Keys getNotFoundKeyI(int i) { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 1, 2, 3), toMemorySegmentSimple(arena, 8, 2, 5, 1, 0, i) - }; + }); } - protected MemorySegment[] getKey2() { - return new MemorySegment[] { + protected Keys getKey2() { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 1, 2, 3), toMemorySegmentSimple(arena, 6, 7, 7) - }; + }); } - protected MemorySegment[] getCollidingKey1() { - return new MemorySegment[] { + protected Keys getCollidingKey1() { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 1, 2, 3), toMemorySegmentSimple(arena, 6, 7, -48) - }; + }); } - protected MemorySegment[] getKey1() { - return new MemorySegment[] { + protected Keys getKey1() { + return new Keys(new MemorySegment[] { toMemorySegmentSimple(arena, 1, 2, 3), toMemorySegmentSimple(arena, 6, 7, 8) - }; + }); } @Override