From e2c4ff361ee87b4d0d453e5ce34eb7b0068b527c Mon Sep 17 00:00:00 2001 From: Alexey Kuzin Date: Sun, 24 Sep 2023 15:49:09 +0200 Subject: [PATCH] Optimize instantiation of static result mappers For TarantoolSpace and TarantoolSpaceMetadata classes we have static mappers that should be really instantiated once, as well as the suppliers for them. At the call sites we use references to the methods returning mappers, so they will be optimized further by JVM. --- .../core/metadata/ProxyMetadataProvider.java | 9 +++-- .../core/metadata/SpacesMetadataProvider.java | 40 ++++++++++++++----- .../core/space/ProxyTarantoolTupleSpace.java | 9 ++++- .../core/space/TarantoolTupleSpace.java | 6 ++- 4 files changed, 47 insertions(+), 17 deletions(-) diff --git a/src/main/java/io/tarantool/driver/core/metadata/ProxyMetadataProvider.java b/src/main/java/io/tarantool/driver/core/metadata/ProxyMetadataProvider.java index f3610fe91..c7aa73657 100644 --- a/src/main/java/io/tarantool/driver/core/metadata/ProxyMetadataProvider.java +++ b/src/main/java/io/tarantool/driver/core/metadata/ProxyMetadataProvider.java @@ -22,9 +22,11 @@ public class ProxyMetadataProvider implements TarantoolMetadataProvider { private final String metadataFunctionName; private final TarantoolCallOperations client; + private final CallResultMapper> + metadataMapper; private final Supplier>> - mapperSupplier; + metadataMapperSupplier; /** * Basic constructor @@ -42,14 +44,15 @@ public ProxyMetadataProvider( Class> resultClass) { this.metadataFunctionName = metadataFunctionName; this.client = client; - this.mapperSupplier = () -> client.getResultMapperFactoryFactory() + this.metadataMapper = client.getResultMapperFactoryFactory() .singleValueResultMapperFactory() .withSingleValueResultConverter(metadataConverter, resultClass); + this.metadataMapperSupplier = () -> metadataMapper; } @Override public CompletableFuture getMetadata() { - return client.callForSingleResult(metadataFunctionName, mapperSupplier) + return client.callForSingleResult(metadataFunctionName, metadataMapperSupplier) .exceptionally(ex -> { if (ex.getCause() != null && ex.getCause() instanceof TarantoolClientException) { throw new TarantoolMetadataRequestException(metadataFunctionName, ex); diff --git a/src/main/java/io/tarantool/driver/core/metadata/SpacesMetadataProvider.java b/src/main/java/io/tarantool/driver/core/metadata/SpacesMetadataProvider.java index 444516be5..60134cfe1 100644 --- a/src/main/java/io/tarantool/driver/core/metadata/SpacesMetadataProvider.java +++ b/src/main/java/io/tarantool/driver/core/metadata/SpacesMetadataProvider.java @@ -12,10 +12,9 @@ import io.tarantool.driver.exceptions.TarantoolClientException; import io.tarantool.driver.mappers.CallResultMapper; import io.tarantool.driver.mappers.MessagePackMapper; -import io.tarantool.driver.mappers.converters.ValueConverter; -import org.msgpack.value.ArrayValue; import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; /** * Provides spaces and index metadata via requests to the system spaces in the Tarantool server instance @@ -29,7 +28,23 @@ public class SpacesMetadataProvider implements TarantoolMetadataProvider { private final TarantoolCallOperations client; private final VSpaceToTarantoolSpaceMetadataConverter spaceMetadataMapper; + private final + CallResultMapper, + SingleValueCallResult>> + spaceMetadataResultMapper; + private final + Supplier, + SingleValueCallResult>>> + spaceMetadataResultMapperSupplier; private final TarantoolIndexMetadataConverter indexMetadataMapper; + private final + CallResultMapper, + SingleValueCallResult>> + indexMetadataResultMapper; + private final + Supplier, + SingleValueCallResult>>> + indexMetadataResultMapperSupplier; /** * Basic constructor @@ -42,28 +57,33 @@ public SpacesMetadataProvider( MessagePackMapper messagePackMapper) { this.client = client; this.spaceMetadataMapper = VSpaceToTarantoolSpaceMetadataConverter.getInstance(); + this.spaceMetadataResultMapper = client + .getResultMapperFactoryFactory().singleValueTarantoolResultMapperFactory() + .withSingleValueArrayTarantoolResultConverter(spaceMetadataMapper, TarantoolSpaceMetadataResult.class); + this.spaceMetadataResultMapperSupplier = () -> spaceMetadataResultMapper; this.indexMetadataMapper = new TarantoolIndexMetadataConverter(messagePackMapper); + this.indexMetadataResultMapper = client + .getResultMapperFactoryFactory().singleValueTarantoolResultMapperFactory() + .withSingleValueArrayTarantoolResultConverter(indexMetadataMapper, TarantoolIndexMetadataResult.class); + this.indexMetadataResultMapperSupplier = () -> indexMetadataResultMapper; } @Override public CompletableFuture getMetadata() throws TarantoolClientException { CompletableFuture> spaces = - select(VSPACE_SELECT_CMD, spaceMetadataMapper, TarantoolSpaceMetadataResult.class); + select(VSPACE_SELECT_CMD, spaceMetadataResultMapperSupplier, TarantoolSpaceMetadata.class); CompletableFuture> indexes = - select(VINDEX_SELECT_CMD, indexMetadataMapper, TarantoolIndexMetadataResult.class); + select(VINDEX_SELECT_CMD, indexMetadataResultMapperSupplier, TarantoolIndexMetadata.class); return spaces.thenCombine(indexes, SpacesTarantoolMetadataContainer::new); } private CompletableFuture> select( String selectCmd, - ValueConverter resultConverter, - Class>> resultClass) + Supplier, SingleValueCallResult>>> resultMapperSupplier, + Class resultClass) throws TarantoolClientException { - CallResultMapper, SingleValueCallResult>> resultMapper = - client.getResultMapperFactoryFactory().singleValueTarantoolResultMapperFactory() - .withSingleValueArrayTarantoolResultConverter(resultConverter, resultClass); - return client.call(selectCmd, () -> resultMapper); + return client.call(selectCmd, resultMapperSupplier); } } diff --git a/src/main/java/io/tarantool/driver/core/space/ProxyTarantoolTupleSpace.java b/src/main/java/io/tarantool/driver/core/space/ProxyTarantoolTupleSpace.java index 488489950..aef5f6a52 100644 --- a/src/main/java/io/tarantool/driver/core/space/ProxyTarantoolTupleSpace.java +++ b/src/main/java/io/tarantool/driver/core/space/ProxyTarantoolTupleSpace.java @@ -24,6 +24,9 @@ public class ProxyTarantoolTupleSpace private final TarantoolClientConfig config; private final TarantoolCallOperations client; + private final + CallResultMapper, SingleValueCallResult>> + rowsMetadataTupleResultMapper; /** * Basic constructor @@ -43,6 +46,9 @@ public ProxyTarantoolTupleSpace( super(config, client, mappingConfig, metadataOperations, spaceMetadata); this.config = config; this.client = client; + this.rowsMetadataTupleResultMapper = client + .getResultMapperFactoryFactory().getTarantoolTupleResultMapperFactory() + .withSingleValueRowsMetadataToTarantoolTupleResultMapper(config.getMessagePackMapper(), getMetadata()); } @Override @@ -53,8 +59,7 @@ protected TupleOperations makeOperationsFromTuple(TarantoolTuple tuple) { @Override protected CallResultMapper, SingleValueCallResult>> rowsMetadataTupleResultMapper() { - return client.getResultMapperFactoryFactory().getTarantoolTupleResultMapperFactory() - .withSingleValueRowsMetadataToTarantoolTupleResultMapper(config.getMessagePackMapper(), getMetadata()); + return rowsMetadataTupleResultMapper; } @Override diff --git a/src/main/java/io/tarantool/driver/core/space/TarantoolTupleSpace.java b/src/main/java/io/tarantool/driver/core/space/TarantoolTupleSpace.java index 8c85ed4a1..c3941a071 100644 --- a/src/main/java/io/tarantool/driver/core/space/TarantoolTupleSpace.java +++ b/src/main/java/io/tarantool/driver/core/space/TarantoolTupleSpace.java @@ -23,6 +23,7 @@ public class TarantoolTupleSpace extends private final TarantoolCallOperations client; private final TarantoolClientConfig config; + private final MessagePackValueMapper arrayTupleResultMapper; /** * Basic constructor @@ -42,6 +43,8 @@ public TarantoolTupleSpace( super(config, connectionManager, metadataOperations, spaceMetadata); this.client = client; this.config = config; + this.arrayTupleResultMapper = client.getResultMapperFactoryFactory().getTarantoolTupleResultMapperFactory() + .withArrayValueToTarantoolTupleResultConverter(config.getMessagePackMapper(), getMetadata()); } @Override @@ -51,8 +54,7 @@ protected TupleOperations makeOperationsFromTuple(TarantoolTuple tuple) { @Override protected MessagePackValueMapper arrayTupleResultMapper() { - return client.getResultMapperFactoryFactory().getTarantoolTupleResultMapperFactory() - .withArrayValueToTarantoolTupleResultConverter(config.getMessagePackMapper(), getMetadata()); + return arrayTupleResultMapper; } @Override