1818
1919import com .fasterxml .jackson .core .JsonProcessingException ;
2020import com .fasterxml .jackson .databind .ObjectMapper ;
21+ import com .fasterxml .jackson .databind .ObjectReader ;
22+ import com .fasterxml .jackson .databind .ObjectWriter ;
2123import com .google .common .collect .ImmutableMap ;
2224import com .palantir .atlasdb .internalschema .InternalSchemaMetadata ;
2325import com .palantir .conjure .java .serialization .ObjectMappers ;
2426import com .palantir .logsafe .SafeArg ;
2527import com .palantir .logsafe .exceptions .SafeIllegalStateException ;
28+ import java .io .ByteArrayInputStream ;
2629import java .io .IOException ;
30+ import java .io .StringReader ;
31+ import java .nio .charset .StandardCharsets ;
2732import java .util .Optional ;
2833import java .util .function .Function ;
2934
@@ -43,6 +48,8 @@ public final class InternalSchemaMetadataPayloadCodec {
4348 ImmutableMap .of (LATEST_VERSION , InternalSchemaMetadataPayloadCodec ::decodeViaJson );
4449
4550 private static final ObjectMapper OBJECT_MAPPER = ObjectMappers .newServerObjectMapper ();
51+ private static final ObjectReader SCHEMA_METADATA_READER = OBJECT_MAPPER .readerFor (InternalSchemaMetadata .class );
52+ private static final ObjectWriter SCHEMA_METADATA_WRITER = OBJECT_MAPPER .writerFor (InternalSchemaMetadata .class );
4653
4754 private InternalSchemaMetadataPayloadCodec () {
4855 // utility
@@ -85,7 +92,7 @@ static VersionedInternalSchemaMetadata encode(InternalSchemaMetadata internalSch
8592 try {
8693 return ImmutableVersionedInternalSchemaMetadata .builder ()
8794 .version (LATEST_VERSION )
88- .payload (OBJECT_MAPPER .writeValueAsBytes (internalSchemaMetadata ))
95+ .payload (SCHEMA_METADATA_WRITER .writeValueAsBytes (internalSchemaMetadata ))
8996 .build ();
9097 } catch (JsonProcessingException e ) {
9198 throw new RuntimeException (e );
@@ -94,7 +101,15 @@ static VersionedInternalSchemaMetadata encode(InternalSchemaMetadata internalSch
94101
95102 private static InternalSchemaMetadata decodeViaJson (byte [] byteArray ) {
96103 try {
97- return OBJECT_MAPPER .readValue (byteArray , InternalSchemaMetadata .class );
104+ if (byteArray .length <= 8192 ) {
105+ // Optimize to avoid allocation of heap ByteBuffer via InputStreamReader.
106+ // Remove after upgrade to Jackson 2.16.
107+ // see: https://github.com/FasterXML/jackson-core/pull/1081
108+ // and https://github.com/FasterXML/jackson-benchmarks/pull/9
109+ return SCHEMA_METADATA_READER .readValue (
110+ new StringReader (new String (byteArray , StandardCharsets .UTF_8 )));
111+ }
112+ return SCHEMA_METADATA_READER .readValue (new ByteArrayInputStream (byteArray ));
98113 } catch (IOException e ) {
99114 throw new RuntimeException (e );
100115 }
0 commit comments