From 567069a7fd258dd1480fe406a657102c909bf2e8 Mon Sep 17 00:00:00 2001 From: David Schlosnagle Date: Thu, 14 Sep 2023 08:26:08 -0400 Subject: [PATCH] Optimize InternalSchemaMetadataPayloadCodec serDe --- .../InternalSchemaMetadataPayloadCodec.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/atlasdb-impl-shared/src/main/java/com/palantir/atlasdb/internalschema/persistence/InternalSchemaMetadataPayloadCodec.java b/atlasdb-impl-shared/src/main/java/com/palantir/atlasdb/internalschema/persistence/InternalSchemaMetadataPayloadCodec.java index 5818165f3dd..bf4633f121c 100644 --- a/atlasdb-impl-shared/src/main/java/com/palantir/atlasdb/internalschema/persistence/InternalSchemaMetadataPayloadCodec.java +++ b/atlasdb-impl-shared/src/main/java/com/palantir/atlasdb/internalschema/persistence/InternalSchemaMetadataPayloadCodec.java @@ -18,12 +18,17 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectReader; +import com.fasterxml.jackson.databind.ObjectWriter; import com.google.common.collect.ImmutableMap; import com.palantir.atlasdb.internalschema.InternalSchemaMetadata; import com.palantir.conjure.java.serialization.ObjectMappers; import com.palantir.logsafe.SafeArg; import com.palantir.logsafe.exceptions.SafeIllegalStateException; +import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.StringReader; +import java.nio.charset.StandardCharsets; import java.util.Optional; import java.util.function.Function; @@ -43,6 +48,8 @@ public final class InternalSchemaMetadataPayloadCodec { ImmutableMap.of(LATEST_VERSION, InternalSchemaMetadataPayloadCodec::decodeViaJson); private static final ObjectMapper OBJECT_MAPPER = ObjectMappers.newServerObjectMapper(); + private static final ObjectReader SCHEMA_METADATA_READER = OBJECT_MAPPER.readerFor(InternalSchemaMetadata.class); + private static final ObjectWriter SCHEMA_METADATA_WRITER = OBJECT_MAPPER.writerFor(InternalSchemaMetadata.class); private InternalSchemaMetadataPayloadCodec() { // utility @@ -85,7 +92,7 @@ static VersionedInternalSchemaMetadata encode(InternalSchemaMetadata internalSch try { return ImmutableVersionedInternalSchemaMetadata.builder() .version(LATEST_VERSION) - .payload(OBJECT_MAPPER.writeValueAsBytes(internalSchemaMetadata)) + .payload(SCHEMA_METADATA_WRITER.writeValueAsBytes(internalSchemaMetadata)) .build(); } catch (JsonProcessingException e) { throw new RuntimeException(e); @@ -94,7 +101,15 @@ static VersionedInternalSchemaMetadata encode(InternalSchemaMetadata internalSch private static InternalSchemaMetadata decodeViaJson(byte[] byteArray) { try { - return OBJECT_MAPPER.readValue(byteArray, InternalSchemaMetadata.class); + if (byteArray.length <= 8192) { + // Optimize to avoid allocation of heap ByteBuffer via InputStreamReader. + // Remove after upgrade to Jackson 2.16. + // see: https://github.com/FasterXML/jackson-core/pull/1081 + // and https://github.com/FasterXML/jackson-benchmarks/pull/9 + return SCHEMA_METADATA_READER.readValue( + new StringReader(new String(byteArray, StandardCharsets.UTF_8))); + } + return SCHEMA_METADATA_READER.readValue(new ByteArrayInputStream(byteArray)); } catch (IOException e) { throw new RuntimeException(e); }