From cce49a50ee526fba98d0a9dd73de544213c5984c Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Mon, 17 Apr 2023 23:31:16 +0200 Subject: [PATCH] Optimize serializer --- pom.xml | 12 ++++++- .../cavallium/dbengine/database/LLUtils.java | 35 +++++++++++++++++-- .../disk/OptimisticRocksDBColumn.java | 12 ++++--- .../disk/PessimisticRocksDBColumn.java | 12 +++---- .../database/disk/StandardRocksDBColumn.java | 14 ++++---- 5 files changed, 63 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index 0d67e45..59bedcf 100644 --- a/pom.xml +++ b/pom.xml @@ -346,7 +346,7 @@ io.soabase.record-builder - record-builder-processor + record-builder-core 36 provided @@ -386,6 +386,16 @@ 3.8.1 17 + + + io.soabase.record-builder + record-builder-processor + 33 + + + + io.soabase.recordbuilder.processor.RecordBuilderProcessor + diff --git a/src/main/java/it/cavallium/dbengine/database/LLUtils.java b/src/main/java/it/cavallium/dbengine/database/LLUtils.java index b745f6a..b05743c 100644 --- a/src/main/java/it/cavallium/dbengine/database/LLUtils.java +++ b/src/main/java/it/cavallium/dbengine/database/LLUtils.java @@ -18,6 +18,7 @@ import java.lang.invoke.MethodType; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Collection; +import java.util.HexFormat; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -90,6 +91,7 @@ public class LLUtils { private static final Consumer NULL_CONSUMER = ignored -> {}; private static final Buf BUF_TRUE = Buf.wrap(new byte[] {(byte) 1}); private static final Buf BUF_FALSE = Buf.wrap(new byte[] {(byte) 0}); + private static final HexFormat HEX_FORMAT = HexFormat.of().withUpperCase(); static { for (int i1 = 0; i1 < 256; i1++) { @@ -302,6 +304,14 @@ public class LLUtils { } } + public static String toStringSafe(@Nullable Buf key, int iLimit) { + if (key != null) { + return toString(key, iLimit); + } else { + return "(released)"; + } + } + public static String toStringSafe(@Nullable LLRange range) { if (range != null) { return toString(range); @@ -334,15 +344,26 @@ public class LLUtils { } } + public static String toString(@Nullable Buf key, int iLimit) { + if (key != null) { + return toString(key.asArray(), iLimit); + } else { + return "null"; + } + } + public static String toString(byte @Nullable[] key) { + return toString(key, 1024); + } + + public static String toString(byte @Nullable[] key, int iLimit) { if (key == null) { return "null"; } else { int startIndex = 0; int iMax = key.length - 1; - int iLimit = 128; if (iMax <= -1) { - return "[]"; + return "\"\""; } else { StringBuilder arraySB = new StringBuilder(); StringBuilder asciiSB = new StringBuilder(); @@ -370,7 +391,11 @@ public class LLUtils { if (isAscii) { return asciiSB.insert(0, "\"").append("\"").toString(); } else { - return arraySB.append(']').toString(); + if (i >= iLimit) { + return arraySB.append(']').toString(); + } else { + return HEX_FORMAT.formatHex(key); + } } } @@ -381,6 +406,10 @@ public class LLUtils { } } + public static byte[] parseHex(String hex) { + return HEX_FORMAT.parseHex(hex); + } + public static boolean equals(Buf a, Buf b) { if (a == null && b == null) { return true; diff --git a/src/main/java/it/cavallium/dbengine/database/disk/OptimisticRocksDBColumn.java b/src/main/java/it/cavallium/dbengine/database/disk/OptimisticRocksDBColumn.java index ad22f95..6e20127 100644 --- a/src/main/java/it/cavallium/dbengine/database/disk/OptimisticRocksDBColumn.java +++ b/src/main/java/it/cavallium/dbengine/database/disk/OptimisticRocksDBColumn.java @@ -109,13 +109,14 @@ public final class OptimisticRocksDBColumn extends AbstractRocksDBColumn long initNanoTime = System.nanoTime(); try { @Nullable Buf prevData = this.get(readOptions, key); + @Nullable Buf newData; if (logger.isTraceEnabled()) { logger.trace(MARKER_ROCKSDB, "Reading {}: {} (before update)", @@ -57,15 +58,14 @@ public final class StandardRocksDBColumn extends AbstractRocksDBColumn ); } - Buf prevDataToSendToUpdater; if (prevData != null) { - prevDataToSendToUpdater = prevData.copy(); - } else { - prevDataToSendToUpdater = null; + prevData.freeze(); + } + try { + newData = updater.apply(prevData); + } catch (Exception ex) { + throw new DBException("Failed to update key " + LLUtils.toStringSafe(key) + ". The previous value was:\n" + LLUtils.toStringSafe(prevData, 8192), ex); } - - @Nullable Buf newData; - newData = updater.apply(prevDataToSendToUpdater); boolean changed; if (logger.isTraceEnabled()) { logger.trace(MARKER_ROCKSDB,