From 8312b0b932d4c88943842196ef8b243ca8278cbb Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Wed, 27 Dec 2023 16:38:37 -0800 Subject: [PATCH 01/23] Java: API layer with RedisClient and basic commands (#46) * Add java client connection layer. Signed-off-by: Andrew Carbonetto --------- Signed-off-by: Yury-Fridlyand Signed-off-by: Andrew Carbonetto Co-authored-by: Yury-Fridlyand Co-authored-by: SanHalacogluImproving --- .../src/main/java/glide/api/BaseClient.java | 13 + .../src/main/java/glide/api/RedisClient.java | 214 +++++++++++++++ .../main/java/glide/api/RequestBuilder.java | 63 +++++ .../commands/BaseCommandResponseResolver.java | 57 ++++ .../java/glide/api/commands/BaseCommands.java | 58 +++++ .../main/java/glide/api/commands/Command.java | 33 +++ .../RedisExceptionCheckedFunction.java | 16 ++ .../glide/api/commands/StringCommands.java | 29 +++ .../java/glide/api/commands/Transaction.java | 4 + .../java/glide/api/commands/VoidCommands.java | 55 ++++ .../glide/api/models/commands/SetOptions.java | 130 ++++++++++ .../models/configuration/BackoffStrategy.java | 29 +++ .../BaseClientConfiguration.java | 42 +++ .../api/models/configuration/NodeAddress.java | 16 ++ .../api/models/configuration/ReadFrom.java | 12 + .../RedisClientConfiguration.java | 15 ++ .../RedisClusterClientConfiguration.java | 11 + .../configuration/RedisCredentials.java | 19 ++ .../models/exceptions/ClosingException.java | 19 ++ .../exceptions/ConnectionException.java | 19 ++ .../models/exceptions/ExecAbortException.java | 19 ++ .../api/models/exceptions/RedisException.java | 20 ++ .../models/exceptions/RequestException.java | 19 ++ .../models/exceptions/TimeoutException.java | 19 ++ .../java/glide/managers/CallbackManager.java | 63 +++++ .../src/test/java/glide/api/Awaiter.java | 28 ++ .../test/java/glide/api/RedisClientTest.java | 216 ++++++++++++++++ .../glide/managers/CommandManagerTest.java | 244 ++++++++++++++++++ 28 files changed, 1482 insertions(+) create mode 100644 java/client/src/main/java/glide/api/BaseClient.java create mode 100644 java/client/src/main/java/glide/api/RedisClient.java create mode 100644 java/client/src/main/java/glide/api/RequestBuilder.java create mode 100644 java/client/src/main/java/glide/api/commands/BaseCommandResponseResolver.java create mode 100644 java/client/src/main/java/glide/api/commands/BaseCommands.java create mode 100644 java/client/src/main/java/glide/api/commands/Command.java create mode 100644 java/client/src/main/java/glide/api/commands/RedisExceptionCheckedFunction.java create mode 100644 java/client/src/main/java/glide/api/commands/StringCommands.java create mode 100644 java/client/src/main/java/glide/api/commands/Transaction.java create mode 100644 java/client/src/main/java/glide/api/commands/VoidCommands.java create mode 100644 java/client/src/main/java/glide/api/models/commands/SetOptions.java create mode 100644 java/client/src/main/java/glide/api/models/configuration/BackoffStrategy.java create mode 100644 java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java create mode 100644 java/client/src/main/java/glide/api/models/configuration/NodeAddress.java create mode 100644 java/client/src/main/java/glide/api/models/configuration/ReadFrom.java create mode 100644 java/client/src/main/java/glide/api/models/configuration/RedisClientConfiguration.java create mode 100644 java/client/src/main/java/glide/api/models/configuration/RedisClusterClientConfiguration.java create mode 100644 java/client/src/main/java/glide/api/models/configuration/RedisCredentials.java create mode 100644 java/client/src/main/java/glide/api/models/exceptions/ClosingException.java create mode 100644 java/client/src/main/java/glide/api/models/exceptions/ConnectionException.java create mode 100644 java/client/src/main/java/glide/api/models/exceptions/ExecAbortException.java create mode 100644 java/client/src/main/java/glide/api/models/exceptions/RedisException.java create mode 100644 java/client/src/main/java/glide/api/models/exceptions/RequestException.java create mode 100644 java/client/src/main/java/glide/api/models/exceptions/TimeoutException.java create mode 100644 java/client/src/main/java/glide/managers/CallbackManager.java create mode 100644 java/client/src/test/java/glide/api/Awaiter.java create mode 100644 java/client/src/test/java/glide/api/RedisClientTest.java create mode 100644 java/client/src/test/java/glide/managers/CommandManagerTest.java diff --git a/java/client/src/main/java/glide/api/BaseClient.java b/java/client/src/main/java/glide/api/BaseClient.java new file mode 100644 index 0000000000..07b004ac6a --- /dev/null +++ b/java/client/src/main/java/glide/api/BaseClient.java @@ -0,0 +1,13 @@ +package glide.api; + +import glide.managers.CommandManager; +import glide.managers.ConnectionManager; +import lombok.AllArgsConstructor; + +/** Base Client class for connecting to Redis */ +@AllArgsConstructor +public abstract class BaseClient implements AutoCloseable { + + protected ConnectionManager connectionManager; + protected CommandManager commandManager; +} diff --git a/java/client/src/main/java/glide/api/RedisClient.java b/java/client/src/main/java/glide/api/RedisClient.java new file mode 100644 index 0000000000..2d3ae23897 --- /dev/null +++ b/java/client/src/main/java/glide/api/RedisClient.java @@ -0,0 +1,214 @@ +package glide.api; + +import static glide.ffi.resolvers.SocketListenerResolver.getSocket; + +import glide.api.commands.BaseCommands; +import glide.api.commands.Command; +import glide.api.commands.RedisExceptionCheckedFunction; +import glide.api.commands.StringCommands; +import glide.api.commands.Transaction; +import glide.api.commands.VoidCommands; +import glide.api.models.commands.SetOptions; +import glide.api.models.configuration.NodeAddress; +import glide.api.models.configuration.RedisClientConfiguration; +import glide.api.models.exceptions.RedisException; +import glide.connectors.handlers.CallbackDispatcher; +import glide.connectors.handlers.ChannelHandler; +import glide.managers.CommandManager; +import glide.managers.ConnectionManager; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Function; +import response.ResponseOuterClass.Response; + +/** Factory class for creating Glide/Redis-client connections */ +public class RedisClient extends BaseClient implements BaseCommands, StringCommands, VoidCommands { + + public static CompletableFuture CreateClient() { + RedisClientConfiguration config = + RedisClientConfiguration.builder() + .address(NodeAddress.builder().build()) + .useTLS(false) + .build(); + + return CreateClient(config); + } + + public static CompletableFuture CreateClient(String host, Integer port) { + RedisClientConfiguration config = + RedisClientConfiguration.builder() + .address(NodeAddress.builder().host(host).port(port).build()) + .useTLS(false) + .build(); + + return CreateClient(config); + } + + /** + * Async (non-blocking) connection to Redis. + * + * @param config - Redis Client Configuration + * @return a promise to connect and return a RedisClient + */ + public static CompletableFuture CreateClient(RedisClientConfiguration config) { + + // TODO: send request to connection manager + AtomicBoolean connectionStatus = new AtomicBoolean(false); + + CallbackDispatcher callbackDispatcher = new CallbackDispatcher(); + ChannelHandler channelHandler = new ChannelHandler(callbackDispatcher, getSocket()); + var connectionManager = new ConnectionManager(); + var commandManager = new CommandManager(new CompletableFuture<>()); + // TODO: send request with configuration to connection Manager as part of a follow-up PR + return connectionManager + .connectToRedis( + config.getAddresses().get(0).getHost(), + config.getAddresses().get(0).getPort(), + config.isUseTLS(), + false) + .thenApplyAsync( + b -> { + if (b) { + return new RedisClient(connectionManager, commandManager); + } + throw new RedisException("Unable to connect to Redis"); + }); + } + + protected RedisClient(ConnectionManager connectionManager, CommandManager commandManager) { + super(connectionManager, commandManager); + } + + /** + * Closes this resource, relinquishing any underlying resources. This method is invoked + * automatically on objects managed by the try-with-resources statement. see: AutoCloseable::close() + */ + @Override + public void close() throws ExecutionException { + try { + connectionManager + .closeConnection() + .thenComposeAsync(ignore -> commandManager.closeConnection()) + .thenApplyAsync(ignore -> this) + .get(); + } catch (InterruptedException interruptedException) { + // AutoCloseable functions are strongly advised to avoid throwing InterruptedExceptions + // TODO: marking resources as closed: + // https://github.com/orgs/Bit-Quill/projects/4/views/6?pane=issue&itemId=48063887 + throw new RuntimeException(interruptedException); + } + } + + /** + * Execute a single command against Redis.
+ * + * @param command to be executed + * @param responseHandler handler responsible for assigning type to the response + * @return A CompletableFuture completed with the result from Redis + * @param Response value type + */ + protected CompletableFuture exec( + Command command, RedisExceptionCheckedFunction responseHandler) { + return commandManager.submitNewCommand(command, responseHandler); + } + + /** + * Execute a transaction by processing the queued commands.
+ * See https://redis.io/topics/Transactions/ for details on Redis Transactions.
+ * + * @param transaction with commands to be executed + * @return A CompletableFuture completed with the results from Redis + */ + @Override + public CompletableFuture> exec(Transaction transaction) { + // TODO: call commandManager.submitNewTransaction() + return exec(transaction, BaseCommands::handleTransactionResponse); + } + + /** + * Execute a transaction by processing the queued commands.
+ * See https://redis.io/topics/Transactions/ for details on Redis Transactions.
+ * + * @param transaction with commands to be executed + * @param responseHandler handler responsible for assigning type to the list of response objects + * @return A CompletableFuture completed with the results from Redis + */ + protected CompletableFuture> exec( + Transaction transaction, Function> responseHandler) { + // TODO: call commandManager.submitNewTransaction() + return new CompletableFuture<>(); + } + + /** + * Executes a single custom command, without checking inputs. Every part of the command, including + * subcommands, should be added as a separate value in args. + * + * @param args command and arguments for the custom command call + * @return CompletableFuture with the response + */ + public CompletableFuture customCommand(String[] args) { + Command command = + Command.builder().requestType(Command.RequestType.CUSTOM_COMMAND).arguments(args).build(); + return exec(command, BaseCommands::handleObjectResponse); + } + + /** + * Get the value associated with the given key, or null if no such value exists. See + * https://redis.io/commands/set/ for details. + * + * @param key - The key to retrieve from the database. + * @return If `key` exists, returns the value of `key` as a string. Otherwise, return null + */ + public CompletableFuture get(String key) { + Command command = + Command.builder() + .requestType(Command.RequestType.GET_STRING) + .arguments(new String[] {key}) + .build(); + return exec(command, StringCommands::handleStringResponse); + } + + /** + * Set the given key with the given value. Return value is dependent on the passed options. See + * https://redis.io/commands/set/ for details. + * + * @param key - The key to store. + * @param value - The value to store with the given key. + * @return null + */ + public CompletableFuture set(String key, String value) { + Command command = + Command.builder() + .requestType(Command.RequestType.SET_STRING) + .arguments(new String[] {key, value}) + .build(); + return exec(command, VoidCommands::handleVoidResponse); + } + + /** + * Set the given key with the given value. Return value is dependent on the passed options. See + * https://redis.io/commands/set/ for details. + * + * @param key - The key to store. + * @param value - The value to store with the given key. + * @param options - The Set options + * @return string or null If value isn't set because of `onlyIfExists` or `onlyIfDoesNotExist` + * conditions, return null. If `returnOldValue` is set, return the old value as a string. + */ + public CompletableFuture set(String key, String value, SetOptions options) { + LinkedList args = new LinkedList<>(); + args.add(key); + args.add(value); + args.addAll(SetOptions.createSetOptions(options)); + Command command = + Command.builder() + .requestType(Command.RequestType.SET_STRING) + .arguments(args.toArray(new String[0])) + .build(); + return exec(command, StringCommands::handleStringResponse); + } +} diff --git a/java/client/src/main/java/glide/api/RequestBuilder.java b/java/client/src/main/java/glide/api/RequestBuilder.java new file mode 100644 index 0000000000..385347883a --- /dev/null +++ b/java/client/src/main/java/glide/api/RequestBuilder.java @@ -0,0 +1,63 @@ +package glide.api; + +import connection_request.ConnectionRequestOuterClass.ConnectionRequest; +import connection_request.ConnectionRequestOuterClass.NodeAddress; +import connection_request.ConnectionRequestOuterClass.ReadFrom; +import connection_request.ConnectionRequestOuterClass.TlsMode; +import glide.api.models.configuration.BaseClientConfiguration; +import glide.managers.CallbackManager; +import java.util.List; +import redis_request.RedisRequestOuterClass.Command; +import redis_request.RedisRequestOuterClass.Command.ArgsArray; +import redis_request.RedisRequestOuterClass.RedisRequest; +import redis_request.RedisRequestOuterClass.RequestType; +import redis_request.RedisRequestOuterClass.Routes; +import redis_request.RedisRequestOuterClass.SimpleRoutes; + +public class RequestBuilder { + + /** Build a protobuf connection request.
*/ + public static ConnectionRequest createConnectionRequest( + String host, int port, boolean useSsl, boolean clusterMode) { + // TODO: temporary placeholder until + // https://github.com/orgs/Bit-Quill/projects/4?pane=issue&itemId=48028158 + return ConnectionRequest.newBuilder() + .addAddresses(NodeAddress.newBuilder().setHost(host).setPort(port).build()) + .setTlsMode(useSsl ? TlsMode.SecureTls : TlsMode.NoTls) + .setClusterModeEnabled(clusterMode) + .setReadFrom(ReadFrom.Primary) + .setDatabaseId(0) + .build(); + } + + /** Build a protobuf connection request.
*/ + public static ConnectionRequest createConnectionRequest(BaseClientConfiguration configuration) { + // TODO: temporary placeholder until + // https://github.com/orgs/Bit-Quill/projects/4?pane=issue&itemId=48028158 + return ConnectionRequest.newBuilder().build(); + } + + /** + * Build a protobuf command/transaction request draft. + * + * @return An uncompleted request. {@link CallbackManager} is responsible to complete it by adding + * a callback id. + */ + public static RedisRequest.Builder prepareRequest(RequestType command, List args) { + var commandArgs = ArgsArray.newBuilder(); + for (var arg : args) { + commandArgs.addArgs(arg); + } + + return RedisRequest.newBuilder() + .setSingleCommand( // set command + Command.newBuilder() + .setRequestType(command) // set command name + .setArgsArray(commandArgs.build()) // set arguments + .build()) + .setRoute( // set route + Routes.newBuilder() + .setSimpleRoutes(SimpleRoutes.AllNodes) // set route type + .build()); + } +} diff --git a/java/client/src/main/java/glide/api/commands/BaseCommandResponseResolver.java b/java/client/src/main/java/glide/api/commands/BaseCommandResponseResolver.java new file mode 100644 index 0000000000..5ab7e27d55 --- /dev/null +++ b/java/client/src/main/java/glide/api/commands/BaseCommandResponseResolver.java @@ -0,0 +1,57 @@ +package glide.api.commands; + +import glide.api.models.exceptions.ClosingException; +import glide.api.models.exceptions.ConnectionException; +import glide.api.models.exceptions.ExecAbortException; +import glide.api.models.exceptions.RedisException; +import glide.api.models.exceptions.RequestException; +import glide.api.models.exceptions.TimeoutException; +import lombok.AllArgsConstructor; +import response.ResponseOuterClass; + +/** + * Response resolver responsible for evaluating the Redis response object with a success or failure. + */ +@AllArgsConstructor +public class BaseCommandResponseResolver + implements RedisExceptionCheckedFunction { + + private RedisExceptionCheckedFunction respPointerResolver; + + /** + * Extracts value from the RESP pointer.
+ * Throws errors when the response is unsuccessful. + * + * @return A generic Object with the Response | null if the response is empty + */ + public Object apply(ResponseOuterClass.Response response) throws RedisException { + // TODO: handle object if the object is small + // TODO: handle RESP2 object if configuration is set + if (response.hasRequestError()) { + ResponseOuterClass.RequestError error = response.getRequestError(); + String msg = error.getMessage(); + switch (error.getType()) { + case Unspecified: + throw new RedisException(msg); + case ExecAbort: + throw new ExecAbortException(msg); + case Timeout: + throw new TimeoutException(msg); + case Disconnect: + throw new ConnectionException(msg); + } + throw new RequestException(response.getRequestError().getMessage()); + } + if (response.hasClosingError()) { + throw new ClosingException(response.getClosingError()); + } + if (response.hasRespPointer()) { + return respPointerResolver.apply(response.getRespPointer()); + } + if (response.hasConstantResponse()) { + // TODO: confirm + return "Ok"; + } + return null; + } +} diff --git a/java/client/src/main/java/glide/api/commands/BaseCommands.java b/java/client/src/main/java/glide/api/commands/BaseCommands.java new file mode 100644 index 0000000000..f6dbf2a697 --- /dev/null +++ b/java/client/src/main/java/glide/api/commands/BaseCommands.java @@ -0,0 +1,58 @@ +package glide.api.commands; + +import glide.ffi.resolvers.RedisValueResolver; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import response.ResponseOuterClass.Response; + +/** Base Commands interface to handle generic command and transaction requests. */ +public interface BaseCommands { + + /** + * default Object handler from response + * + * @return BaseCommandResponseResolver to deliver the response + */ + static BaseCommandResponseResolver applyBaseCommandResponseResolver() { + return new BaseCommandResponseResolver(RedisValueResolver::valueFromPointer); + } + + /** + * Extracts the response from the Protobuf response and either throws an exception or returns the + * appropriate response has an Object + * + * @param response Redis protobuf message + * @return Response Object + */ + static Object handleObjectResponse(Response response) { + // return function to convert protobuf.Response into the response object by + // calling valueFromPointer + return BaseCommands.applyBaseCommandResponseResolver().apply(response); + } + + public static List handleTransactionResponse(Response response) { + // return function to convert protobuf.Response into the response object by + // calling valueFromPointer + + List transactionResponse = + (List) BaseCommands.applyBaseCommandResponseResolver().apply(response); + return transactionResponse; + } + + /** + * Execute a @see{Command} by sending command via socket manager + * + * @param args arguments for the custom command + * @return a CompletableFuture with response result from Redis + */ + CompletableFuture customCommand(String[] args); + + /** + * Execute a transaction by processing the queued commands.
+ * See https://redis.io/topics/Transactions/ for details on Redis Transactions.
+ * + * @param transaction with commands to be executed + * @return A CompletableFuture completed with the results from Redis + */ + CompletableFuture> exec(Transaction transaction); +} diff --git a/java/client/src/main/java/glide/api/commands/Command.java b/java/client/src/main/java/glide/api/commands/Command.java new file mode 100644 index 0000000000..eec57c1184 --- /dev/null +++ b/java/client/src/main/java/glide/api/commands/Command.java @@ -0,0 +1,33 @@ +package glide.api.commands; + +import lombok.Builder; +import lombok.EqualsAndHashCode; + +/** Base Command class to send a single request to Redis. */ +@Builder +@EqualsAndHashCode +public class Command { + + /** Redis command request type */ + final RequestType requestType; + + /** List of Arguments for the Redis command request */ + final String[] arguments; + + public enum RequestType { + /** */ + CUSTOM_COMMAND, + /** + * Get the value of key. + * + * @see: command reference + */ + GET_STRING, + /** + * Set key to hold the string value. + * + * @see: command reference + */ + SET_STRING, + } +} diff --git a/java/client/src/main/java/glide/api/commands/RedisExceptionCheckedFunction.java b/java/client/src/main/java/glide/api/commands/RedisExceptionCheckedFunction.java new file mode 100644 index 0000000000..269240b84a --- /dev/null +++ b/java/client/src/main/java/glide/api/commands/RedisExceptionCheckedFunction.java @@ -0,0 +1,16 @@ +package glide.api.commands; + +import glide.api.models.exceptions.RedisException; + +@FunctionalInterface +public interface RedisExceptionCheckedFunction { + + /** + * Functional response handler that throws RedisException on a fail + * + * @param response - Redis Response + * @return T - response payload type + * @throws RedisException + */ + T apply(R response) throws RedisException; +} diff --git a/java/client/src/main/java/glide/api/commands/StringCommands.java b/java/client/src/main/java/glide/api/commands/StringCommands.java new file mode 100644 index 0000000000..829346749b --- /dev/null +++ b/java/client/src/main/java/glide/api/commands/StringCommands.java @@ -0,0 +1,29 @@ +package glide.api.commands; + +import glide.api.models.exceptions.RedisException; +import java.util.concurrent.CompletableFuture; +import response.ResponseOuterClass.Response; + +/** String Commands interface to handle single commands that return Strings. */ +public interface StringCommands { + + /** + * Extracts the response from the Protobuf response and either throws an exception or returns the + * appropriate response has a String + * + * @param response Redis protobuf message + * @return Response as a String + */ + static String handleStringResponse(Response response) { + // return function to convert protobuf.Response into the response object by + // calling valueFromPointer + Object value = BaseCommands.applyBaseCommandResponseResolver().apply(response); + if (value instanceof String) { + return (String) value; + } + throw new RedisException( + "Unexpected return type from Redis: got " + value.getClass() + " expected String"); + } + + CompletableFuture get(String key); +} diff --git a/java/client/src/main/java/glide/api/commands/Transaction.java b/java/client/src/main/java/glide/api/commands/Transaction.java new file mode 100644 index 0000000000..6eead551fa --- /dev/null +++ b/java/client/src/main/java/glide/api/commands/Transaction.java @@ -0,0 +1,4 @@ +package glide.api.commands; + +/** Class for encapsulating multi-request Transactions to Redis. */ +public class Transaction {} diff --git a/java/client/src/main/java/glide/api/commands/VoidCommands.java b/java/client/src/main/java/glide/api/commands/VoidCommands.java new file mode 100644 index 0000000000..12227a3d39 --- /dev/null +++ b/java/client/src/main/java/glide/api/commands/VoidCommands.java @@ -0,0 +1,55 @@ +package glide.api.commands; + +import glide.api.models.exceptions.ClosingException; +import glide.api.models.exceptions.ConnectionException; +import glide.api.models.exceptions.ExecAbortException; +import glide.api.models.exceptions.RedisException; +import glide.api.models.exceptions.RequestException; +import glide.api.models.exceptions.TimeoutException; +import java.util.concurrent.CompletableFuture; +import response.ResponseOuterClass.RequestError; +import response.ResponseOuterClass.Response; + +/** String Commands interface to handle single commands that have no payload. */ +public interface VoidCommands { + + /** + * Check for errors in the Response and return null Throws an error if an unexpected value is + * returned + * + * @return null if the response is empty + */ + static Void handleVoidResponse(Object respObject) { + Response response = (Response) respObject; + if (response.hasRequestError()) { + RequestError error = response.getRequestError(); + String msg = error.getMessage(); + switch (error.getType()) { + case Unspecified: + throw new RedisException("Unexpected result: " + msg); + case ExecAbort: + throw new ExecAbortException("ExecAbortException: " + msg); + case Timeout: + throw new TimeoutException("TimeoutException: " + msg); + case Disconnect: + throw new ConnectionException("Disconnection: " + msg); + } + throw new RequestException(response.getRequestError().getMessage()); + } + if (response.hasClosingError()) { + throw new ClosingException(response.getClosingError()); + } + if (response.hasRespPointer()) { + throw new RuntimeException( + "Unexpected object returned in response - expected constantResponse or null"); + } + if (response.hasConstantResponse()) { + return null; // Void + } + // TODO commented out due to #710: empty response means a successful connection + // https://github.com/aws/babushka/issues/710 + return null; + } + + CompletableFuture set(String key, String value); +} diff --git a/java/client/src/main/java/glide/api/models/commands/SetOptions.java b/java/client/src/main/java/glide/api/models/commands/SetOptions.java new file mode 100644 index 0000000000..8aec51159f --- /dev/null +++ b/java/client/src/main/java/glide/api/models/commands/SetOptions.java @@ -0,0 +1,130 @@ +package glide.api.models.commands; + +import glide.api.models.exceptions.RequestException; +import java.util.LinkedList; +import java.util.List; +import lombok.Builder; +import lombok.NonNull; + +@Builder +@NonNull +public class SetOptions { + + /** + * if `conditional` is not set the value will be set regardless of prior value existence.
+ * If value isn't set because of the condition, return null. + */ + private ConditionalSet conditionalSet; + + /** + * Return the old string stored at key, or null if key did not exist. An error is returned and SET + * aborted if the value stored at key is not a string. Equivalent to `GET` in the Redis API. + */ + private boolean returnOldValue; + + /** If not set, no expiry time will be set for the value. */ + private TimeToLive expiry; + + public enum ConditionalSet { + /** + * Only set the key if it does not already exist.
+ * Equivalent to `NX` in the Redis API. + */ + ONLY_IF_EXISTS, + /** + * Only set the key if it already exists.
+ * Equivalent to `EX` in the Redis API. + */ + ONLY_IF_DOES_NOT_EXIST + } + + @Builder + public static class TimeToLive { + /** Expiry type for the time to live */ + @NonNull private TimeToLiveType type; + + /** + * The amount of time to live before the key expires. Ignored when KEEP_EXISTING type is set. + */ + private Integer count; + } + + public enum TimeToLiveType { + /** + * Retain the time to live associated with the key.
+ * Equivalent to `KEEPTTL` in the Redis API. + */ + KEEP_EXISTING, + /** + * Set the specified expire time, in seconds.
+ * Equivalent to `EX` in the Redis API. + */ + SECONDS, + /** + * Set the specified expire time, in milliseconds.
+ * Equivalent to `PX` in the Redis API. + */ + MILLISECONDS, + /** + * Set the specified Unix time at which the key will expire, in seconds.
+ * Equivalent to `EXAT` in the Redis API. + */ + UNIX_SECONDS, + /** + * Set the specified Unix time at which the key will expire, in milliseconds.
+ * Equivalent to `PXAT` in the Redis API. + */ + UNIX_MILLISECONDS + } + + public static String CONDITIONAL_SET_ONLY_IF_EXISTS = "XX"; + public static String CONDITIONAL_SET_ONLY_IF_DOES_NOT_EXIST = "NX"; + public static String RETURN_OLD_VALUE = "GET"; + public static String TIME_TO_LIVE_KEEP_EXISTING = "KEEPTTL"; + public static String TIME_TO_LIVE_SECONDS = "EX"; + public static String TIME_TO_LIVE_MILLISECONDS = "PX"; + public static String TIME_TO_LIVE_UNIX_SECONDS = "EXAT"; + public static String TIME_TO_LIVE_UNIX_MILLISECONDS = "PXAT"; + + public static List createSetOptions(SetOptions options) { + List optionArgs = new LinkedList(); + if (options.conditionalSet != null) { + if (options.conditionalSet == ConditionalSet.ONLY_IF_EXISTS) { + optionArgs.add(CONDITIONAL_SET_ONLY_IF_EXISTS); + } else if (options.conditionalSet == ConditionalSet.ONLY_IF_DOES_NOT_EXIST) { + optionArgs.add(CONDITIONAL_SET_ONLY_IF_DOES_NOT_EXIST); + } + } + + if (options.returnOldValue) { + optionArgs.add(RETURN_OLD_VALUE); + } + + if (options.expiry != null) { + if (options.expiry.type == TimeToLiveType.KEEP_EXISTING) { + optionArgs.add(TIME_TO_LIVE_KEEP_EXISTING); + } else { + if (options.expiry.count == null) { + throw new RequestException( + "Set command received expiry type " + options.expiry.type + "but count was not set."); + } + switch (options.expiry.type) { + case SECONDS: + optionArgs.add(TIME_TO_LIVE_SECONDS + " " + options.expiry.count); + break; + case MILLISECONDS: + optionArgs.add(TIME_TO_LIVE_MILLISECONDS + " " + options.expiry.count); + break; + case UNIX_SECONDS: + optionArgs.add(TIME_TO_LIVE_UNIX_SECONDS + " " + options.expiry.count); + break; + case UNIX_MILLISECONDS: + optionArgs.add(TIME_TO_LIVE_UNIX_MILLISECONDS + " " + options.expiry.count); + break; + } + } + } + + return optionArgs; + } +} diff --git a/java/client/src/main/java/glide/api/models/configuration/BackoffStrategy.java b/java/client/src/main/java/glide/api/models/configuration/BackoffStrategy.java new file mode 100644 index 0000000000..2d3aa81bb6 --- /dev/null +++ b/java/client/src/main/java/glide/api/models/configuration/BackoffStrategy.java @@ -0,0 +1,29 @@ +package glide.api.models.configuration; + +import lombok.Builder; +import lombok.Getter; +import lombok.NonNull; + +/** + * Represents the strategy used to determine how and when to reconnect, in case of connection + * failures. The time between attempts grows exponentially, to the formula rand(0 ... factor * + * (exponentBase ^ N)), where N is the number of failed attempts. Once the maximum value is reached, + * that will remain the time between retry attempts until a reconnect attempt is successful. The + * client will attempt to reconnect indefinitely. + */ +@Getter +@Builder +public class BackoffStrategy { + /** + * Number of retry attempts that the client should perform when disconnected from the server, + * where the time between retries increases. Once the retries have reached the maximum value, the + * time between + */ + @NonNull private final Integer numOfRetries; + + /** The multiplier that will be applied to the waiting time between each retry. */ + @NonNull private final Integer factor; + + /** The exponent base configured for the strategy. */ + @NonNull private final Integer exponentBase; +} diff --git a/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java b/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java new file mode 100644 index 0000000000..cba445a1bf --- /dev/null +++ b/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java @@ -0,0 +1,42 @@ +package glide.api.models.configuration; + +import java.util.List; +import lombok.Builder; +import lombok.Getter; +import lombok.Singular; +import lombok.experimental.SuperBuilder; + +/** Represents the configuration settings for a Redis client. */ +@Getter +@SuperBuilder +public abstract class BaseClientConfiguration { + /** + * DNS Addresses and ports of known nodes in the cluster. If the server is in cluster mode the + * list can be partial, as the client will attempt to map out the cluster and find all nodes. If + * the server is in standalone mode, only nodes whose addresses were provided will be used by the + * client. For example: [ {address:sample-address-0001.use1.cache.amazonaws.com, port:6379}, + * {address: sample-address-0002.use2.cache.amazonaws.com, port:6379} ]. If none are set, a + * default address localhost:6379 will be used. + */ + @Singular private final List addresses; + + /** True if communication with the cluster should use Transport Level Security. */ + @Builder.Default private final boolean useTLS = false; + + /** If not set, `PRIMARY` will be used. */ + @Builder.Default private final ReadFrom readFrom = ReadFrom.PRIMARY; + + /** + * Credentials for authentication process. If none are set, the client will not authenticate + * itself with the server. + */ + private final RedisCredentials credentials; + + /** + * The duration in milliseconds that the client should wait for a request to complete. This + * duration encompasses sending the request, awaiting for a response from the server, and any + * required reconnections or retries. If the specified timeout is exceeded for a pending request, + * it will result in a timeout error. If not set, a default value will be used. + */ + private final Integer requestTimeout; +} diff --git a/java/client/src/main/java/glide/api/models/configuration/NodeAddress.java b/java/client/src/main/java/glide/api/models/configuration/NodeAddress.java new file mode 100644 index 0000000000..ac4b657516 --- /dev/null +++ b/java/client/src/main/java/glide/api/models/configuration/NodeAddress.java @@ -0,0 +1,16 @@ +package glide.api.models.configuration; + +import lombok.Builder; +import lombok.Getter; +import lombok.NonNull; + +/** Represents the address and port of a node in the cluster. */ +@Getter +@Builder +public class NodeAddress { + public static String DEFAULT_HOST = "localhost"; + public static Integer PORT = 6379; + + @NonNull @Builder.Default private final String host = DEFAULT_HOST; + @NonNull @Builder.Default private final Integer port = 6379; +} diff --git a/java/client/src/main/java/glide/api/models/configuration/ReadFrom.java b/java/client/src/main/java/glide/api/models/configuration/ReadFrom.java new file mode 100644 index 0000000000..9792dab6c2 --- /dev/null +++ b/java/client/src/main/java/glide/api/models/configuration/ReadFrom.java @@ -0,0 +1,12 @@ +package glide.api.models.configuration; + +/** Represents the client's read from strategy. */ +public enum ReadFrom { + /** Always get from primary, in order to get the freshest data. */ + PRIMARY, + /** + * Spread the requests between all replicas in a round-robin manner. If no replica is available, + * route the requests to the primary. + */ + PREFER_REPLICA +} diff --git a/java/client/src/main/java/glide/api/models/configuration/RedisClientConfiguration.java b/java/client/src/main/java/glide/api/models/configuration/RedisClientConfiguration.java new file mode 100644 index 0000000000..fbdd1bba6b --- /dev/null +++ b/java/client/src/main/java/glide/api/models/configuration/RedisClientConfiguration.java @@ -0,0 +1,15 @@ +package glide.api.models.configuration; + +import lombok.Getter; +import lombok.experimental.SuperBuilder; + +/** Represents the configuration settings for a Standalone Redis client. */ +@Getter +@SuperBuilder +public class RedisClientConfiguration extends BaseClientConfiguration { + /** Strategy used to determine how and when to reconnect, in case of connection failures. */ + private final BackoffStrategy reconnectStrategy; + + /** Index of the logical database to connect to. */ + private final Integer databaseId; +} diff --git a/java/client/src/main/java/glide/api/models/configuration/RedisClusterClientConfiguration.java b/java/client/src/main/java/glide/api/models/configuration/RedisClusterClientConfiguration.java new file mode 100644 index 0000000000..ded65f1a4a --- /dev/null +++ b/java/client/src/main/java/glide/api/models/configuration/RedisClusterClientConfiguration.java @@ -0,0 +1,11 @@ +package glide.api.models.configuration; + +import lombok.experimental.SuperBuilder; + +/** + * Represents the configuration settings for a Cluster Redis client. Notes: Currently, the + * reconnection strategy in cluster mode is not configurable, and exponential backoff with fixed + * values is used. + */ +@SuperBuilder +public class RedisClusterClientConfiguration extends BaseClientConfiguration {} diff --git a/java/client/src/main/java/glide/api/models/configuration/RedisCredentials.java b/java/client/src/main/java/glide/api/models/configuration/RedisCredentials.java new file mode 100644 index 0000000000..bfcac49715 --- /dev/null +++ b/java/client/src/main/java/glide/api/models/configuration/RedisCredentials.java @@ -0,0 +1,19 @@ +package glide.api.models.configuration; + +import lombok.Builder; +import lombok.Getter; +import lombok.NonNull; + +/** Represents the credentials for connecting to a Redis server. */ +@Getter +@Builder +public class RedisCredentials { + /** The password that will be used for authenticating connections to the Redis servers. */ + @NonNull private final String password; + + /** + * The username that will be used for authenticating connections to the Redis servers. If not + * supplied, "default" will be used. + */ + private final String username; +} diff --git a/java/client/src/main/java/glide/api/models/exceptions/ClosingException.java b/java/client/src/main/java/glide/api/models/exceptions/ClosingException.java new file mode 100644 index 0000000000..89da6976e7 --- /dev/null +++ b/java/client/src/main/java/glide/api/models/exceptions/ClosingException.java @@ -0,0 +1,19 @@ +package glide.api.models.exceptions; + +public class ClosingException extends RedisException { + public ClosingException() { + super(); + } + + public ClosingException(String message) { + super(message); + } + + public ClosingException(Throwable cause) { + super(cause); + } + + public ClosingException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/java/client/src/main/java/glide/api/models/exceptions/ConnectionException.java b/java/client/src/main/java/glide/api/models/exceptions/ConnectionException.java new file mode 100644 index 0000000000..2a06c1cf27 --- /dev/null +++ b/java/client/src/main/java/glide/api/models/exceptions/ConnectionException.java @@ -0,0 +1,19 @@ +package glide.api.models.exceptions; + +public class ConnectionException extends RedisException { + public ConnectionException() { + super(); + } + + public ConnectionException(String message) { + super(message); + } + + public ConnectionException(Throwable cause) { + super(cause); + } + + public ConnectionException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/java/client/src/main/java/glide/api/models/exceptions/ExecAbortException.java b/java/client/src/main/java/glide/api/models/exceptions/ExecAbortException.java new file mode 100644 index 0000000000..9033b3d5bf --- /dev/null +++ b/java/client/src/main/java/glide/api/models/exceptions/ExecAbortException.java @@ -0,0 +1,19 @@ +package glide.api.models.exceptions; + +public class ExecAbortException extends RedisException { + public ExecAbortException() { + super(); + } + + public ExecAbortException(String message) { + super(message); + } + + public ExecAbortException(Throwable cause) { + super(cause); + } + + public ExecAbortException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/java/client/src/main/java/glide/api/models/exceptions/RedisException.java b/java/client/src/main/java/glide/api/models/exceptions/RedisException.java new file mode 100644 index 0000000000..c5502fbe84 --- /dev/null +++ b/java/client/src/main/java/glide/api/models/exceptions/RedisException.java @@ -0,0 +1,20 @@ +package glide.api.models.exceptions; + +public class RedisException extends RuntimeException { + + public RedisException() { + super(); + } + + public RedisException(String message) { + super(message); + } + + public RedisException(Throwable cause) { + super(cause); + } + + public RedisException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/java/client/src/main/java/glide/api/models/exceptions/RequestException.java b/java/client/src/main/java/glide/api/models/exceptions/RequestException.java new file mode 100644 index 0000000000..ea0daabf93 --- /dev/null +++ b/java/client/src/main/java/glide/api/models/exceptions/RequestException.java @@ -0,0 +1,19 @@ +package glide.api.models.exceptions; + +public class RequestException extends RedisException { + public RequestException() { + super(); + } + + public RequestException(String message) { + super(message); + } + + public RequestException(Throwable cause) { + super(cause); + } + + public RequestException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/java/client/src/main/java/glide/api/models/exceptions/TimeoutException.java b/java/client/src/main/java/glide/api/models/exceptions/TimeoutException.java new file mode 100644 index 0000000000..825235648c --- /dev/null +++ b/java/client/src/main/java/glide/api/models/exceptions/TimeoutException.java @@ -0,0 +1,19 @@ +package glide.api.models.exceptions; + +public class TimeoutException extends RedisException { + public TimeoutException() { + super(); + } + + public TimeoutException(String message) { + super(message); + } + + public TimeoutException(Throwable cause) { + super(cause); + } + + public TimeoutException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/java/client/src/main/java/glide/managers/CallbackManager.java b/java/client/src/main/java/glide/managers/CallbackManager.java new file mode 100644 index 0000000000..720b84f36f --- /dev/null +++ b/java/client/src/main/java/glide/managers/CallbackManager.java @@ -0,0 +1,63 @@ +package glide.managers; + +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; +import lombok.Getter; +import org.apache.commons.lang3.tuple.Pair; +import response.ResponseOuterClass.Response; + +/** Holder for resources required to dispatch responses and used by ReadHandler. */ +public class CallbackManager { + /** Unique request ID (callback ID). Thread-safe. */ + private final AtomicInteger requestId = new AtomicInteger(0); + + /** + * Storage of Futures to handle responses. Map key is callback id, which starts from 1.
+ * Each future is a promise for every submitted by user request. + */ + private final Map> responses = new ConcurrentHashMap<>(); + + /** + * Storage for connection request similar to {@link #responses}. Unfortunately, connection + * requests can't be stored in the same storage, because callback ID = 0 is hardcoded for + * connection requests. + */ + @Getter private final CompletableFuture connectionPromise = new CompletableFuture<>(); + + /** + * Register a new request to be sent. Once response received, the given future completes with it. + * + * @return A pair of unique callback ID which should set into request and a client promise for + * response. + */ + public Pair> registerRequest() { + int callbackId = requestId.incrementAndGet(); + var future = new CompletableFuture(); + responses.put(callbackId, future); + return Pair.of(callbackId, future); + } + + /** + * Complete the corresponding client promise and free resources. + * + * @param response A response received + */ + public void completeRequest(Response response) { + int callbackId = response.getCallbackIdx(); + if (callbackId == 0) { + connectionPromise.completeAsync(() -> response); + } else { + responses.get(callbackId).completeAsync(() -> response); + responses.remove(callbackId); + } + } + + public void shutdownGracefully() { + connectionPromise.completeExceptionally(new InterruptedException()); + responses.forEach( + (callbackId, future) -> future.completeExceptionally(new InterruptedException())); + responses.clear(); + } +} diff --git a/java/client/src/test/java/glide/api/Awaiter.java b/java/client/src/test/java/glide/api/Awaiter.java new file mode 100644 index 0000000000..665822fad6 --- /dev/null +++ b/java/client/src/test/java/glide/api/Awaiter.java @@ -0,0 +1,28 @@ +package glide.api; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +public class Awaiter { + private static final long DEFAULT_TIMEOUT_MILLISECONDS = 1000; + + /** Get the future result with default timeout. */ + public static T await(CompletableFuture future) { + return await(future, DEFAULT_TIMEOUT_MILLISECONDS); + } + + /** Get the future result with given timeout in ms. */ + public static T await(CompletableFuture future, long timeout) { + try { + return future.get(timeout, TimeUnit.MILLISECONDS); + } catch (ExecutionException | InterruptedException | TimeoutException e) { + // TODO: handle exceptions: + // InterruptedException: should shutdown the client service + // TimeoutException: should be propagated with an error message thrown + // ExecutionException: throw runtime exception + throw new RuntimeException(e); + } + } +} diff --git a/java/client/src/test/java/glide/api/RedisClientTest.java b/java/client/src/test/java/glide/api/RedisClientTest.java new file mode 100644 index 0000000000..bcd680095a --- /dev/null +++ b/java/client/src/test/java/glide/api/RedisClientTest.java @@ -0,0 +1,216 @@ +package glide.api; + +import static glide.api.models.commands.SetOptions.CONDITIONAL_SET_ONLY_IF_DOES_NOT_EXIST; +import static glide.api.models.commands.SetOptions.CONDITIONAL_SET_ONLY_IF_EXISTS; +import static glide.api.models.commands.SetOptions.RETURN_OLD_VALUE; +import static glide.api.models.commands.SetOptions.TIME_TO_LIVE_KEEP_EXISTING; +import static glide.api.models.commands.SetOptions.TIME_TO_LIVE_UNIX_SECONDS; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import glide.api.commands.Command; +import glide.api.models.commands.SetOptions; +import glide.managers.CommandManager; +import glide.managers.ConnectionManager; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class RedisClientTest { + + RedisClient service; + + ConnectionManager connectionManager; + + CommandManager commandManager; + + @BeforeEach + public void setUp() { + connectionManager = mock(ConnectionManager.class); + commandManager = mock(CommandManager.class); + service = new RedisClient(connectionManager, commandManager); + } + + @Test + public void customCommand_success() throws ExecutionException, InterruptedException { + // setup + String key = "testKey"; + Object value = "testValue"; + String cmd = "GETSTRING"; + CompletableFuture testResponse = mock(CompletableFuture.class); + when(testResponse.get()).thenReturn(value); + when(commandManager.submitNewCommand(any(), any())).thenReturn(testResponse); + + // exercise + CompletableFuture response = service.customCommand(new String[] {cmd, key}); + String payload = (String) response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload); + + // teardown + } + + @Test + public void customCommand_interruptedException() throws ExecutionException, InterruptedException { + // setup + String key = "testKey"; + Object value = "testValue"; + String cmd = "GETSTRING"; + CompletableFuture testResponse = mock(CompletableFuture.class); + when(testResponse.get()).thenThrow(new InterruptedException()); + when(commandManager.submitNewCommand(any(), any())).thenReturn(testResponse); + + // exercise + InterruptedException exception = + assertThrows( + InterruptedException.class, + () -> { + CompletableFuture response = service.get(key); + response.get(); + }); + + // verify + + // teardown + } + + @Test + public void get_success() throws ExecutionException, InterruptedException { + // setup + // TODO: randomize keys + String key = "testKey"; + String value = "testValue"; + Command cmd = + Command.builder() + .requestType(Command.RequestType.GET_STRING) + .arguments(new String[] {key}) + .build(); + CompletableFuture testResponse = mock(CompletableFuture.class); + when(testResponse.get()).thenReturn(value); + when(commandManager.submitNewCommand(any(), any())).thenReturn(testResponse); + + // exercise + CompletableFuture response = service.get(key); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload); + + // teardown + } + + @Test + public void set_success() throws ExecutionException, InterruptedException { + // setup + // TODO: randomize keys + String key = "testKey"; + String value = "testValue"; + Command cmd = + Command.builder() + .requestType(Command.RequestType.SET_STRING) + .arguments(new String[] {key, value}) + .build(); + CompletableFuture testResponse = mock(CompletableFuture.class); + when(testResponse.get()).thenReturn(null); + when(commandManager.submitNewCommand(any(), any())).thenReturn(testResponse); + + // exercise + CompletableFuture response = service.set(key, value); + Object nullResponse = response.get(); + + // verify + assertEquals(testResponse, response); + assertNull(nullResponse); + + // teardown + } + + @Test + public void set_withOptionsOnlyIfExists_success() + throws ExecutionException, InterruptedException { + // setup + String key = "testKey"; + String value = "testValue"; + SetOptions setOptions = + SetOptions.builder() + .conditionalSet(SetOptions.ConditionalSet.ONLY_IF_EXISTS) + .returnOldValue(false) + .expiry( + SetOptions.TimeToLive.builder() + .type(SetOptions.TimeToLiveType.KEEP_EXISTING) + .build()) + .build(); + Command cmd = + Command.builder() + .requestType(Command.RequestType.SET_STRING) + .arguments( + new String[] { + key, value, CONDITIONAL_SET_ONLY_IF_EXISTS, TIME_TO_LIVE_KEEP_EXISTING + }) + .build(); + CompletableFuture testResponse = mock(CompletableFuture.class); + when(testResponse.get()).thenReturn(null); + when(commandManager.submitNewCommand(eq(cmd), any())).thenReturn(testResponse); + + // exercise + CompletableFuture response = service.set(key, value, setOptions); + + // verify + assertNotNull(response); + assertNull(response.get()); + + // teardown + } + + @Test + public void set_withOptionsOnlyIfDoesNotExist_success() + throws ExecutionException, InterruptedException { + // setup + String key = "testKey"; + String value = "testValue"; + SetOptions setOptions = + SetOptions.builder() + .conditionalSet(SetOptions.ConditionalSet.ONLY_IF_DOES_NOT_EXIST) + .returnOldValue(true) + .expiry( + SetOptions.TimeToLive.builder() + .type(SetOptions.TimeToLiveType.UNIX_SECONDS) + .count(60) + .build()) + .build(); + Command cmd = + Command.builder() + .requestType(Command.RequestType.SET_STRING) + .arguments( + new String[] { + key, + value, + CONDITIONAL_SET_ONLY_IF_DOES_NOT_EXIST, + RETURN_OLD_VALUE, + TIME_TO_LIVE_UNIX_SECONDS + " 60" + }) + .build(); + CompletableFuture testResponse = mock(CompletableFuture.class); + when(testResponse.get()).thenReturn(value); + when(commandManager.submitNewCommand(eq(cmd), any())).thenReturn(testResponse); + + // exercise + CompletableFuture response = service.set(key, value, setOptions); + + // verify + assertNotNull(response); + assertEquals(value, response.get()); + + // teardown + } +} diff --git a/java/client/src/test/java/glide/managers/CommandManagerTest.java b/java/client/src/test/java/glide/managers/CommandManagerTest.java new file mode 100644 index 0000000000..08e7f104ff --- /dev/null +++ b/java/client/src/test/java/glide/managers/CommandManagerTest.java @@ -0,0 +1,244 @@ +package glide.managers; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; + +import glide.api.commands.BaseCommandResponseResolver; +import glide.api.commands.Command; +import glide.api.models.exceptions.ClosingException; +import glide.api.models.exceptions.ConnectionException; +import glide.api.models.exceptions.ExecAbortException; +import glide.api.models.exceptions.RedisException; +import glide.api.models.exceptions.TimeoutException; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import org.junit.jupiter.api.Test; +import response.ResponseOuterClass.RequestError; +import response.ResponseOuterClass.Response; + +public class CommandManagerTest { + + CommandManager service; + + // ignored for now + Command command; + + @Test + public void submitNewCommand_returnObjectResult() + throws ExecutionException, InterruptedException { + + CompletableFuture channel = new CompletableFuture<>(); + CommandManager service = new CommandManager(channel); + + long pointer = -1; + Response respPointerResponse = Response.newBuilder().setRespPointer(pointer).build(); + Object respObject = mock(Object.class); + + CompletableFuture result = + service.submitNewCommand( + command, new BaseCommandResponseResolver((ptr) -> ptr == pointer ? respObject : null)); + channel.complete(respPointerResponse); + Object respPointer = result.get(); + + assertEquals(respObject, respPointer); + } + + @Test + public void submitNewCommand_returnNullResult() throws ExecutionException, InterruptedException { + + CompletableFuture channel = new CompletableFuture<>(); + CommandManager service = new CommandManager(channel); + + Response respPointerResponse = Response.newBuilder().build(); + + CompletableFuture result = + service.submitNewCommand( + command, new BaseCommandResponseResolver((p) -> new RuntimeException(""))); + channel.complete(respPointerResponse); + Object respPointer = result.get(); + + assertNull(respPointer); + } + + @Test + public void submitNewCommand_returnStringResult() + throws ExecutionException, InterruptedException { + + long pointer = 123; + String testString = "TEST STRING"; + + CompletableFuture channel = new CompletableFuture<>(); + CommandManager service = new CommandManager(channel); + + Response respPointerResponse = Response.newBuilder().setRespPointer(pointer).build(); + + CompletableFuture result = + service.submitNewCommand( + command, new BaseCommandResponseResolver((p) -> p == pointer ? testString : null)); + channel.complete(respPointerResponse); + Object respPointer = result.get(); + + assertTrue(respPointer instanceof String); + assertEquals(testString, respPointer); + } + + @Test + public void submitNewCommand_throwClosingException() { + + String errorMsg = "Closing"; + + ExecutionException e = + assertThrows( + ExecutionException.class, + () -> { + CompletableFuture channel = new CompletableFuture<>(); + CommandManager service = new CommandManager(channel); + + Response closingErrorResponse = + Response.newBuilder().setClosingError(errorMsg).build(); + + CompletableFuture result = + service.submitNewCommand( + command, new BaseCommandResponseResolver((ptr) -> new Object())); + channel.complete(closingErrorResponse); + result.get(); + }); + + assertTrue(e.getCause() instanceof ClosingException); + assertEquals(errorMsg, e.getCause().getMessage()); + } + + @Test + public void submitNewCommand_throwConnectionException() { + + int disconnectedType = 3; + String errorMsg = "Disconnected"; + + ExecutionException e = + assertThrows( + ExecutionException.class, + () -> { + CompletableFuture channel = new CompletableFuture<>(); + CommandManager service = new CommandManager(channel); + + Response respPointerResponse = + Response.newBuilder() + .setRequestError( + RequestError.newBuilder() + .setTypeValue(disconnectedType) + .setMessage(errorMsg) + .build()) + .build(); + + CompletableFuture result = + service.submitNewCommand( + command, new BaseCommandResponseResolver((ptr) -> new Object())); + channel.complete(respPointerResponse); + result.get(); + }); + + assertTrue(e.getCause() instanceof ConnectionException); + assertEquals(errorMsg, e.getCause().getMessage()); + } + + @Test + public void submitNewCommand_throwTimeoutException() { + + int timeoutType = 2; + String errorMsg = "Timeout"; + + ExecutionException e = + assertThrows( + ExecutionException.class, + () -> { + CompletableFuture channel = new CompletableFuture<>(); + CommandManager service = new CommandManager(channel); + + Response timeoutErrorResponse = + Response.newBuilder() + .setRequestError( + RequestError.newBuilder() + .setTypeValue(timeoutType) + .setMessage(errorMsg) + .build()) + .build(); + + CompletableFuture result = + service.submitNewCommand( + command, new BaseCommandResponseResolver((ptr) -> new Object())); + channel.complete(timeoutErrorResponse); + result.get(); + }); + + assertTrue(e.getCause() instanceof TimeoutException); + assertEquals(errorMsg, e.getCause().getMessage()); + } + + @Test + public void submitNewCommand_throwExecAbortException() { + + int execAbortType = 1; + String errorMsg = "ExecAbort"; + + ExecutionException e = + assertThrows( + ExecutionException.class, + () -> { + CompletableFuture channel = new CompletableFuture<>(); + CommandManager service = new CommandManager(channel); + + Response execAbortErrorResponse = + Response.newBuilder() + .setRequestError( + RequestError.newBuilder() + .setTypeValue(execAbortType) + .setMessage(errorMsg) + .build()) + .build(); + + CompletableFuture result = + service.submitNewCommand( + command, new BaseCommandResponseResolver((ptr) -> new Object())); + channel.complete(execAbortErrorResponse); + result.get(); + }); + + assertTrue(e.getCause() instanceof ExecAbortException); + assertEquals(errorMsg, e.getCause().getMessage()); + } + + @Test + public void submitNewCommand_handledUnspecifiedError() { + int unspecifiedType = 0; + String errorMsg = "Unspecified"; + + ExecutionException executionException = + assertThrows( + ExecutionException.class, + () -> { + CompletableFuture channel = new CompletableFuture<>(); + CommandManager service = new CommandManager(channel); + + Response unspecifiedErrorResponse = + Response.newBuilder() + .setRequestError( + RequestError.newBuilder() + .setTypeValue(unspecifiedType) + .setMessage(errorMsg) + .build()) + .build(); + + CompletableFuture result = + service.submitNewCommand( + command, new BaseCommandResponseResolver((ptr) -> new Object())); + channel.complete(unspecifiedErrorResponse); + result.get(); + }); + + assertTrue(executionException.getCause() instanceof RedisException); + assertEquals(errorMsg, executionException.getCause().getMessage()); + } +} From 62836d83b0fc60a47a2c252ebac746b4e71d9e07 Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Fri, 29 Dec 2023 09:34:18 -0800 Subject: [PATCH 02/23] Remove command calls from API Signed-off-by: Andrew Carbonetto --- .../src/main/java/glide/api/RedisClient.java | 133 +--------- .../commands/BaseCommandResponseResolver.java | 57 ---- .../java/glide/api/commands/BaseCommands.java | 58 ----- .../main/java/glide/api/commands/Command.java | 33 --- .../RedisExceptionCheckedFunction.java | 16 -- .../glide/api/commands/StringCommands.java | 29 --- .../java/glide/api/commands/Transaction.java | 4 - .../java/glide/api/commands/VoidCommands.java | 55 ---- .../glide/api/models/commands/SetOptions.java | 130 ---------- .../src/test/java/glide/api/Awaiter.java | 28 -- .../test/java/glide/api/RedisClientTest.java | 216 ---------------- .../glide/managers/CommandManagerTest.java | 244 ------------------ 12 files changed, 9 insertions(+), 994 deletions(-) delete mode 100644 java/client/src/main/java/glide/api/commands/BaseCommandResponseResolver.java delete mode 100644 java/client/src/main/java/glide/api/commands/BaseCommands.java delete mode 100644 java/client/src/main/java/glide/api/commands/Command.java delete mode 100644 java/client/src/main/java/glide/api/commands/RedisExceptionCheckedFunction.java delete mode 100644 java/client/src/main/java/glide/api/commands/StringCommands.java delete mode 100644 java/client/src/main/java/glide/api/commands/Transaction.java delete mode 100644 java/client/src/main/java/glide/api/commands/VoidCommands.java delete mode 100644 java/client/src/main/java/glide/api/models/commands/SetOptions.java delete mode 100644 java/client/src/test/java/glide/api/Awaiter.java delete mode 100644 java/client/src/test/java/glide/api/RedisClientTest.java delete mode 100644 java/client/src/test/java/glide/managers/CommandManagerTest.java diff --git a/java/client/src/main/java/glide/api/RedisClient.java b/java/client/src/main/java/glide/api/RedisClient.java index 2d3ae23897..22f8239ef0 100644 --- a/java/client/src/main/java/glide/api/RedisClient.java +++ b/java/client/src/main/java/glide/api/RedisClient.java @@ -2,30 +2,20 @@ import static glide.ffi.resolvers.SocketListenerResolver.getSocket; -import glide.api.commands.BaseCommands; -import glide.api.commands.Command; -import glide.api.commands.RedisExceptionCheckedFunction; -import glide.api.commands.StringCommands; -import glide.api.commands.Transaction; -import glide.api.commands.VoidCommands; -import glide.api.models.commands.SetOptions; import glide.api.models.configuration.NodeAddress; import glide.api.models.configuration.RedisClientConfiguration; +import glide.api.models.exceptions.ConnectionException; import glide.api.models.exceptions.RedisException; import glide.connectors.handlers.CallbackDispatcher; import glide.connectors.handlers.ChannelHandler; import glide.managers.CommandManager; import glide.managers.ConnectionManager; -import java.util.LinkedList; -import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.function.Function; -import response.ResponseOuterClass.Response; /** Factory class for creating Glide/Redis-client connections */ -public class RedisClient extends BaseClient implements BaseCommands, StringCommands, VoidCommands { +public class RedisClient extends BaseClient { public static CompletableFuture CreateClient() { RedisClientConfiguration config = @@ -54,8 +44,6 @@ public static CompletableFuture CreateClient(String host, Integer p * @return a promise to connect and return a RedisClient */ public static CompletableFuture CreateClient(RedisClientConfiguration config) { - - // TODO: send request to connection manager AtomicBoolean connectionStatus = new AtomicBoolean(false); CallbackDispatcher callbackDispatcher = new CallbackDispatcher(); @@ -63,6 +51,12 @@ public static CompletableFuture CreateClient(RedisClientConfigurati var connectionManager = new ConnectionManager(); var commandManager = new CommandManager(new CompletableFuture<>()); // TODO: send request with configuration to connection Manager as part of a follow-up PR + return CreateClient(config, connectionManager, commandManager); + } + + private static CompletableFuture CreateClient(RedisClientConfiguration config, + ConnectionManager connectionManager, + CommandManager commandManager) { return connectionManager .connectToRedis( config.getAddresses().get(0).getHost(), @@ -74,7 +68,7 @@ public static CompletableFuture CreateClient(RedisClientConfigurati if (b) { return new RedisClient(connectionManager, commandManager); } - throw new RedisException("Unable to connect to Redis"); + throw new ConnectionException("Unable to connect to Redis"); }); } @@ -102,113 +96,4 @@ public void close() throws ExecutionException { throw new RuntimeException(interruptedException); } } - - /** - * Execute a single command against Redis.
- * - * @param command to be executed - * @param responseHandler handler responsible for assigning type to the response - * @return A CompletableFuture completed with the result from Redis - * @param Response value type - */ - protected CompletableFuture exec( - Command command, RedisExceptionCheckedFunction responseHandler) { - return commandManager.submitNewCommand(command, responseHandler); - } - - /** - * Execute a transaction by processing the queued commands.
- * See https://redis.io/topics/Transactions/ for details on Redis Transactions.
- * - * @param transaction with commands to be executed - * @return A CompletableFuture completed with the results from Redis - */ - @Override - public CompletableFuture> exec(Transaction transaction) { - // TODO: call commandManager.submitNewTransaction() - return exec(transaction, BaseCommands::handleTransactionResponse); - } - - /** - * Execute a transaction by processing the queued commands.
- * See https://redis.io/topics/Transactions/ for details on Redis Transactions.
- * - * @param transaction with commands to be executed - * @param responseHandler handler responsible for assigning type to the list of response objects - * @return A CompletableFuture completed with the results from Redis - */ - protected CompletableFuture> exec( - Transaction transaction, Function> responseHandler) { - // TODO: call commandManager.submitNewTransaction() - return new CompletableFuture<>(); - } - - /** - * Executes a single custom command, without checking inputs. Every part of the command, including - * subcommands, should be added as a separate value in args. - * - * @param args command and arguments for the custom command call - * @return CompletableFuture with the response - */ - public CompletableFuture customCommand(String[] args) { - Command command = - Command.builder().requestType(Command.RequestType.CUSTOM_COMMAND).arguments(args).build(); - return exec(command, BaseCommands::handleObjectResponse); - } - - /** - * Get the value associated with the given key, or null if no such value exists. See - * https://redis.io/commands/set/ for details. - * - * @param key - The key to retrieve from the database. - * @return If `key` exists, returns the value of `key` as a string. Otherwise, return null - */ - public CompletableFuture get(String key) { - Command command = - Command.builder() - .requestType(Command.RequestType.GET_STRING) - .arguments(new String[] {key}) - .build(); - return exec(command, StringCommands::handleStringResponse); - } - - /** - * Set the given key with the given value. Return value is dependent on the passed options. See - * https://redis.io/commands/set/ for details. - * - * @param key - The key to store. - * @param value - The value to store with the given key. - * @return null - */ - public CompletableFuture set(String key, String value) { - Command command = - Command.builder() - .requestType(Command.RequestType.SET_STRING) - .arguments(new String[] {key, value}) - .build(); - return exec(command, VoidCommands::handleVoidResponse); - } - - /** - * Set the given key with the given value. Return value is dependent on the passed options. See - * https://redis.io/commands/set/ for details. - * - * @param key - The key to store. - * @param value - The value to store with the given key. - * @param options - The Set options - * @return string or null If value isn't set because of `onlyIfExists` or `onlyIfDoesNotExist` - * conditions, return null. If `returnOldValue` is set, return the old value as a string. - */ - public CompletableFuture set(String key, String value, SetOptions options) { - LinkedList args = new LinkedList<>(); - args.add(key); - args.add(value); - args.addAll(SetOptions.createSetOptions(options)); - Command command = - Command.builder() - .requestType(Command.RequestType.SET_STRING) - .arguments(args.toArray(new String[0])) - .build(); - return exec(command, StringCommands::handleStringResponse); - } } diff --git a/java/client/src/main/java/glide/api/commands/BaseCommandResponseResolver.java b/java/client/src/main/java/glide/api/commands/BaseCommandResponseResolver.java deleted file mode 100644 index 5ab7e27d55..0000000000 --- a/java/client/src/main/java/glide/api/commands/BaseCommandResponseResolver.java +++ /dev/null @@ -1,57 +0,0 @@ -package glide.api.commands; - -import glide.api.models.exceptions.ClosingException; -import glide.api.models.exceptions.ConnectionException; -import glide.api.models.exceptions.ExecAbortException; -import glide.api.models.exceptions.RedisException; -import glide.api.models.exceptions.RequestException; -import glide.api.models.exceptions.TimeoutException; -import lombok.AllArgsConstructor; -import response.ResponseOuterClass; - -/** - * Response resolver responsible for evaluating the Redis response object with a success or failure. - */ -@AllArgsConstructor -public class BaseCommandResponseResolver - implements RedisExceptionCheckedFunction { - - private RedisExceptionCheckedFunction respPointerResolver; - - /** - * Extracts value from the RESP pointer.
- * Throws errors when the response is unsuccessful. - * - * @return A generic Object with the Response | null if the response is empty - */ - public Object apply(ResponseOuterClass.Response response) throws RedisException { - // TODO: handle object if the object is small - // TODO: handle RESP2 object if configuration is set - if (response.hasRequestError()) { - ResponseOuterClass.RequestError error = response.getRequestError(); - String msg = error.getMessage(); - switch (error.getType()) { - case Unspecified: - throw new RedisException(msg); - case ExecAbort: - throw new ExecAbortException(msg); - case Timeout: - throw new TimeoutException(msg); - case Disconnect: - throw new ConnectionException(msg); - } - throw new RequestException(response.getRequestError().getMessage()); - } - if (response.hasClosingError()) { - throw new ClosingException(response.getClosingError()); - } - if (response.hasRespPointer()) { - return respPointerResolver.apply(response.getRespPointer()); - } - if (response.hasConstantResponse()) { - // TODO: confirm - return "Ok"; - } - return null; - } -} diff --git a/java/client/src/main/java/glide/api/commands/BaseCommands.java b/java/client/src/main/java/glide/api/commands/BaseCommands.java deleted file mode 100644 index f6dbf2a697..0000000000 --- a/java/client/src/main/java/glide/api/commands/BaseCommands.java +++ /dev/null @@ -1,58 +0,0 @@ -package glide.api.commands; - -import glide.ffi.resolvers.RedisValueResolver; -import java.util.List; -import java.util.concurrent.CompletableFuture; -import response.ResponseOuterClass.Response; - -/** Base Commands interface to handle generic command and transaction requests. */ -public interface BaseCommands { - - /** - * default Object handler from response - * - * @return BaseCommandResponseResolver to deliver the response - */ - static BaseCommandResponseResolver applyBaseCommandResponseResolver() { - return new BaseCommandResponseResolver(RedisValueResolver::valueFromPointer); - } - - /** - * Extracts the response from the Protobuf response and either throws an exception or returns the - * appropriate response has an Object - * - * @param response Redis protobuf message - * @return Response Object - */ - static Object handleObjectResponse(Response response) { - // return function to convert protobuf.Response into the response object by - // calling valueFromPointer - return BaseCommands.applyBaseCommandResponseResolver().apply(response); - } - - public static List handleTransactionResponse(Response response) { - // return function to convert protobuf.Response into the response object by - // calling valueFromPointer - - List transactionResponse = - (List) BaseCommands.applyBaseCommandResponseResolver().apply(response); - return transactionResponse; - } - - /** - * Execute a @see{Command} by sending command via socket manager - * - * @param args arguments for the custom command - * @return a CompletableFuture with response result from Redis - */ - CompletableFuture customCommand(String[] args); - - /** - * Execute a transaction by processing the queued commands.
- * See https://redis.io/topics/Transactions/ for details on Redis Transactions.
- * - * @param transaction with commands to be executed - * @return A CompletableFuture completed with the results from Redis - */ - CompletableFuture> exec(Transaction transaction); -} diff --git a/java/client/src/main/java/glide/api/commands/Command.java b/java/client/src/main/java/glide/api/commands/Command.java deleted file mode 100644 index eec57c1184..0000000000 --- a/java/client/src/main/java/glide/api/commands/Command.java +++ /dev/null @@ -1,33 +0,0 @@ -package glide.api.commands; - -import lombok.Builder; -import lombok.EqualsAndHashCode; - -/** Base Command class to send a single request to Redis. */ -@Builder -@EqualsAndHashCode -public class Command { - - /** Redis command request type */ - final RequestType requestType; - - /** List of Arguments for the Redis command request */ - final String[] arguments; - - public enum RequestType { - /** */ - CUSTOM_COMMAND, - /** - * Get the value of key. - * - * @see: command reference - */ - GET_STRING, - /** - * Set key to hold the string value. - * - * @see: command reference - */ - SET_STRING, - } -} diff --git a/java/client/src/main/java/glide/api/commands/RedisExceptionCheckedFunction.java b/java/client/src/main/java/glide/api/commands/RedisExceptionCheckedFunction.java deleted file mode 100644 index 269240b84a..0000000000 --- a/java/client/src/main/java/glide/api/commands/RedisExceptionCheckedFunction.java +++ /dev/null @@ -1,16 +0,0 @@ -package glide.api.commands; - -import glide.api.models.exceptions.RedisException; - -@FunctionalInterface -public interface RedisExceptionCheckedFunction { - - /** - * Functional response handler that throws RedisException on a fail - * - * @param response - Redis Response - * @return T - response payload type - * @throws RedisException - */ - T apply(R response) throws RedisException; -} diff --git a/java/client/src/main/java/glide/api/commands/StringCommands.java b/java/client/src/main/java/glide/api/commands/StringCommands.java deleted file mode 100644 index 829346749b..0000000000 --- a/java/client/src/main/java/glide/api/commands/StringCommands.java +++ /dev/null @@ -1,29 +0,0 @@ -package glide.api.commands; - -import glide.api.models.exceptions.RedisException; -import java.util.concurrent.CompletableFuture; -import response.ResponseOuterClass.Response; - -/** String Commands interface to handle single commands that return Strings. */ -public interface StringCommands { - - /** - * Extracts the response from the Protobuf response and either throws an exception or returns the - * appropriate response has a String - * - * @param response Redis protobuf message - * @return Response as a String - */ - static String handleStringResponse(Response response) { - // return function to convert protobuf.Response into the response object by - // calling valueFromPointer - Object value = BaseCommands.applyBaseCommandResponseResolver().apply(response); - if (value instanceof String) { - return (String) value; - } - throw new RedisException( - "Unexpected return type from Redis: got " + value.getClass() + " expected String"); - } - - CompletableFuture get(String key); -} diff --git a/java/client/src/main/java/glide/api/commands/Transaction.java b/java/client/src/main/java/glide/api/commands/Transaction.java deleted file mode 100644 index 6eead551fa..0000000000 --- a/java/client/src/main/java/glide/api/commands/Transaction.java +++ /dev/null @@ -1,4 +0,0 @@ -package glide.api.commands; - -/** Class for encapsulating multi-request Transactions to Redis. */ -public class Transaction {} diff --git a/java/client/src/main/java/glide/api/commands/VoidCommands.java b/java/client/src/main/java/glide/api/commands/VoidCommands.java deleted file mode 100644 index 12227a3d39..0000000000 --- a/java/client/src/main/java/glide/api/commands/VoidCommands.java +++ /dev/null @@ -1,55 +0,0 @@ -package glide.api.commands; - -import glide.api.models.exceptions.ClosingException; -import glide.api.models.exceptions.ConnectionException; -import glide.api.models.exceptions.ExecAbortException; -import glide.api.models.exceptions.RedisException; -import glide.api.models.exceptions.RequestException; -import glide.api.models.exceptions.TimeoutException; -import java.util.concurrent.CompletableFuture; -import response.ResponseOuterClass.RequestError; -import response.ResponseOuterClass.Response; - -/** String Commands interface to handle single commands that have no payload. */ -public interface VoidCommands { - - /** - * Check for errors in the Response and return null Throws an error if an unexpected value is - * returned - * - * @return null if the response is empty - */ - static Void handleVoidResponse(Object respObject) { - Response response = (Response) respObject; - if (response.hasRequestError()) { - RequestError error = response.getRequestError(); - String msg = error.getMessage(); - switch (error.getType()) { - case Unspecified: - throw new RedisException("Unexpected result: " + msg); - case ExecAbort: - throw new ExecAbortException("ExecAbortException: " + msg); - case Timeout: - throw new TimeoutException("TimeoutException: " + msg); - case Disconnect: - throw new ConnectionException("Disconnection: " + msg); - } - throw new RequestException(response.getRequestError().getMessage()); - } - if (response.hasClosingError()) { - throw new ClosingException(response.getClosingError()); - } - if (response.hasRespPointer()) { - throw new RuntimeException( - "Unexpected object returned in response - expected constantResponse or null"); - } - if (response.hasConstantResponse()) { - return null; // Void - } - // TODO commented out due to #710: empty response means a successful connection - // https://github.com/aws/babushka/issues/710 - return null; - } - - CompletableFuture set(String key, String value); -} diff --git a/java/client/src/main/java/glide/api/models/commands/SetOptions.java b/java/client/src/main/java/glide/api/models/commands/SetOptions.java deleted file mode 100644 index 8aec51159f..0000000000 --- a/java/client/src/main/java/glide/api/models/commands/SetOptions.java +++ /dev/null @@ -1,130 +0,0 @@ -package glide.api.models.commands; - -import glide.api.models.exceptions.RequestException; -import java.util.LinkedList; -import java.util.List; -import lombok.Builder; -import lombok.NonNull; - -@Builder -@NonNull -public class SetOptions { - - /** - * if `conditional` is not set the value will be set regardless of prior value existence.
- * If value isn't set because of the condition, return null. - */ - private ConditionalSet conditionalSet; - - /** - * Return the old string stored at key, or null if key did not exist. An error is returned and SET - * aborted if the value stored at key is not a string. Equivalent to `GET` in the Redis API. - */ - private boolean returnOldValue; - - /** If not set, no expiry time will be set for the value. */ - private TimeToLive expiry; - - public enum ConditionalSet { - /** - * Only set the key if it does not already exist.
- * Equivalent to `NX` in the Redis API. - */ - ONLY_IF_EXISTS, - /** - * Only set the key if it already exists.
- * Equivalent to `EX` in the Redis API. - */ - ONLY_IF_DOES_NOT_EXIST - } - - @Builder - public static class TimeToLive { - /** Expiry type for the time to live */ - @NonNull private TimeToLiveType type; - - /** - * The amount of time to live before the key expires. Ignored when KEEP_EXISTING type is set. - */ - private Integer count; - } - - public enum TimeToLiveType { - /** - * Retain the time to live associated with the key.
- * Equivalent to `KEEPTTL` in the Redis API. - */ - KEEP_EXISTING, - /** - * Set the specified expire time, in seconds.
- * Equivalent to `EX` in the Redis API. - */ - SECONDS, - /** - * Set the specified expire time, in milliseconds.
- * Equivalent to `PX` in the Redis API. - */ - MILLISECONDS, - /** - * Set the specified Unix time at which the key will expire, in seconds.
- * Equivalent to `EXAT` in the Redis API. - */ - UNIX_SECONDS, - /** - * Set the specified Unix time at which the key will expire, in milliseconds.
- * Equivalent to `PXAT` in the Redis API. - */ - UNIX_MILLISECONDS - } - - public static String CONDITIONAL_SET_ONLY_IF_EXISTS = "XX"; - public static String CONDITIONAL_SET_ONLY_IF_DOES_NOT_EXIST = "NX"; - public static String RETURN_OLD_VALUE = "GET"; - public static String TIME_TO_LIVE_KEEP_EXISTING = "KEEPTTL"; - public static String TIME_TO_LIVE_SECONDS = "EX"; - public static String TIME_TO_LIVE_MILLISECONDS = "PX"; - public static String TIME_TO_LIVE_UNIX_SECONDS = "EXAT"; - public static String TIME_TO_LIVE_UNIX_MILLISECONDS = "PXAT"; - - public static List createSetOptions(SetOptions options) { - List optionArgs = new LinkedList(); - if (options.conditionalSet != null) { - if (options.conditionalSet == ConditionalSet.ONLY_IF_EXISTS) { - optionArgs.add(CONDITIONAL_SET_ONLY_IF_EXISTS); - } else if (options.conditionalSet == ConditionalSet.ONLY_IF_DOES_NOT_EXIST) { - optionArgs.add(CONDITIONAL_SET_ONLY_IF_DOES_NOT_EXIST); - } - } - - if (options.returnOldValue) { - optionArgs.add(RETURN_OLD_VALUE); - } - - if (options.expiry != null) { - if (options.expiry.type == TimeToLiveType.KEEP_EXISTING) { - optionArgs.add(TIME_TO_LIVE_KEEP_EXISTING); - } else { - if (options.expiry.count == null) { - throw new RequestException( - "Set command received expiry type " + options.expiry.type + "but count was not set."); - } - switch (options.expiry.type) { - case SECONDS: - optionArgs.add(TIME_TO_LIVE_SECONDS + " " + options.expiry.count); - break; - case MILLISECONDS: - optionArgs.add(TIME_TO_LIVE_MILLISECONDS + " " + options.expiry.count); - break; - case UNIX_SECONDS: - optionArgs.add(TIME_TO_LIVE_UNIX_SECONDS + " " + options.expiry.count); - break; - case UNIX_MILLISECONDS: - optionArgs.add(TIME_TO_LIVE_UNIX_MILLISECONDS + " " + options.expiry.count); - break; - } - } - } - - return optionArgs; - } -} diff --git a/java/client/src/test/java/glide/api/Awaiter.java b/java/client/src/test/java/glide/api/Awaiter.java deleted file mode 100644 index 665822fad6..0000000000 --- a/java/client/src/test/java/glide/api/Awaiter.java +++ /dev/null @@ -1,28 +0,0 @@ -package glide.api; - -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -public class Awaiter { - private static final long DEFAULT_TIMEOUT_MILLISECONDS = 1000; - - /** Get the future result with default timeout. */ - public static T await(CompletableFuture future) { - return await(future, DEFAULT_TIMEOUT_MILLISECONDS); - } - - /** Get the future result with given timeout in ms. */ - public static T await(CompletableFuture future, long timeout) { - try { - return future.get(timeout, TimeUnit.MILLISECONDS); - } catch (ExecutionException | InterruptedException | TimeoutException e) { - // TODO: handle exceptions: - // InterruptedException: should shutdown the client service - // TimeoutException: should be propagated with an error message thrown - // ExecutionException: throw runtime exception - throw new RuntimeException(e); - } - } -} diff --git a/java/client/src/test/java/glide/api/RedisClientTest.java b/java/client/src/test/java/glide/api/RedisClientTest.java deleted file mode 100644 index bcd680095a..0000000000 --- a/java/client/src/test/java/glide/api/RedisClientTest.java +++ /dev/null @@ -1,216 +0,0 @@ -package glide.api; - -import static glide.api.models.commands.SetOptions.CONDITIONAL_SET_ONLY_IF_DOES_NOT_EXIST; -import static glide.api.models.commands.SetOptions.CONDITIONAL_SET_ONLY_IF_EXISTS; -import static glide.api.models.commands.SetOptions.RETURN_OLD_VALUE; -import static glide.api.models.commands.SetOptions.TIME_TO_LIVE_KEEP_EXISTING; -import static glide.api.models.commands.SetOptions.TIME_TO_LIVE_UNIX_SECONDS; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import glide.api.commands.Command; -import glide.api.models.commands.SetOptions; -import glide.managers.CommandManager; -import glide.managers.ConnectionManager; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -public class RedisClientTest { - - RedisClient service; - - ConnectionManager connectionManager; - - CommandManager commandManager; - - @BeforeEach - public void setUp() { - connectionManager = mock(ConnectionManager.class); - commandManager = mock(CommandManager.class); - service = new RedisClient(connectionManager, commandManager); - } - - @Test - public void customCommand_success() throws ExecutionException, InterruptedException { - // setup - String key = "testKey"; - Object value = "testValue"; - String cmd = "GETSTRING"; - CompletableFuture testResponse = mock(CompletableFuture.class); - when(testResponse.get()).thenReturn(value); - when(commandManager.submitNewCommand(any(), any())).thenReturn(testResponse); - - // exercise - CompletableFuture response = service.customCommand(new String[] {cmd, key}); - String payload = (String) response.get(); - - // verify - assertEquals(testResponse, response); - assertEquals(value, payload); - - // teardown - } - - @Test - public void customCommand_interruptedException() throws ExecutionException, InterruptedException { - // setup - String key = "testKey"; - Object value = "testValue"; - String cmd = "GETSTRING"; - CompletableFuture testResponse = mock(CompletableFuture.class); - when(testResponse.get()).thenThrow(new InterruptedException()); - when(commandManager.submitNewCommand(any(), any())).thenReturn(testResponse); - - // exercise - InterruptedException exception = - assertThrows( - InterruptedException.class, - () -> { - CompletableFuture response = service.get(key); - response.get(); - }); - - // verify - - // teardown - } - - @Test - public void get_success() throws ExecutionException, InterruptedException { - // setup - // TODO: randomize keys - String key = "testKey"; - String value = "testValue"; - Command cmd = - Command.builder() - .requestType(Command.RequestType.GET_STRING) - .arguments(new String[] {key}) - .build(); - CompletableFuture testResponse = mock(CompletableFuture.class); - when(testResponse.get()).thenReturn(value); - when(commandManager.submitNewCommand(any(), any())).thenReturn(testResponse); - - // exercise - CompletableFuture response = service.get(key); - String payload = response.get(); - - // verify - assertEquals(testResponse, response); - assertEquals(value, payload); - - // teardown - } - - @Test - public void set_success() throws ExecutionException, InterruptedException { - // setup - // TODO: randomize keys - String key = "testKey"; - String value = "testValue"; - Command cmd = - Command.builder() - .requestType(Command.RequestType.SET_STRING) - .arguments(new String[] {key, value}) - .build(); - CompletableFuture testResponse = mock(CompletableFuture.class); - when(testResponse.get()).thenReturn(null); - when(commandManager.submitNewCommand(any(), any())).thenReturn(testResponse); - - // exercise - CompletableFuture response = service.set(key, value); - Object nullResponse = response.get(); - - // verify - assertEquals(testResponse, response); - assertNull(nullResponse); - - // teardown - } - - @Test - public void set_withOptionsOnlyIfExists_success() - throws ExecutionException, InterruptedException { - // setup - String key = "testKey"; - String value = "testValue"; - SetOptions setOptions = - SetOptions.builder() - .conditionalSet(SetOptions.ConditionalSet.ONLY_IF_EXISTS) - .returnOldValue(false) - .expiry( - SetOptions.TimeToLive.builder() - .type(SetOptions.TimeToLiveType.KEEP_EXISTING) - .build()) - .build(); - Command cmd = - Command.builder() - .requestType(Command.RequestType.SET_STRING) - .arguments( - new String[] { - key, value, CONDITIONAL_SET_ONLY_IF_EXISTS, TIME_TO_LIVE_KEEP_EXISTING - }) - .build(); - CompletableFuture testResponse = mock(CompletableFuture.class); - when(testResponse.get()).thenReturn(null); - when(commandManager.submitNewCommand(eq(cmd), any())).thenReturn(testResponse); - - // exercise - CompletableFuture response = service.set(key, value, setOptions); - - // verify - assertNotNull(response); - assertNull(response.get()); - - // teardown - } - - @Test - public void set_withOptionsOnlyIfDoesNotExist_success() - throws ExecutionException, InterruptedException { - // setup - String key = "testKey"; - String value = "testValue"; - SetOptions setOptions = - SetOptions.builder() - .conditionalSet(SetOptions.ConditionalSet.ONLY_IF_DOES_NOT_EXIST) - .returnOldValue(true) - .expiry( - SetOptions.TimeToLive.builder() - .type(SetOptions.TimeToLiveType.UNIX_SECONDS) - .count(60) - .build()) - .build(); - Command cmd = - Command.builder() - .requestType(Command.RequestType.SET_STRING) - .arguments( - new String[] { - key, - value, - CONDITIONAL_SET_ONLY_IF_DOES_NOT_EXIST, - RETURN_OLD_VALUE, - TIME_TO_LIVE_UNIX_SECONDS + " 60" - }) - .build(); - CompletableFuture testResponse = mock(CompletableFuture.class); - when(testResponse.get()).thenReturn(value); - when(commandManager.submitNewCommand(eq(cmd), any())).thenReturn(testResponse); - - // exercise - CompletableFuture response = service.set(key, value, setOptions); - - // verify - assertNotNull(response); - assertEquals(value, response.get()); - - // teardown - } -} diff --git a/java/client/src/test/java/glide/managers/CommandManagerTest.java b/java/client/src/test/java/glide/managers/CommandManagerTest.java deleted file mode 100644 index 08e7f104ff..0000000000 --- a/java/client/src/test/java/glide/managers/CommandManagerTest.java +++ /dev/null @@ -1,244 +0,0 @@ -package glide.managers; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.Mockito.mock; - -import glide.api.commands.BaseCommandResponseResolver; -import glide.api.commands.Command; -import glide.api.models.exceptions.ClosingException; -import glide.api.models.exceptions.ConnectionException; -import glide.api.models.exceptions.ExecAbortException; -import glide.api.models.exceptions.RedisException; -import glide.api.models.exceptions.TimeoutException; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import org.junit.jupiter.api.Test; -import response.ResponseOuterClass.RequestError; -import response.ResponseOuterClass.Response; - -public class CommandManagerTest { - - CommandManager service; - - // ignored for now - Command command; - - @Test - public void submitNewCommand_returnObjectResult() - throws ExecutionException, InterruptedException { - - CompletableFuture channel = new CompletableFuture<>(); - CommandManager service = new CommandManager(channel); - - long pointer = -1; - Response respPointerResponse = Response.newBuilder().setRespPointer(pointer).build(); - Object respObject = mock(Object.class); - - CompletableFuture result = - service.submitNewCommand( - command, new BaseCommandResponseResolver((ptr) -> ptr == pointer ? respObject : null)); - channel.complete(respPointerResponse); - Object respPointer = result.get(); - - assertEquals(respObject, respPointer); - } - - @Test - public void submitNewCommand_returnNullResult() throws ExecutionException, InterruptedException { - - CompletableFuture channel = new CompletableFuture<>(); - CommandManager service = new CommandManager(channel); - - Response respPointerResponse = Response.newBuilder().build(); - - CompletableFuture result = - service.submitNewCommand( - command, new BaseCommandResponseResolver((p) -> new RuntimeException(""))); - channel.complete(respPointerResponse); - Object respPointer = result.get(); - - assertNull(respPointer); - } - - @Test - public void submitNewCommand_returnStringResult() - throws ExecutionException, InterruptedException { - - long pointer = 123; - String testString = "TEST STRING"; - - CompletableFuture channel = new CompletableFuture<>(); - CommandManager service = new CommandManager(channel); - - Response respPointerResponse = Response.newBuilder().setRespPointer(pointer).build(); - - CompletableFuture result = - service.submitNewCommand( - command, new BaseCommandResponseResolver((p) -> p == pointer ? testString : null)); - channel.complete(respPointerResponse); - Object respPointer = result.get(); - - assertTrue(respPointer instanceof String); - assertEquals(testString, respPointer); - } - - @Test - public void submitNewCommand_throwClosingException() { - - String errorMsg = "Closing"; - - ExecutionException e = - assertThrows( - ExecutionException.class, - () -> { - CompletableFuture channel = new CompletableFuture<>(); - CommandManager service = new CommandManager(channel); - - Response closingErrorResponse = - Response.newBuilder().setClosingError(errorMsg).build(); - - CompletableFuture result = - service.submitNewCommand( - command, new BaseCommandResponseResolver((ptr) -> new Object())); - channel.complete(closingErrorResponse); - result.get(); - }); - - assertTrue(e.getCause() instanceof ClosingException); - assertEquals(errorMsg, e.getCause().getMessage()); - } - - @Test - public void submitNewCommand_throwConnectionException() { - - int disconnectedType = 3; - String errorMsg = "Disconnected"; - - ExecutionException e = - assertThrows( - ExecutionException.class, - () -> { - CompletableFuture channel = new CompletableFuture<>(); - CommandManager service = new CommandManager(channel); - - Response respPointerResponse = - Response.newBuilder() - .setRequestError( - RequestError.newBuilder() - .setTypeValue(disconnectedType) - .setMessage(errorMsg) - .build()) - .build(); - - CompletableFuture result = - service.submitNewCommand( - command, new BaseCommandResponseResolver((ptr) -> new Object())); - channel.complete(respPointerResponse); - result.get(); - }); - - assertTrue(e.getCause() instanceof ConnectionException); - assertEquals(errorMsg, e.getCause().getMessage()); - } - - @Test - public void submitNewCommand_throwTimeoutException() { - - int timeoutType = 2; - String errorMsg = "Timeout"; - - ExecutionException e = - assertThrows( - ExecutionException.class, - () -> { - CompletableFuture channel = new CompletableFuture<>(); - CommandManager service = new CommandManager(channel); - - Response timeoutErrorResponse = - Response.newBuilder() - .setRequestError( - RequestError.newBuilder() - .setTypeValue(timeoutType) - .setMessage(errorMsg) - .build()) - .build(); - - CompletableFuture result = - service.submitNewCommand( - command, new BaseCommandResponseResolver((ptr) -> new Object())); - channel.complete(timeoutErrorResponse); - result.get(); - }); - - assertTrue(e.getCause() instanceof TimeoutException); - assertEquals(errorMsg, e.getCause().getMessage()); - } - - @Test - public void submitNewCommand_throwExecAbortException() { - - int execAbortType = 1; - String errorMsg = "ExecAbort"; - - ExecutionException e = - assertThrows( - ExecutionException.class, - () -> { - CompletableFuture channel = new CompletableFuture<>(); - CommandManager service = new CommandManager(channel); - - Response execAbortErrorResponse = - Response.newBuilder() - .setRequestError( - RequestError.newBuilder() - .setTypeValue(execAbortType) - .setMessage(errorMsg) - .build()) - .build(); - - CompletableFuture result = - service.submitNewCommand( - command, new BaseCommandResponseResolver((ptr) -> new Object())); - channel.complete(execAbortErrorResponse); - result.get(); - }); - - assertTrue(e.getCause() instanceof ExecAbortException); - assertEquals(errorMsg, e.getCause().getMessage()); - } - - @Test - public void submitNewCommand_handledUnspecifiedError() { - int unspecifiedType = 0; - String errorMsg = "Unspecified"; - - ExecutionException executionException = - assertThrows( - ExecutionException.class, - () -> { - CompletableFuture channel = new CompletableFuture<>(); - CommandManager service = new CommandManager(channel); - - Response unspecifiedErrorResponse = - Response.newBuilder() - .setRequestError( - RequestError.newBuilder() - .setTypeValue(unspecifiedType) - .setMessage(errorMsg) - .build()) - .build(); - - CompletableFuture result = - service.submitNewCommand( - command, new BaseCommandResponseResolver((ptr) -> new Object())); - channel.complete(unspecifiedErrorResponse); - result.get(); - }); - - assertTrue(executionException.getCause() instanceof RedisException); - assertEquals(errorMsg, executionException.getCause().getMessage()); - } -} From 9e95ce61fbd5776f5cc1015ef4ce36bfb21a671d Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Fri, 29 Dec 2023 11:21:39 -0800 Subject: [PATCH 03/23] Remove exception models from PR Signed-off-by: Andrew Carbonetto --- .../src/main/java/glide/api/RedisClient.java | 17 +++++----------- .../models/exceptions/ClosingException.java | 19 ------------------ .../exceptions/ConnectionException.java | 19 ------------------ .../models/exceptions/ExecAbortException.java | 19 ------------------ .../api/models/exceptions/RedisException.java | 20 ------------------- .../models/exceptions/RequestException.java | 19 ------------------ .../models/exceptions/TimeoutException.java | 19 ------------------ 7 files changed, 5 insertions(+), 127 deletions(-) delete mode 100644 java/client/src/main/java/glide/api/models/exceptions/ClosingException.java delete mode 100644 java/client/src/main/java/glide/api/models/exceptions/ConnectionException.java delete mode 100644 java/client/src/main/java/glide/api/models/exceptions/ExecAbortException.java delete mode 100644 java/client/src/main/java/glide/api/models/exceptions/RedisException.java delete mode 100644 java/client/src/main/java/glide/api/models/exceptions/RequestException.java delete mode 100644 java/client/src/main/java/glide/api/models/exceptions/TimeoutException.java diff --git a/java/client/src/main/java/glide/api/RedisClient.java b/java/client/src/main/java/glide/api/RedisClient.java index 22f8239ef0..5bc1544019 100644 --- a/java/client/src/main/java/glide/api/RedisClient.java +++ b/java/client/src/main/java/glide/api/RedisClient.java @@ -4,8 +4,6 @@ import glide.api.models.configuration.NodeAddress; import glide.api.models.configuration.RedisClientConfiguration; -import glide.api.models.exceptions.ConnectionException; -import glide.api.models.exceptions.RedisException; import glide.connectors.handlers.CallbackDispatcher; import glide.connectors.handlers.ChannelHandler; import glide.managers.CommandManager; @@ -54,22 +52,17 @@ public static CompletableFuture CreateClient(RedisClientConfigurati return CreateClient(config, connectionManager, commandManager); } - private static CompletableFuture CreateClient(RedisClientConfiguration config, - ConnectionManager connectionManager, - CommandManager commandManager) { + private static CompletableFuture CreateClient( + RedisClientConfiguration config, + ConnectionManager connectionManager, + CommandManager commandManager) { return connectionManager .connectToRedis( config.getAddresses().get(0).getHost(), config.getAddresses().get(0).getPort(), config.isUseTLS(), false) - .thenApplyAsync( - b -> { - if (b) { - return new RedisClient(connectionManager, commandManager); - } - throw new ConnectionException("Unable to connect to Redis"); - }); + .thenApplyAsync(ignore -> new RedisClient(connectionManager, commandManager)); } protected RedisClient(ConnectionManager connectionManager, CommandManager commandManager) { diff --git a/java/client/src/main/java/glide/api/models/exceptions/ClosingException.java b/java/client/src/main/java/glide/api/models/exceptions/ClosingException.java deleted file mode 100644 index 89da6976e7..0000000000 --- a/java/client/src/main/java/glide/api/models/exceptions/ClosingException.java +++ /dev/null @@ -1,19 +0,0 @@ -package glide.api.models.exceptions; - -public class ClosingException extends RedisException { - public ClosingException() { - super(); - } - - public ClosingException(String message) { - super(message); - } - - public ClosingException(Throwable cause) { - super(cause); - } - - public ClosingException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/java/client/src/main/java/glide/api/models/exceptions/ConnectionException.java b/java/client/src/main/java/glide/api/models/exceptions/ConnectionException.java deleted file mode 100644 index 2a06c1cf27..0000000000 --- a/java/client/src/main/java/glide/api/models/exceptions/ConnectionException.java +++ /dev/null @@ -1,19 +0,0 @@ -package glide.api.models.exceptions; - -public class ConnectionException extends RedisException { - public ConnectionException() { - super(); - } - - public ConnectionException(String message) { - super(message); - } - - public ConnectionException(Throwable cause) { - super(cause); - } - - public ConnectionException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/java/client/src/main/java/glide/api/models/exceptions/ExecAbortException.java b/java/client/src/main/java/glide/api/models/exceptions/ExecAbortException.java deleted file mode 100644 index 9033b3d5bf..0000000000 --- a/java/client/src/main/java/glide/api/models/exceptions/ExecAbortException.java +++ /dev/null @@ -1,19 +0,0 @@ -package glide.api.models.exceptions; - -public class ExecAbortException extends RedisException { - public ExecAbortException() { - super(); - } - - public ExecAbortException(String message) { - super(message); - } - - public ExecAbortException(Throwable cause) { - super(cause); - } - - public ExecAbortException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/java/client/src/main/java/glide/api/models/exceptions/RedisException.java b/java/client/src/main/java/glide/api/models/exceptions/RedisException.java deleted file mode 100644 index c5502fbe84..0000000000 --- a/java/client/src/main/java/glide/api/models/exceptions/RedisException.java +++ /dev/null @@ -1,20 +0,0 @@ -package glide.api.models.exceptions; - -public class RedisException extends RuntimeException { - - public RedisException() { - super(); - } - - public RedisException(String message) { - super(message); - } - - public RedisException(Throwable cause) { - super(cause); - } - - public RedisException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/java/client/src/main/java/glide/api/models/exceptions/RequestException.java b/java/client/src/main/java/glide/api/models/exceptions/RequestException.java deleted file mode 100644 index ea0daabf93..0000000000 --- a/java/client/src/main/java/glide/api/models/exceptions/RequestException.java +++ /dev/null @@ -1,19 +0,0 @@ -package glide.api.models.exceptions; - -public class RequestException extends RedisException { - public RequestException() { - super(); - } - - public RequestException(String message) { - super(message); - } - - public RequestException(Throwable cause) { - super(cause); - } - - public RequestException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/java/client/src/main/java/glide/api/models/exceptions/TimeoutException.java b/java/client/src/main/java/glide/api/models/exceptions/TimeoutException.java deleted file mode 100644 index 825235648c..0000000000 --- a/java/client/src/main/java/glide/api/models/exceptions/TimeoutException.java +++ /dev/null @@ -1,19 +0,0 @@ -package glide.api.models.exceptions; - -public class TimeoutException extends RedisException { - public TimeoutException() { - super(); - } - - public TimeoutException(String message) { - super(message); - } - - public TimeoutException(Throwable cause) { - super(cause); - } - - public TimeoutException(String message, Throwable cause) { - super(message, cause); - } -} From 114ed94f89c6c8452864aa1bd3c5de4c291c15de Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Fri, 29 Dec 2023 15:37:33 -0800 Subject: [PATCH 04/23] Update ConnectionManager to receive configuration Signed-off-by: Andrew Carbonetto --- java/client/hs_err_pid14086.log | 1438 +++++++++++++++++ .../src/main/java/glide/api/RedisClient.java | 17 +- .../main/java/glide/api/RequestBuilder.java | 63 - .../BaseClientConfiguration.java | 3 +- .../api/models/configuration/NodeAddress.java | 4 +- .../ffi/resolvers/RedisValueResolver.java | 5 + .../glide/managers/ConnectionManager.java | 158 +- .../java/glide/api/ConnectionManagerTest.java | 310 ++++ java/src/lib.rs | 2 +- 9 files changed, 1900 insertions(+), 100 deletions(-) create mode 100644 java/client/hs_err_pid14086.log delete mode 100644 java/client/src/main/java/glide/api/RequestBuilder.java create mode 100644 java/client/src/test/java/glide/api/ConnectionManagerTest.java diff --git a/java/client/hs_err_pid14086.log b/java/client/hs_err_pid14086.log new file mode 100644 index 0000000000..599f42ae92 --- /dev/null +++ b/java/client/hs_err_pid14086.log @@ -0,0 +1,1438 @@ +# +# A fatal error has been detected by the Java Runtime Environment: +# +# SIGSEGV (0xb) at pc=0x000000012557619c, pid=14086, tid=41219 +# +# JRE version: OpenJDK Runtime Environment Corretto-17.0.3.6.1 (17.0.3+6) (build 17.0.3+6-LTS) +# Java VM: OpenJDK 64-Bit Server VM Corretto-17.0.3.6.1 (17.0.3+6-LTS, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, bsd-aarch64) +# Problematic frame: +# C [libglide_rs.dylib+0xce19c] Java_glide_ffi_resolvers_RedisValueResolver_valueFromPointer+0x20 +# +# No core dump will be written. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again +# +# If you would like to submit a bug report, please visit: +# https://github.com/corretto/corretto-17/issues/ +# The crash happened outside the Java Virtual Machine in native code. +# See problematic frame for where to report the bug. +# + +--------------- S U M M A R Y ------------ + +Command Line: -Djava.library.path=/Users/andrewc/git/bq/babushka/java/client/../target/release:/Users/andrewc/git/bq/babushka/java/client/../target/debug -Dorg.gradle.internal.worker.tmpdir=/Users/andrewc/git/bq/babushka/java/client/build/tmp/test/work -Dorg.gradle.native=false -Xmx512m -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en -Duser.variant -ea worker.org.gradle.process.internal.worker.GradleWorkerMain 'Gradle Test Executor 12' + +Host: "MacBookPro18,2" arm64, 10 cores, 64G, Darwin 23.2.0, macOS 14.2 (23C64) +Time: Fri Dec 29 15:15:09 2023 PST elapsed time: 0.542144 seconds (0d 0h 0m 0s) + +--------------- T H R E A D --------------- + +Current thread (0x00000001369a0400): JavaThread "ForkJoinPool.commonPool-worker-1" daemon [_thread_in_native, id=41219, stack(0x000000016f8f0000,0x000000016faf3000)] + +Stack: [0x000000016f8f0000,0x000000016faf3000], sp=0x000000016faf2390, free space=2056k +Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) +C [libglide_rs.dylib+0xce19c] Java_glide_ffi_resolvers_RedisValueResolver_valueFromPointer+0x20 +j glide.ffi.resolvers.RedisValueResolver.valueFromPointer(J)Ljava/lang/Object;+0 +j glide.managers.ConnectionManager.checkGlideRsResponse(Lresponse/ResponseOuterClass$Response;)Ljava/lang/Void;+93 +j glide.managers.ConnectionManager$$Lambda$373+0x0000000800e43db8.apply(Ljava/lang/Object;)Ljava/lang/Object;+8 +j java.util.concurrent.CompletableFuture$UniApply.tryFire(I)Ljava/util/concurrent/CompletableFuture;+106 java.base@17.0.3 +j java.util.concurrent.CompletableFuture$Completion.exec()Z+2 java.base@17.0.3 +j java.util.concurrent.ForkJoinTask.doExec()I+10 java.base@17.0.3 +j java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Ljava/util/concurrent/ForkJoinTask;Ljava/util/concurrent/ForkJoinPool$WorkQueue;)V+13 java.base@17.0.3 +j java.util.concurrent.ForkJoinPool.scan(Ljava/util/concurrent/ForkJoinPool$WorkQueue;II)I+193 java.base@17.0.3 +j java.util.concurrent.ForkJoinPool.runWorker(Ljava/util/concurrent/ForkJoinPool$WorkQueue;)V+53 java.base@17.0.3 +j java.util.concurrent.ForkJoinWorkerThread.run()V+31 java.base@17.0.3 +v ~StubRoutines::call_stub +V [libjvm.dylib+0x46bf5c] JavaCalls::call_helper(JavaValue*, methodHandle const&, JavaCallArguments*, JavaThread*)+0x390 +V [libjvm.dylib+0x46afc8] JavaCalls::call_virtual(JavaValue*, Klass*, Symbol*, Symbol*, JavaCallArguments*, JavaThread*)+0xf8 +V [libjvm.dylib+0x46b090] JavaCalls::call_virtual(JavaValue*, Handle, Klass*, Symbol*, Symbol*, JavaThread*)+0x64 +V [libjvm.dylib+0x5203d4] thread_entry(JavaThread*, JavaThread*)+0xc4 +V [libjvm.dylib+0x99f624] JavaThread::thread_main_inner()+0x138 +V [libjvm.dylib+0x99dd00] Thread::call_run()+0x128 +V [libjvm.dylib+0x7bc108] thread_native_entry(Thread*)+0x158 +C [libsystem_pthread.dylib+0x7034] _pthread_start+0x88 + +Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) +j glide.ffi.resolvers.RedisValueResolver.valueFromPointer(J)Ljava/lang/Object;+0 +j glide.managers.ConnectionManager.checkGlideRsResponse(Lresponse/ResponseOuterClass$Response;)Ljava/lang/Void;+93 +j glide.managers.ConnectionManager$$Lambda$373+0x0000000800e43db8.apply(Ljava/lang/Object;)Ljava/lang/Object;+8 +j java.util.concurrent.CompletableFuture$UniApply.tryFire(I)Ljava/util/concurrent/CompletableFuture;+106 java.base@17.0.3 +j java.util.concurrent.CompletableFuture$Completion.exec()Z+2 java.base@17.0.3 +j java.util.concurrent.ForkJoinTask.doExec()I+10 java.base@17.0.3 +j java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Ljava/util/concurrent/ForkJoinTask;Ljava/util/concurrent/ForkJoinPool$WorkQueue;)V+13 java.base@17.0.3 +j java.util.concurrent.ForkJoinPool.scan(Ljava/util/concurrent/ForkJoinPool$WorkQueue;II)I+193 java.base@17.0.3 +j java.util.concurrent.ForkJoinPool.runWorker(Ljava/util/concurrent/ForkJoinPool$WorkQueue;)V+53 java.base@17.0.3 +j java.util.concurrent.ForkJoinWorkerThread.run()V+31 java.base@17.0.3 +v ~StubRoutines::call_stub + +siginfo: si_signo: 11 (SIGSEGV), si_code: 2 (SEGV_ACCERR), si_addr: 0x0000000000000001 + +Register to memory mapping: + + x0=0x00000001369a06a8 points into unknown readable memory: 0x00000001067528c8 | c8 28 75 06 01 00 00 00 + x1=0x000000016faf2548 is pointing into the stack for thread: 0x00000001369a0400 + x2=0x0000000000000001 is an unknown value + x3=0x0 is NULL + x4=0x0000000000000001 is an unknown value + x5=0x0 is NULL + x6=0x00000000000000d6 is an unknown value + x7=0x00000001369a0400 is a thread + x8=0x0000000000000004 is an unknown value + x9=0x00000001369a0738 points into unknown readable memory: 0x6a4c283e00000004 | 04 00 00 00 3e 28 4c 6a +x10=0x000000012557617c: Java_glide_ffi_resolvers_RedisValueResolver_valueFromPointer+0 in /Users/andrewc/git/bq/babushka/java/target/release/libglide_rs.dylib at 0x00000001254a8000 +x11=0x0000000000000004 is an unknown value +x12={method} {0x0000000124397c98} 'valueFromPointer' '(J)Ljava/lang/Object;' in 'glide/ffi/resolvers/RedisValueResolver' +x13={method} {0x0000000124397c98} 'valueFromPointer' '(J)Ljava/lang/Object;' in 'glide/ffi/resolvers/RedisValueResolver' +x14=0x00000000b841d8c5 is an unknown value +x15=0x00000000000000c5 is an unknown value +x16=0x000000018977edb4: pthread_jit_write_protect_np+0 in /usr/lib/system/libsystem_pthread.dylib at 0x0000000189777000 +x17=0x00000007fdd82be8 is an oop: java.lang.Class +{0x00000007fdd82be8} - klass: 'java/lang/Class' + - ---- fields (total size 14 words): + - private volatile transient 'classRedefinedCount' 'I' @12 0 + - private volatile transient 'cachedConstructor' 'Ljava/lang/reflect/Constructor;' @40 NULL (0) + - private transient 'name' 'Ljava/lang/String;' @44 "glide.ffi.resolvers.RedisValueResolver"{0x00000007fdd82c68} (ffbb058d) + - private transient 'module' 'Ljava/lang/Module;' @48 a 'java/lang/Module'{0x00000007ffe571e8} (fffcae3d) + - private final 'classLoader' 'Ljava/lang/ClassLoader;' @52 a 'jdk/internal/loader/ClassLoaders$AppClassLoader'{0x00000007ffe56a60} (fffcad4c) + - private transient 'classData' 'Ljava/lang/Object;' @56 NULL (0) + - private transient 'packageName' 'Ljava/lang/String;' @60 "glide.ffi.resolvers"{0x00000007fdd825e0} (ffbb04bc) + - private final 'componentType' 'Ljava/lang/Class;' @64 NULL (0) + - private volatile transient 'reflectionData' 'Ljava/lang/ref/SoftReference;' @68 NULL (0) + - private volatile transient 'genericInfo' 'Lsun/reflect/generics/repository/ClassRepository;' @72 NULL (0) + - private volatile transient 'enumConstants' '[Ljava/lang/Object;' @76 NULL (0) + - private volatile transient 'enumConstantDirectory' 'Ljava/util/Map;' @80 NULL (0) + - private volatile transient 'annotationData' 'Ljava/lang/Class$AnnotationData;' @84 NULL (0) + - private volatile transient 'annotationType' 'Lsun/reflect/annotation/AnnotationType;' @88 NULL (0) + - transient 'classValueMap' 'Ljava/lang/ClassValue$ClassValueMap;' @92 NULL (0) + - signature: Lglide/ffi/resolvers/RedisValueResolver; + - fake entry for mirror: 'glide/ffi/resolvers/RedisValueResolver' + - fake entry for array: NULL + - fake entry for oop_size: 14 + - fake entry for static_oop_field_count: 0 +x18=0x0 is NULL +x19=0x0000000000000001 is an unknown value +x20=0x000000016faf24d0 is pointing into the stack for thread: 0x00000001369a0400 +x21=0x00000001067a0458: _ZN19TemplateInterpreter13_active_tableE+0 in /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/server/libjvm.dylib at 0x0000000105b38000 +x22=0x0 is NULL +x23=4290446033 is a compressed pointer to object: java.util.concurrent.ConcurrentHashMap$Node +{0x00000007fdd81688} - klass: 'java/util/concurrent/ConcurrentHashMap$Node' + - ---- fields (total size 4 words): + - final 'hash' 'I' @12 1288636755 (4ccf0953) + - final 'key' 'Ljava/lang/Object;' @16 a 'java/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry'{0x00000007fdd81668} (ffbb02cd) + - volatile 'val' 'Ljava/lang/Object;' @20 a 'java/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry'{0x00000007fdd81668} (ffbb02cd) + - volatile 'next' 'Ljava/util/concurrent/ConcurrentHashMap$Node;' @24 NULL (0) +x24=0x000000016faf2558 is pointing into the stack for thread: 0x00000001369a0400 +x25=0x0000000000000001 is an unknown value +x26=0x0000000124397d98 is pointing into metadata +x27=0x0 is NULL +x28=0x00000001369a0400 is a thread + + +Registers: + x0=0x00000001369a06a8 x1=0x000000016faf2548 x2=0x0000000000000001 x3=0x0000000000000000 + x4=0x0000000000000001 x5=0x0000000000000000 x6=0x00000000000000d6 x7=0x00000001369a0400 + x8=0x0000000000000004 x9=0x00000001369a0738 x10=0x000000012557617c x11=0x0000000000000004 +x12=0x0000000124397c98 x13=0x0000000124397c98 x14=0x00000000b841d8c5 x15=0x00000000000000c5 +x16=0x000000018977edb4 x17=0x00000007fdd82be8 x18=0x0000000000000000 x19=0x0000000000000001 +x20=0x000000016faf24d0 x21=0x00000001067a0458 x22=0x0000000000000000 x23=0x00000000ffbb02d1 +x24=0x000000016faf2558 x25=0x0000000000000001 x26=0x0000000124397d98 x27=0x0000000000000000 +x28=0x00000001369a0400 fp=0x000000016faf24c0 lr=0x000000010e5c98ac sp=0x000000016faf2390 +pc=0x000000012557619c cpsr=0x0000000000001000 +Top of Stack: (sp=0x000000016faf2390) +0x000000016faf2390: 00000001066fa380 0000000000000000 +0x000000016faf23a0: 0000000000000001 0000000000000000 +0x000000016faf23b0: 0000000000000000 0000000000000000 +0x000000016faf23c0: 0000000000000000 1e174ec9f05c0021 +0x000000016faf23d0: 0000000000000000 0000000000000000 +0x000000016faf23e0: 0000000000000000 0000000000000000 +0x000000016faf23f0: 0000000000000000 000000010e5de380 +0x000000016faf2400: 0000000000000179 00000001062c66b8 +0x000000016faf2410: 00000001369a0400 0000000000000000 +0x000000016faf2420: 0000000124397d98 0000000000000001 +0x000000016faf2430: 000000016faf2558 00000000ffbb02d1 +0x000000016faf2440: 0000000000000000 0000000124397c98 +0x000000016faf2450: 0000000000000001 00000001369a0400 +0x000000016faf2460: 000000016faf24b0 a658000105f9fbf8 +0x000000016faf2470: 0000000000000000 0000000124397c98 +0x000000016faf2480: 00000001369a0400 0000000000000000 +0x000000016faf2490: 000000016faf2558 00000000ffbb02d1 +0x000000016faf24a0: 0000000000000000 00000001067a0458 +0x000000016faf24b0: 000000016faf24d0 000000010e5c773c +0x000000016faf24c0: 000000016faf2530 000000010e5c98ac +0x000000016faf24d0: 000000010e5c96cc 0000000124397c98 +0x000000016faf24e0: 000000016faf24e0 0000000000000000 +0x000000016faf24f0: 000000016faf2558 0000000124397d98 +0x000000016faf2500: 00000007fdd82be8 0000000000000000 +0x000000016faf2510: 0000000000000000 0000000124397c98 +0x000000016faf2520: 0000000000000000 000000016faf2510 +0x000000016faf2530: 000000016faf25c0 000000010e5c5d80 +0x000000016faf2540: 0000000000000000 00000007fdd82be8 +0x000000016faf2550: 0000000000000001 0000000000000000 +0x000000016faf2560: 00000007fdd81720 00000007fdd81720 +0x000000016faf2570: 000000016faf2570 00000001206c037d +0x000000016faf2580: 000000016faf25d8 0000000124308000 + +Instructions: (pc=0x000000012557619c) +0x000000012557609c: 97ff2d64 91038260 9402242c 1400002d +0x00000001255760ac: aa0003f4 a9408ac1 aa1303e0 940110ca +0x00000001255760bc: 14000004 aa0003f4 910c43e0 97feef65 +0x00000001255760cc: aa1403e0 940693ae 94063ad2 aa0003f4 +0x00000001255760dc: f1000739 540000c0 91010375 aa1b03e0 +0x00000001255760ec: 97ffbd44 aa1503fb 17fffffa a94307e0 +0x00000001255760fc: 97fd74a9 71000f1f 540000c0 71003b1f +0x000000012557610c: 54000120 910a03e0 97fcde14 14000006 +0x000000012557611c: b9400fe8 36000088 910a03e8 b27d0100 +0x000000012557612c: 97fcdfec 52800048 f94013e9 39000128 +0x000000012557613c: f9400fe0 97fda6d8 52800048 39000388 +0x000000012557614c: f9400be0 97fda5e1 91040260 97fda60f +0x000000012557615c: 52800048 3902c668 aa1403e0 94069388 +0x000000012557616c: 94063aac 94063aab 94063aaa 94063aa9 +0x000000012557617c: d10503ff a90f6ffc a9105ff8 a91157f6 +0x000000012557618c: a9124ff4 a9137bfd 9104c3fd aa0203f3 +0x000000012557619c: ad400440 ad0007e0 ad410440 ad0107e0 +0x00000001255761ac: f90027e0 394003e8 f00013c2 91298042 +0x00000001255761bc: d2800014 90000e49 91343129 1000008a +0x00000001255761cc: 3868692b 8b0b094a d61f0140 f94007e8 +0x00000001255761dc: 528000a9 390143e9 f9002fe8 d0000ea2 +0x00000001255761ec: 9134cc42 b0000f64 910d1084 9101c3e0 +0x00000001255761fc: 910123e1 910143e6 52800223 52800085 +0x000000012557620c: 97fe7327 3941c3e8 71003d1f 54000aa0 +0x000000012557621c: ad4387e0 ad3c07a0 3dc027e0 3c9a03a0 +0x000000012557622c: f94053e8 f81b03a8 f0000f40 91074c00 +0x000000012557623c: f00013c3 91200063 f00013c4 9127a084 +0x000000012557624c: d10203a2 52800561 94063a39 140000c1 +0x000000012557625c: 3cc083e0 3d8017e0 f9400fe8 f90033e8 +0x000000012557626c: 9101c3e0 910123e1 910143e2 97fe7b85 +0x000000012557627c: 3941c3e8 71003d1f 54000b21 f9403ff4 +0x000000012557628c: 1400004d a940dbf5 f9400fe2 910143e0 + + +Stack slot to memory mapping: +stack at sp + 0 slots: 0x00000001066fa380: _ZTV11OopRecorder+0x10 in /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/server/libjvm.dylib at 0x0000000105b38000 +stack at sp + 1 slots: 0x0 is NULL +stack at sp + 2 slots: 0x0000000000000001 is an unknown value +stack at sp + 3 slots: 0x0 is NULL +stack at sp + 4 slots: 0x0 is NULL +stack at sp + 5 slots: 0x0 is NULL +stack at sp + 6 slots: 0x0 is NULL +stack at sp + 7 slots: 0x1e174ec9f05c0021 is an unknown value + + +--------------- P R O C E S S --------------- + +Threads class SMR info: +_java_thread_list=0x0000600000de7520, length=17, elements={ +0x000000013580a200, 0x0000000124816a00, 0x0000000124819200, 0x0000000134809800, +0x0000000124819800, 0x000000012481c000, 0x000000012481c600, 0x000000012481cc00, +0x0000000123010200, 0x000000013485ae00, 0x000000013485b400, 0x0000000135019e00, +0x000000013486d800, 0x00000001348a7c00, 0x0000000135009600, 0x000000012080ae00, +0x00000001369a0400 +} + +Java Threads: ( => current thread ) + 0x000000013580a200 JavaThread "Test worker" [_thread_blocked, id=8451, stack(0x000000016b864000,0x000000016ba67000)] + 0x0000000124816a00 JavaThread "Reference Handler" daemon [_thread_blocked, id=19715, stack(0x000000016c6b8000,0x000000016c8bb000)] + 0x0000000124819200 JavaThread "Finalizer" daemon [_thread_blocked, id=22019, stack(0x000000016c8c4000,0x000000016cac7000)] + 0x0000000134809800 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=30467, stack(0x000000016cbe8000,0x000000016cdeb000)] + 0x0000000124819800 JavaThread "Service Thread" daemon [_thread_blocked, id=23555, stack(0x000000016cdf4000,0x000000016cff7000)] + 0x000000012481c000 JavaThread "Monitor Deflation Thread" daemon [_thread_blocked, id=24067, stack(0x000000016d000000,0x000000016d203000)] + 0x000000012481c600 JavaThread "C2 CompilerThread0" daemon [_thread_blocked, id=30211, stack(0x000000016d20c000,0x000000016d40f000)] + 0x000000012481cc00 JavaThread "C1 CompilerThread0" daemon [_thread_blocked, id=24579, stack(0x000000016d418000,0x000000016d61b000)] + 0x0000000123010200 JavaThread "Sweeper thread" daemon [_thread_blocked, id=29443, stack(0x000000016d624000,0x000000016d827000)] + 0x000000013485ae00 JavaThread "Notification Thread" daemon [_thread_blocked, id=24835, stack(0x000000016d830000,0x000000016da33000)] + 0x000000013485b400 JavaThread "Common-Cleaner" daemon [_thread_blocked, id=25859, stack(0x000000016dc48000,0x000000016de4b000)] + 0x0000000135019e00 JavaThread "/127.0.0.1:63926 to /127.0.0.1:63925 workers" [_thread_blocked, id=28675, stack(0x000000016de54000,0x000000016e057000)] + 0x000000013486d800 JavaThread "/127.0.0.1:63926 to /127.0.0.1:63925 workers Thread 2" [_thread_blocked, id=26371, stack(0x000000016e060000,0x000000016e263000)] + 0x00000001348a7c00 JavaThread "/127.0.0.1:63926 to /127.0.0.1:63925 workers Thread 3" [_thread_in_native, id=26883, stack(0x000000016e26c000,0x000000016e46f000)] + 0x0000000135009600 JavaThread "C2 CompilerThread1" daemon [_thread_blocked, id=28419, stack(0x000000016e478000,0x000000016e67b000)] + 0x000000012080ae00 JavaThread "C2 CompilerThread2" daemon [_thread_blocked, id=34051, stack(0x000000016f6e4000,0x000000016f8e7000)] +=>0x00000001369a0400 JavaThread "ForkJoinPool.commonPool-worker-1" daemon [_thread_in_native, id=41219, stack(0x000000016f8f0000,0x000000016faf3000)] + +Other Threads: + 0x0000000134606af0 VMThread "VM Thread" [stack: 0x000000016c4ac000,0x000000016c6af000] [id=19203] + 0x0000000136209d60 WatcherThread [stack: 0x000000016da3c000,0x000000016dc3f000] [id=25347] + 0x00000001361061e0 GCTaskThread "GC Thread#0" [stack: 0x000000016ba70000,0x000000016bc73000] [id=12291] + 0x0000000136213d20 GCTaskThread "GC Thread#1" [stack: 0x000000016e684000,0x000000016e887000] [id=27907] + 0x00000001362141d0 GCTaskThread "GC Thread#2" [stack: 0x000000016e890000,0x000000016ea93000] [id=27395] + 0x0000000136214650 GCTaskThread "GC Thread#3" [stack: 0x000000016ea9c000,0x000000016ec9f000] [id=43267] + 0x0000000136214ad0 GCTaskThread "GC Thread#4" [stack: 0x000000016eca8000,0x000000016eeab000] [id=33283] + 0x0000000136214f50 GCTaskThread "GC Thread#5" [stack: 0x000000016eeb4000,0x000000016f0b7000] [id=42755] + 0x0000000134718e80 GCTaskThread "GC Thread#6" [stack: 0x000000016f0c0000,0x000000016f2c3000] [id=42243] + 0x0000000134719130 GCTaskThread "GC Thread#7" [stack: 0x000000016f2cc000,0x000000016f4cf000] [id=41731] + 0x00000001347195b0 GCTaskThread "GC Thread#8" [stack: 0x000000016f4d8000,0x000000016f6db000] [id=33795] + 0x0000000136106890 ConcurrentGCThread "G1 Main Marker" [stack: 0x000000016bc7c000,0x000000016be7f000] [id=12803] + 0x0000000136107110 ConcurrentGCThread "G1 Conc#0" [stack: 0x000000016be88000,0x000000016c08b000] [id=21507] + 0x0000000136109240 ConcurrentGCThread "G1 Refine#0" [stack: 0x000000016c094000,0x000000016c297000] [id=17155] + 0x0000000136109ae0 ConcurrentGCThread "G1 Service" [stack: 0x000000016c2a0000,0x000000016c4a3000] [id=17667] + +Threads with active compile tasks: + +VM state: not at safepoint (normal execution) + +VM Mutex/Monitor currently owned by a thread: None + +Heap address: 0x00000007e0000000, size: 512 MB, Compressed Oops mode: Zero based, Oop shift amount: 3 + +CDS archive(s) mapped at: [0x0000000800000000-0x0000000800bd4000-0x0000000800bd4000), size 12402688, SharedBaseAddress: 0x0000000800000000, ArchiveRelocationMode: 0. +Compressed class space mapped at: 0x0000000800c00000-0x0000000840c00000, reserved size: 1073741824 +Narrow klass base: 0x0000000800000000, Narrow klass shift: 0, Narrow klass range: 0x100000000 + +GC Precious Log: + CPUs: 10 total, 10 available + Memory: 65536M + Large Page Support: Disabled + NUMA Support: Disabled + Compressed Oops: Enabled (Zero based) + Heap Region Size: 1M + Heap Min Capacity: 8M + Heap Initial Capacity: 512M + Heap Max Capacity: 512M + Pre-touch: Disabled + Parallel Workers: 9 + Concurrent Workers: 2 + Concurrent Refinement Workers: 9 + Periodic GC: Disabled + +Heap: + garbage-first heap total 524288K, used 34274K [0x00000007e0000000, 0x0000000800000000) + region size 1024K, 33 young (33792K), 4 survivors (4096K) + Metaspace used 13769K, committed 14016K, reserved 1064960K + class space used 2154K, committed 2304K, reserved 1048576K + +Heap Regions: E=young(eden), S=young(survivor), O=old, HS=humongous(starts), HC=humongous(continues), CS=collection set, F=free, OA=open archive, CA=closed archive, TAMS=top-at-mark-start (previous, next) +| 0|0x00000007e0000000, 0x00000007e0080a00, 0x00000007e0100000| 50%| O| |TAMS 0x00000007e0000000, 0x00000007e0000000| Untracked +| 1|0x00000007e0100000, 0x00000007e0100000, 0x00000007e0200000| 0%| F| |TAMS 0x00000007e0100000, 0x00000007e0100000| Untracked +| 2|0x00000007e0200000, 0x00000007e0200000, 0x00000007e0300000| 0%| F| |TAMS 0x00000007e0200000, 0x00000007e0200000| Untracked +| 3|0x00000007e0300000, 0x00000007e0300000, 0x00000007e0400000| 0%| F| |TAMS 0x00000007e0300000, 0x00000007e0300000| Untracked +| 4|0x00000007e0400000, 0x00000007e0400000, 0x00000007e0500000| 0%| F| |TAMS 0x00000007e0400000, 0x00000007e0400000| Untracked +| 5|0x00000007e0500000, 0x00000007e0500000, 0x00000007e0600000| 0%| F| |TAMS 0x00000007e0500000, 0x00000007e0500000| Untracked +| 6|0x00000007e0600000, 0x00000007e0600000, 0x00000007e0700000| 0%| F| |TAMS 0x00000007e0600000, 0x00000007e0600000| Untracked +| 7|0x00000007e0700000, 0x00000007e0700000, 0x00000007e0800000| 0%| F| |TAMS 0x00000007e0700000, 0x00000007e0700000| Untracked +| 8|0x00000007e0800000, 0x00000007e0800000, 0x00000007e0900000| 0%| F| |TAMS 0x00000007e0800000, 0x00000007e0800000| Untracked +| 9|0x00000007e0900000, 0x00000007e0900000, 0x00000007e0a00000| 0%| F| |TAMS 0x00000007e0900000, 0x00000007e0900000| Untracked +| 10|0x00000007e0a00000, 0x00000007e0a00000, 0x00000007e0b00000| 0%| F| |TAMS 0x00000007e0a00000, 0x00000007e0a00000| Untracked +| 11|0x00000007e0b00000, 0x00000007e0b00000, 0x00000007e0c00000| 0%| F| |TAMS 0x00000007e0b00000, 0x00000007e0b00000| Untracked +| 12|0x00000007e0c00000, 0x00000007e0c00000, 0x00000007e0d00000| 0%| F| |TAMS 0x00000007e0c00000, 0x00000007e0c00000| Untracked +| 13|0x00000007e0d00000, 0x00000007e0d00000, 0x00000007e0e00000| 0%| F| |TAMS 0x00000007e0d00000, 0x00000007e0d00000| Untracked +| 14|0x00000007e0e00000, 0x00000007e0e00000, 0x00000007e0f00000| 0%| F| |TAMS 0x00000007e0e00000, 0x00000007e0e00000| Untracked +| 15|0x00000007e0f00000, 0x00000007e0f00000, 0x00000007e1000000| 0%| F| |TAMS 0x00000007e0f00000, 0x00000007e0f00000| Untracked +| 16|0x00000007e1000000, 0x00000007e1000000, 0x00000007e1100000| 0%| F| |TAMS 0x00000007e1000000, 0x00000007e1000000| Untracked +| 17|0x00000007e1100000, 0x00000007e1100000, 0x00000007e1200000| 0%| F| |TAMS 0x00000007e1100000, 0x00000007e1100000| Untracked +| 18|0x00000007e1200000, 0x00000007e1200000, 0x00000007e1300000| 0%| F| |TAMS 0x00000007e1200000, 0x00000007e1200000| Untracked +| 19|0x00000007e1300000, 0x00000007e1300000, 0x00000007e1400000| 0%| F| |TAMS 0x00000007e1300000, 0x00000007e1300000| Untracked +| 20|0x00000007e1400000, 0x00000007e1400000, 0x00000007e1500000| 0%| F| |TAMS 0x00000007e1400000, 0x00000007e1400000| Untracked +| 21|0x00000007e1500000, 0x00000007e1500000, 0x00000007e1600000| 0%| F| |TAMS 0x00000007e1500000, 0x00000007e1500000| Untracked +| 22|0x00000007e1600000, 0x00000007e1600000, 0x00000007e1700000| 0%| F| |TAMS 0x00000007e1600000, 0x00000007e1600000| Untracked +| 23|0x00000007e1700000, 0x00000007e1700000, 0x00000007e1800000| 0%| F| |TAMS 0x00000007e1700000, 0x00000007e1700000| Untracked +| 24|0x00000007e1800000, 0x00000007e1800000, 0x00000007e1900000| 0%| F| |TAMS 0x00000007e1800000, 0x00000007e1800000| Untracked +| 25|0x00000007e1900000, 0x00000007e1900000, 0x00000007e1a00000| 0%| F| |TAMS 0x00000007e1900000, 0x00000007e1900000| Untracked +| 26|0x00000007e1a00000, 0x00000007e1a00000, 0x00000007e1b00000| 0%| F| |TAMS 0x00000007e1a00000, 0x00000007e1a00000| Untracked +| 27|0x00000007e1b00000, 0x00000007e1b00000, 0x00000007e1c00000| 0%| F| |TAMS 0x00000007e1b00000, 0x00000007e1b00000| Untracked +| 28|0x00000007e1c00000, 0x00000007e1c00000, 0x00000007e1d00000| 0%| F| |TAMS 0x00000007e1c00000, 0x00000007e1c00000| Untracked +| 29|0x00000007e1d00000, 0x00000007e1d00000, 0x00000007e1e00000| 0%| F| |TAMS 0x00000007e1d00000, 0x00000007e1d00000| Untracked +| 30|0x00000007e1e00000, 0x00000007e1e00000, 0x00000007e1f00000| 0%| F| |TAMS 0x00000007e1e00000, 0x00000007e1e00000| Untracked +| 31|0x00000007e1f00000, 0x00000007e1f00000, 0x00000007e2000000| 0%| F| |TAMS 0x00000007e1f00000, 0x00000007e1f00000| Untracked +| 32|0x00000007e2000000, 0x00000007e2000000, 0x00000007e2100000| 0%| F| |TAMS 0x00000007e2000000, 0x00000007e2000000| Untracked +| 33|0x00000007e2100000, 0x00000007e2100000, 0x00000007e2200000| 0%| F| |TAMS 0x00000007e2100000, 0x00000007e2100000| Untracked +| 34|0x00000007e2200000, 0x00000007e2200000, 0x00000007e2300000| 0%| F| |TAMS 0x00000007e2200000, 0x00000007e2200000| Untracked +| 35|0x00000007e2300000, 0x00000007e2300000, 0x00000007e2400000| 0%| F| |TAMS 0x00000007e2300000, 0x00000007e2300000| Untracked +| 36|0x00000007e2400000, 0x00000007e2400000, 0x00000007e2500000| 0%| F| |TAMS 0x00000007e2400000, 0x00000007e2400000| Untracked +| 37|0x00000007e2500000, 0x00000007e2500000, 0x00000007e2600000| 0%| F| |TAMS 0x00000007e2500000, 0x00000007e2500000| Untracked +| 38|0x00000007e2600000, 0x00000007e2600000, 0x00000007e2700000| 0%| F| |TAMS 0x00000007e2600000, 0x00000007e2600000| Untracked +| 39|0x00000007e2700000, 0x00000007e2700000, 0x00000007e2800000| 0%| F| |TAMS 0x00000007e2700000, 0x00000007e2700000| Untracked +| 40|0x00000007e2800000, 0x00000007e2800000, 0x00000007e2900000| 0%| F| |TAMS 0x00000007e2800000, 0x00000007e2800000| Untracked +| 41|0x00000007e2900000, 0x00000007e2900000, 0x00000007e2a00000| 0%| F| |TAMS 0x00000007e2900000, 0x00000007e2900000| Untracked +| 42|0x00000007e2a00000, 0x00000007e2a00000, 0x00000007e2b00000| 0%| F| |TAMS 0x00000007e2a00000, 0x00000007e2a00000| Untracked +| 43|0x00000007e2b00000, 0x00000007e2b00000, 0x00000007e2c00000| 0%| F| |TAMS 0x00000007e2b00000, 0x00000007e2b00000| Untracked +| 44|0x00000007e2c00000, 0x00000007e2c00000, 0x00000007e2d00000| 0%| F| |TAMS 0x00000007e2c00000, 0x00000007e2c00000| Untracked +| 45|0x00000007e2d00000, 0x00000007e2d00000, 0x00000007e2e00000| 0%| F| |TAMS 0x00000007e2d00000, 0x00000007e2d00000| Untracked +| 46|0x00000007e2e00000, 0x00000007e2e00000, 0x00000007e2f00000| 0%| F| |TAMS 0x00000007e2e00000, 0x00000007e2e00000| Untracked +| 47|0x00000007e2f00000, 0x00000007e2f00000, 0x00000007e3000000| 0%| F| |TAMS 0x00000007e2f00000, 0x00000007e2f00000| Untracked +| 48|0x00000007e3000000, 0x00000007e3000000, 0x00000007e3100000| 0%| F| |TAMS 0x00000007e3000000, 0x00000007e3000000| Untracked +| 49|0x00000007e3100000, 0x00000007e3100000, 0x00000007e3200000| 0%| F| |TAMS 0x00000007e3100000, 0x00000007e3100000| Untracked +| 50|0x00000007e3200000, 0x00000007e3200000, 0x00000007e3300000| 0%| F| |TAMS 0x00000007e3200000, 0x00000007e3200000| Untracked +| 51|0x00000007e3300000, 0x00000007e3300000, 0x00000007e3400000| 0%| F| |TAMS 0x00000007e3300000, 0x00000007e3300000| Untracked +| 52|0x00000007e3400000, 0x00000007e3400000, 0x00000007e3500000| 0%| F| |TAMS 0x00000007e3400000, 0x00000007e3400000| Untracked +| 53|0x00000007e3500000, 0x00000007e3500000, 0x00000007e3600000| 0%| F| |TAMS 0x00000007e3500000, 0x00000007e3500000| Untracked +| 54|0x00000007e3600000, 0x00000007e3600000, 0x00000007e3700000| 0%| F| |TAMS 0x00000007e3600000, 0x00000007e3600000| Untracked +| 55|0x00000007e3700000, 0x00000007e3700000, 0x00000007e3800000| 0%| F| |TAMS 0x00000007e3700000, 0x00000007e3700000| Untracked +| 56|0x00000007e3800000, 0x00000007e3800000, 0x00000007e3900000| 0%| F| |TAMS 0x00000007e3800000, 0x00000007e3800000| Untracked +| 57|0x00000007e3900000, 0x00000007e3900000, 0x00000007e3a00000| 0%| F| |TAMS 0x00000007e3900000, 0x00000007e3900000| Untracked +| 58|0x00000007e3a00000, 0x00000007e3a00000, 0x00000007e3b00000| 0%| F| |TAMS 0x00000007e3a00000, 0x00000007e3a00000| Untracked +| 59|0x00000007e3b00000, 0x00000007e3b00000, 0x00000007e3c00000| 0%| F| |TAMS 0x00000007e3b00000, 0x00000007e3b00000| Untracked +| 60|0x00000007e3c00000, 0x00000007e3c00000, 0x00000007e3d00000| 0%| F| |TAMS 0x00000007e3c00000, 0x00000007e3c00000| Untracked +| 61|0x00000007e3d00000, 0x00000007e3d00000, 0x00000007e3e00000| 0%| F| |TAMS 0x00000007e3d00000, 0x00000007e3d00000| Untracked +| 62|0x00000007e3e00000, 0x00000007e3e00000, 0x00000007e3f00000| 0%| F| |TAMS 0x00000007e3e00000, 0x00000007e3e00000| Untracked +| 63|0x00000007e3f00000, 0x00000007e3f00000, 0x00000007e4000000| 0%| F| |TAMS 0x00000007e3f00000, 0x00000007e3f00000| Untracked +| 64|0x00000007e4000000, 0x00000007e4000000, 0x00000007e4100000| 0%| F| |TAMS 0x00000007e4000000, 0x00000007e4000000| Untracked +| 65|0x00000007e4100000, 0x00000007e4100000, 0x00000007e4200000| 0%| F| |TAMS 0x00000007e4100000, 0x00000007e4100000| Untracked +| 66|0x00000007e4200000, 0x00000007e4200000, 0x00000007e4300000| 0%| F| |TAMS 0x00000007e4200000, 0x00000007e4200000| Untracked +| 67|0x00000007e4300000, 0x00000007e4300000, 0x00000007e4400000| 0%| F| |TAMS 0x00000007e4300000, 0x00000007e4300000| Untracked +| 68|0x00000007e4400000, 0x00000007e4400000, 0x00000007e4500000| 0%| F| |TAMS 0x00000007e4400000, 0x00000007e4400000| Untracked +| 69|0x00000007e4500000, 0x00000007e4500000, 0x00000007e4600000| 0%| F| |TAMS 0x00000007e4500000, 0x00000007e4500000| Untracked +| 70|0x00000007e4600000, 0x00000007e4600000, 0x00000007e4700000| 0%| F| |TAMS 0x00000007e4600000, 0x00000007e4600000| Untracked +| 71|0x00000007e4700000, 0x00000007e4700000, 0x00000007e4800000| 0%| F| |TAMS 0x00000007e4700000, 0x00000007e4700000| Untracked +| 72|0x00000007e4800000, 0x00000007e4800000, 0x00000007e4900000| 0%| F| |TAMS 0x00000007e4800000, 0x00000007e4800000| Untracked +| 73|0x00000007e4900000, 0x00000007e4900000, 0x00000007e4a00000| 0%| F| |TAMS 0x00000007e4900000, 0x00000007e4900000| Untracked +| 74|0x00000007e4a00000, 0x00000007e4a00000, 0x00000007e4b00000| 0%| F| |TAMS 0x00000007e4a00000, 0x00000007e4a00000| Untracked +| 75|0x00000007e4b00000, 0x00000007e4b00000, 0x00000007e4c00000| 0%| F| |TAMS 0x00000007e4b00000, 0x00000007e4b00000| Untracked +| 76|0x00000007e4c00000, 0x00000007e4c00000, 0x00000007e4d00000| 0%| F| |TAMS 0x00000007e4c00000, 0x00000007e4c00000| Untracked +| 77|0x00000007e4d00000, 0x00000007e4d00000, 0x00000007e4e00000| 0%| F| |TAMS 0x00000007e4d00000, 0x00000007e4d00000| Untracked +| 78|0x00000007e4e00000, 0x00000007e4e00000, 0x00000007e4f00000| 0%| F| |TAMS 0x00000007e4e00000, 0x00000007e4e00000| Untracked +| 79|0x00000007e4f00000, 0x00000007e4f00000, 0x00000007e5000000| 0%| F| |TAMS 0x00000007e4f00000, 0x00000007e4f00000| Untracked +| 80|0x00000007e5000000, 0x00000007e5000000, 0x00000007e5100000| 0%| F| |TAMS 0x00000007e5000000, 0x00000007e5000000| Untracked +| 81|0x00000007e5100000, 0x00000007e5100000, 0x00000007e5200000| 0%| F| |TAMS 0x00000007e5100000, 0x00000007e5100000| Untracked +| 82|0x00000007e5200000, 0x00000007e5200000, 0x00000007e5300000| 0%| F| |TAMS 0x00000007e5200000, 0x00000007e5200000| Untracked +| 83|0x00000007e5300000, 0x00000007e5300000, 0x00000007e5400000| 0%| F| |TAMS 0x00000007e5300000, 0x00000007e5300000| Untracked +| 84|0x00000007e5400000, 0x00000007e5400000, 0x00000007e5500000| 0%| F| |TAMS 0x00000007e5400000, 0x00000007e5400000| Untracked +| 85|0x00000007e5500000, 0x00000007e5500000, 0x00000007e5600000| 0%| F| |TAMS 0x00000007e5500000, 0x00000007e5500000| Untracked +| 86|0x00000007e5600000, 0x00000007e5600000, 0x00000007e5700000| 0%| F| |TAMS 0x00000007e5600000, 0x00000007e5600000| Untracked +| 87|0x00000007e5700000, 0x00000007e5700000, 0x00000007e5800000| 0%| F| |TAMS 0x00000007e5700000, 0x00000007e5700000| Untracked +| 88|0x00000007e5800000, 0x00000007e5800000, 0x00000007e5900000| 0%| F| |TAMS 0x00000007e5800000, 0x00000007e5800000| Untracked +| 89|0x00000007e5900000, 0x00000007e5900000, 0x00000007e5a00000| 0%| F| |TAMS 0x00000007e5900000, 0x00000007e5900000| Untracked +| 90|0x00000007e5a00000, 0x00000007e5a00000, 0x00000007e5b00000| 0%| F| |TAMS 0x00000007e5a00000, 0x00000007e5a00000| Untracked +| 91|0x00000007e5b00000, 0x00000007e5b00000, 0x00000007e5c00000| 0%| F| |TAMS 0x00000007e5b00000, 0x00000007e5b00000| Untracked +| 92|0x00000007e5c00000, 0x00000007e5c00000, 0x00000007e5d00000| 0%| F| |TAMS 0x00000007e5c00000, 0x00000007e5c00000| Untracked +| 93|0x00000007e5d00000, 0x00000007e5d00000, 0x00000007e5e00000| 0%| F| |TAMS 0x00000007e5d00000, 0x00000007e5d00000| Untracked +| 94|0x00000007e5e00000, 0x00000007e5e00000, 0x00000007e5f00000| 0%| F| |TAMS 0x00000007e5e00000, 0x00000007e5e00000| Untracked +| 95|0x00000007e5f00000, 0x00000007e5f00000, 0x00000007e6000000| 0%| F| |TAMS 0x00000007e5f00000, 0x00000007e5f00000| Untracked +| 96|0x00000007e6000000, 0x00000007e6000000, 0x00000007e6100000| 0%| F| |TAMS 0x00000007e6000000, 0x00000007e6000000| Untracked +| 97|0x00000007e6100000, 0x00000007e6100000, 0x00000007e6200000| 0%| F| |TAMS 0x00000007e6100000, 0x00000007e6100000| Untracked +| 98|0x00000007e6200000, 0x00000007e6200000, 0x00000007e6300000| 0%| F| |TAMS 0x00000007e6200000, 0x00000007e6200000| Untracked +| 99|0x00000007e6300000, 0x00000007e6300000, 0x00000007e6400000| 0%| F| |TAMS 0x00000007e6300000, 0x00000007e6300000| Untracked +| 100|0x00000007e6400000, 0x00000007e6400000, 0x00000007e6500000| 0%| F| |TAMS 0x00000007e6400000, 0x00000007e6400000| Untracked +| 101|0x00000007e6500000, 0x00000007e6500000, 0x00000007e6600000| 0%| F| |TAMS 0x00000007e6500000, 0x00000007e6500000| Untracked +| 102|0x00000007e6600000, 0x00000007e6600000, 0x00000007e6700000| 0%| F| |TAMS 0x00000007e6600000, 0x00000007e6600000| Untracked +| 103|0x00000007e6700000, 0x00000007e6700000, 0x00000007e6800000| 0%| F| |TAMS 0x00000007e6700000, 0x00000007e6700000| Untracked +| 104|0x00000007e6800000, 0x00000007e6800000, 0x00000007e6900000| 0%| F| |TAMS 0x00000007e6800000, 0x00000007e6800000| Untracked +| 105|0x00000007e6900000, 0x00000007e6900000, 0x00000007e6a00000| 0%| F| |TAMS 0x00000007e6900000, 0x00000007e6900000| Untracked +| 106|0x00000007e6a00000, 0x00000007e6a00000, 0x00000007e6b00000| 0%| F| |TAMS 0x00000007e6a00000, 0x00000007e6a00000| Untracked +| 107|0x00000007e6b00000, 0x00000007e6b00000, 0x00000007e6c00000| 0%| F| |TAMS 0x00000007e6b00000, 0x00000007e6b00000| Untracked +| 108|0x00000007e6c00000, 0x00000007e6c00000, 0x00000007e6d00000| 0%| F| |TAMS 0x00000007e6c00000, 0x00000007e6c00000| Untracked +| 109|0x00000007e6d00000, 0x00000007e6d00000, 0x00000007e6e00000| 0%| F| |TAMS 0x00000007e6d00000, 0x00000007e6d00000| Untracked +| 110|0x00000007e6e00000, 0x00000007e6e00000, 0x00000007e6f00000| 0%| F| |TAMS 0x00000007e6e00000, 0x00000007e6e00000| Untracked +| 111|0x00000007e6f00000, 0x00000007e6f00000, 0x00000007e7000000| 0%| F| |TAMS 0x00000007e6f00000, 0x00000007e6f00000| Untracked +| 112|0x00000007e7000000, 0x00000007e7000000, 0x00000007e7100000| 0%| F| |TAMS 0x00000007e7000000, 0x00000007e7000000| Untracked +| 113|0x00000007e7100000, 0x00000007e7100000, 0x00000007e7200000| 0%| F| |TAMS 0x00000007e7100000, 0x00000007e7100000| Untracked +| 114|0x00000007e7200000, 0x00000007e7200000, 0x00000007e7300000| 0%| F| |TAMS 0x00000007e7200000, 0x00000007e7200000| Untracked +| 115|0x00000007e7300000, 0x00000007e7300000, 0x00000007e7400000| 0%| F| |TAMS 0x00000007e7300000, 0x00000007e7300000| Untracked +| 116|0x00000007e7400000, 0x00000007e7400000, 0x00000007e7500000| 0%| F| |TAMS 0x00000007e7400000, 0x00000007e7400000| Untracked +| 117|0x00000007e7500000, 0x00000007e7500000, 0x00000007e7600000| 0%| F| |TAMS 0x00000007e7500000, 0x00000007e7500000| Untracked +| 118|0x00000007e7600000, 0x00000007e7600000, 0x00000007e7700000| 0%| F| |TAMS 0x00000007e7600000, 0x00000007e7600000| Untracked +| 119|0x00000007e7700000, 0x00000007e7700000, 0x00000007e7800000| 0%| F| |TAMS 0x00000007e7700000, 0x00000007e7700000| Untracked +| 120|0x00000007e7800000, 0x00000007e7800000, 0x00000007e7900000| 0%| F| |TAMS 0x00000007e7800000, 0x00000007e7800000| Untracked +| 121|0x00000007e7900000, 0x00000007e7900000, 0x00000007e7a00000| 0%| F| |TAMS 0x00000007e7900000, 0x00000007e7900000| Untracked +| 122|0x00000007e7a00000, 0x00000007e7a00000, 0x00000007e7b00000| 0%| F| |TAMS 0x00000007e7a00000, 0x00000007e7a00000| Untracked +| 123|0x00000007e7b00000, 0x00000007e7b00000, 0x00000007e7c00000| 0%| F| |TAMS 0x00000007e7b00000, 0x00000007e7b00000| Untracked +| 124|0x00000007e7c00000, 0x00000007e7c00000, 0x00000007e7d00000| 0%| F| |TAMS 0x00000007e7c00000, 0x00000007e7c00000| Untracked +| 125|0x00000007e7d00000, 0x00000007e7d00000, 0x00000007e7e00000| 0%| F| |TAMS 0x00000007e7d00000, 0x00000007e7d00000| Untracked +| 126|0x00000007e7e00000, 0x00000007e7e00000, 0x00000007e7f00000| 0%| F| |TAMS 0x00000007e7e00000, 0x00000007e7e00000| Untracked +| 127|0x00000007e7f00000, 0x00000007e7f00000, 0x00000007e8000000| 0%| F| |TAMS 0x00000007e7f00000, 0x00000007e7f00000| Untracked +| 128|0x00000007e8000000, 0x00000007e8000000, 0x00000007e8100000| 0%| F| |TAMS 0x00000007e8000000, 0x00000007e8000000| Untracked +| 129|0x00000007e8100000, 0x00000007e8100000, 0x00000007e8200000| 0%| F| |TAMS 0x00000007e8100000, 0x00000007e8100000| Untracked +| 130|0x00000007e8200000, 0x00000007e8200000, 0x00000007e8300000| 0%| F| |TAMS 0x00000007e8200000, 0x00000007e8200000| Untracked +| 131|0x00000007e8300000, 0x00000007e8300000, 0x00000007e8400000| 0%| F| |TAMS 0x00000007e8300000, 0x00000007e8300000| Untracked +| 132|0x00000007e8400000, 0x00000007e8400000, 0x00000007e8500000| 0%| F| |TAMS 0x00000007e8400000, 0x00000007e8400000| Untracked +| 133|0x00000007e8500000, 0x00000007e8500000, 0x00000007e8600000| 0%| F| |TAMS 0x00000007e8500000, 0x00000007e8500000| Untracked +| 134|0x00000007e8600000, 0x00000007e8600000, 0x00000007e8700000| 0%| F| |TAMS 0x00000007e8600000, 0x00000007e8600000| Untracked +| 135|0x00000007e8700000, 0x00000007e8700000, 0x00000007e8800000| 0%| F| |TAMS 0x00000007e8700000, 0x00000007e8700000| Untracked +| 136|0x00000007e8800000, 0x00000007e8800000, 0x00000007e8900000| 0%| F| |TAMS 0x00000007e8800000, 0x00000007e8800000| Untracked +| 137|0x00000007e8900000, 0x00000007e8900000, 0x00000007e8a00000| 0%| F| |TAMS 0x00000007e8900000, 0x00000007e8900000| Untracked +| 138|0x00000007e8a00000, 0x00000007e8a00000, 0x00000007e8b00000| 0%| F| |TAMS 0x00000007e8a00000, 0x00000007e8a00000| Untracked +| 139|0x00000007e8b00000, 0x00000007e8b00000, 0x00000007e8c00000| 0%| F| |TAMS 0x00000007e8b00000, 0x00000007e8b00000| Untracked +| 140|0x00000007e8c00000, 0x00000007e8c00000, 0x00000007e8d00000| 0%| F| |TAMS 0x00000007e8c00000, 0x00000007e8c00000| Untracked +| 141|0x00000007e8d00000, 0x00000007e8d00000, 0x00000007e8e00000| 0%| F| |TAMS 0x00000007e8d00000, 0x00000007e8d00000| Untracked +| 142|0x00000007e8e00000, 0x00000007e8e00000, 0x00000007e8f00000| 0%| F| |TAMS 0x00000007e8e00000, 0x00000007e8e00000| Untracked +| 143|0x00000007e8f00000, 0x00000007e8f00000, 0x00000007e9000000| 0%| F| |TAMS 0x00000007e8f00000, 0x00000007e8f00000| Untracked +| 144|0x00000007e9000000, 0x00000007e9000000, 0x00000007e9100000| 0%| F| |TAMS 0x00000007e9000000, 0x00000007e9000000| Untracked +| 145|0x00000007e9100000, 0x00000007e9100000, 0x00000007e9200000| 0%| F| |TAMS 0x00000007e9100000, 0x00000007e9100000| Untracked +| 146|0x00000007e9200000, 0x00000007e9200000, 0x00000007e9300000| 0%| F| |TAMS 0x00000007e9200000, 0x00000007e9200000| Untracked +| 147|0x00000007e9300000, 0x00000007e9300000, 0x00000007e9400000| 0%| F| |TAMS 0x00000007e9300000, 0x00000007e9300000| Untracked +| 148|0x00000007e9400000, 0x00000007e9400000, 0x00000007e9500000| 0%| F| |TAMS 0x00000007e9400000, 0x00000007e9400000| Untracked +| 149|0x00000007e9500000, 0x00000007e9500000, 0x00000007e9600000| 0%| F| |TAMS 0x00000007e9500000, 0x00000007e9500000| Untracked +| 150|0x00000007e9600000, 0x00000007e9600000, 0x00000007e9700000| 0%| F| |TAMS 0x00000007e9600000, 0x00000007e9600000| Untracked +| 151|0x00000007e9700000, 0x00000007e9700000, 0x00000007e9800000| 0%| F| |TAMS 0x00000007e9700000, 0x00000007e9700000| Untracked +| 152|0x00000007e9800000, 0x00000007e9800000, 0x00000007e9900000| 0%| F| |TAMS 0x00000007e9800000, 0x00000007e9800000| Untracked +| 153|0x00000007e9900000, 0x00000007e9900000, 0x00000007e9a00000| 0%| F| |TAMS 0x00000007e9900000, 0x00000007e9900000| Untracked +| 154|0x00000007e9a00000, 0x00000007e9a00000, 0x00000007e9b00000| 0%| F| |TAMS 0x00000007e9a00000, 0x00000007e9a00000| Untracked +| 155|0x00000007e9b00000, 0x00000007e9b00000, 0x00000007e9c00000| 0%| F| |TAMS 0x00000007e9b00000, 0x00000007e9b00000| Untracked +| 156|0x00000007e9c00000, 0x00000007e9c00000, 0x00000007e9d00000| 0%| F| |TAMS 0x00000007e9c00000, 0x00000007e9c00000| Untracked +| 157|0x00000007e9d00000, 0x00000007e9d00000, 0x00000007e9e00000| 0%| F| |TAMS 0x00000007e9d00000, 0x00000007e9d00000| Untracked +| 158|0x00000007e9e00000, 0x00000007e9e00000, 0x00000007e9f00000| 0%| F| |TAMS 0x00000007e9e00000, 0x00000007e9e00000| Untracked +| 159|0x00000007e9f00000, 0x00000007e9f00000, 0x00000007ea000000| 0%| F| |TAMS 0x00000007e9f00000, 0x00000007e9f00000| Untracked +| 160|0x00000007ea000000, 0x00000007ea000000, 0x00000007ea100000| 0%| F| |TAMS 0x00000007ea000000, 0x00000007ea000000| Untracked +| 161|0x00000007ea100000, 0x00000007ea100000, 0x00000007ea200000| 0%| F| |TAMS 0x00000007ea100000, 0x00000007ea100000| Untracked +| 162|0x00000007ea200000, 0x00000007ea200000, 0x00000007ea300000| 0%| F| |TAMS 0x00000007ea200000, 0x00000007ea200000| Untracked +| 163|0x00000007ea300000, 0x00000007ea300000, 0x00000007ea400000| 0%| F| |TAMS 0x00000007ea300000, 0x00000007ea300000| Untracked +| 164|0x00000007ea400000, 0x00000007ea400000, 0x00000007ea500000| 0%| F| |TAMS 0x00000007ea400000, 0x00000007ea400000| Untracked +| 165|0x00000007ea500000, 0x00000007ea500000, 0x00000007ea600000| 0%| F| |TAMS 0x00000007ea500000, 0x00000007ea500000| Untracked +| 166|0x00000007ea600000, 0x00000007ea600000, 0x00000007ea700000| 0%| F| |TAMS 0x00000007ea600000, 0x00000007ea600000| Untracked +| 167|0x00000007ea700000, 0x00000007ea700000, 0x00000007ea800000| 0%| F| |TAMS 0x00000007ea700000, 0x00000007ea700000| Untracked +| 168|0x00000007ea800000, 0x00000007ea800000, 0x00000007ea900000| 0%| F| |TAMS 0x00000007ea800000, 0x00000007ea800000| Untracked +| 169|0x00000007ea900000, 0x00000007ea900000, 0x00000007eaa00000| 0%| F| |TAMS 0x00000007ea900000, 0x00000007ea900000| Untracked +| 170|0x00000007eaa00000, 0x00000007eaa00000, 0x00000007eab00000| 0%| F| |TAMS 0x00000007eaa00000, 0x00000007eaa00000| Untracked +| 171|0x00000007eab00000, 0x00000007eab00000, 0x00000007eac00000| 0%| F| |TAMS 0x00000007eab00000, 0x00000007eab00000| Untracked +| 172|0x00000007eac00000, 0x00000007eac00000, 0x00000007ead00000| 0%| F| |TAMS 0x00000007eac00000, 0x00000007eac00000| Untracked +| 173|0x00000007ead00000, 0x00000007ead00000, 0x00000007eae00000| 0%| F| |TAMS 0x00000007ead00000, 0x00000007ead00000| Untracked +| 174|0x00000007eae00000, 0x00000007eae00000, 0x00000007eaf00000| 0%| F| |TAMS 0x00000007eae00000, 0x00000007eae00000| Untracked +| 175|0x00000007eaf00000, 0x00000007eaf00000, 0x00000007eb000000| 0%| F| |TAMS 0x00000007eaf00000, 0x00000007eaf00000| Untracked +| 176|0x00000007eb000000, 0x00000007eb000000, 0x00000007eb100000| 0%| F| |TAMS 0x00000007eb000000, 0x00000007eb000000| Untracked +| 177|0x00000007eb100000, 0x00000007eb100000, 0x00000007eb200000| 0%| F| |TAMS 0x00000007eb100000, 0x00000007eb100000| Untracked +| 178|0x00000007eb200000, 0x00000007eb200000, 0x00000007eb300000| 0%| F| |TAMS 0x00000007eb200000, 0x00000007eb200000| Untracked +| 179|0x00000007eb300000, 0x00000007eb300000, 0x00000007eb400000| 0%| F| |TAMS 0x00000007eb300000, 0x00000007eb300000| Untracked +| 180|0x00000007eb400000, 0x00000007eb400000, 0x00000007eb500000| 0%| F| |TAMS 0x00000007eb400000, 0x00000007eb400000| Untracked +| 181|0x00000007eb500000, 0x00000007eb500000, 0x00000007eb600000| 0%| F| |TAMS 0x00000007eb500000, 0x00000007eb500000| Untracked +| 182|0x00000007eb600000, 0x00000007eb600000, 0x00000007eb700000| 0%| F| |TAMS 0x00000007eb600000, 0x00000007eb600000| Untracked +| 183|0x00000007eb700000, 0x00000007eb700000, 0x00000007eb800000| 0%| F| |TAMS 0x00000007eb700000, 0x00000007eb700000| Untracked +| 184|0x00000007eb800000, 0x00000007eb800000, 0x00000007eb900000| 0%| F| |TAMS 0x00000007eb800000, 0x00000007eb800000| Untracked +| 185|0x00000007eb900000, 0x00000007eb900000, 0x00000007eba00000| 0%| F| |TAMS 0x00000007eb900000, 0x00000007eb900000| Untracked +| 186|0x00000007eba00000, 0x00000007eba00000, 0x00000007ebb00000| 0%| F| |TAMS 0x00000007eba00000, 0x00000007eba00000| Untracked +| 187|0x00000007ebb00000, 0x00000007ebb00000, 0x00000007ebc00000| 0%| F| |TAMS 0x00000007ebb00000, 0x00000007ebb00000| Untracked +| 188|0x00000007ebc00000, 0x00000007ebc00000, 0x00000007ebd00000| 0%| F| |TAMS 0x00000007ebc00000, 0x00000007ebc00000| Untracked +| 189|0x00000007ebd00000, 0x00000007ebd00000, 0x00000007ebe00000| 0%| F| |TAMS 0x00000007ebd00000, 0x00000007ebd00000| Untracked +| 190|0x00000007ebe00000, 0x00000007ebe00000, 0x00000007ebf00000| 0%| F| |TAMS 0x00000007ebe00000, 0x00000007ebe00000| Untracked +| 191|0x00000007ebf00000, 0x00000007ebf00000, 0x00000007ec000000| 0%| F| |TAMS 0x00000007ebf00000, 0x00000007ebf00000| Untracked +| 192|0x00000007ec000000, 0x00000007ec000000, 0x00000007ec100000| 0%| F| |TAMS 0x00000007ec000000, 0x00000007ec000000| Untracked +| 193|0x00000007ec100000, 0x00000007ec100000, 0x00000007ec200000| 0%| F| |TAMS 0x00000007ec100000, 0x00000007ec100000| Untracked +| 194|0x00000007ec200000, 0x00000007ec200000, 0x00000007ec300000| 0%| F| |TAMS 0x00000007ec200000, 0x00000007ec200000| Untracked +| 195|0x00000007ec300000, 0x00000007ec300000, 0x00000007ec400000| 0%| F| |TAMS 0x00000007ec300000, 0x00000007ec300000| Untracked +| 196|0x00000007ec400000, 0x00000007ec400000, 0x00000007ec500000| 0%| F| |TAMS 0x00000007ec400000, 0x00000007ec400000| Untracked +| 197|0x00000007ec500000, 0x00000007ec500000, 0x00000007ec600000| 0%| F| |TAMS 0x00000007ec500000, 0x00000007ec500000| Untracked +| 198|0x00000007ec600000, 0x00000007ec600000, 0x00000007ec700000| 0%| F| |TAMS 0x00000007ec600000, 0x00000007ec600000| Untracked +| 199|0x00000007ec700000, 0x00000007ec700000, 0x00000007ec800000| 0%| F| |TAMS 0x00000007ec700000, 0x00000007ec700000| Untracked +| 200|0x00000007ec800000, 0x00000007ec800000, 0x00000007ec900000| 0%| F| |TAMS 0x00000007ec800000, 0x00000007ec800000| Untracked +| 201|0x00000007ec900000, 0x00000007ec900000, 0x00000007eca00000| 0%| F| |TAMS 0x00000007ec900000, 0x00000007ec900000| Untracked +| 202|0x00000007eca00000, 0x00000007eca00000, 0x00000007ecb00000| 0%| F| |TAMS 0x00000007eca00000, 0x00000007eca00000| Untracked +| 203|0x00000007ecb00000, 0x00000007ecb00000, 0x00000007ecc00000| 0%| F| |TAMS 0x00000007ecb00000, 0x00000007ecb00000| Untracked +| 204|0x00000007ecc00000, 0x00000007ecc00000, 0x00000007ecd00000| 0%| F| |TAMS 0x00000007ecc00000, 0x00000007ecc00000| Untracked +| 205|0x00000007ecd00000, 0x00000007ecd00000, 0x00000007ece00000| 0%| F| |TAMS 0x00000007ecd00000, 0x00000007ecd00000| Untracked +| 206|0x00000007ece00000, 0x00000007ece00000, 0x00000007ecf00000| 0%| F| |TAMS 0x00000007ece00000, 0x00000007ece00000| Untracked +| 207|0x00000007ecf00000, 0x00000007ecf00000, 0x00000007ed000000| 0%| F| |TAMS 0x00000007ecf00000, 0x00000007ecf00000| Untracked +| 208|0x00000007ed000000, 0x00000007ed000000, 0x00000007ed100000| 0%| F| |TAMS 0x00000007ed000000, 0x00000007ed000000| Untracked +| 209|0x00000007ed100000, 0x00000007ed100000, 0x00000007ed200000| 0%| F| |TAMS 0x00000007ed100000, 0x00000007ed100000| Untracked +| 210|0x00000007ed200000, 0x00000007ed200000, 0x00000007ed300000| 0%| F| |TAMS 0x00000007ed200000, 0x00000007ed200000| Untracked +| 211|0x00000007ed300000, 0x00000007ed300000, 0x00000007ed400000| 0%| F| |TAMS 0x00000007ed300000, 0x00000007ed300000| Untracked +| 212|0x00000007ed400000, 0x00000007ed400000, 0x00000007ed500000| 0%| F| |TAMS 0x00000007ed400000, 0x00000007ed400000| Untracked +| 213|0x00000007ed500000, 0x00000007ed500000, 0x00000007ed600000| 0%| F| |TAMS 0x00000007ed500000, 0x00000007ed500000| Untracked +| 214|0x00000007ed600000, 0x00000007ed600000, 0x00000007ed700000| 0%| F| |TAMS 0x00000007ed600000, 0x00000007ed600000| Untracked +| 215|0x00000007ed700000, 0x00000007ed700000, 0x00000007ed800000| 0%| F| |TAMS 0x00000007ed700000, 0x00000007ed700000| Untracked +| 216|0x00000007ed800000, 0x00000007ed800000, 0x00000007ed900000| 0%| F| |TAMS 0x00000007ed800000, 0x00000007ed800000| Untracked +| 217|0x00000007ed900000, 0x00000007ed900000, 0x00000007eda00000| 0%| F| |TAMS 0x00000007ed900000, 0x00000007ed900000| Untracked +| 218|0x00000007eda00000, 0x00000007eda00000, 0x00000007edb00000| 0%| F| |TAMS 0x00000007eda00000, 0x00000007eda00000| Untracked +| 219|0x00000007edb00000, 0x00000007edb00000, 0x00000007edc00000| 0%| F| |TAMS 0x00000007edb00000, 0x00000007edb00000| Untracked +| 220|0x00000007edc00000, 0x00000007edc00000, 0x00000007edd00000| 0%| F| |TAMS 0x00000007edc00000, 0x00000007edc00000| Untracked +| 221|0x00000007edd00000, 0x00000007edd00000, 0x00000007ede00000| 0%| F| |TAMS 0x00000007edd00000, 0x00000007edd00000| Untracked +| 222|0x00000007ede00000, 0x00000007ede00000, 0x00000007edf00000| 0%| F| |TAMS 0x00000007ede00000, 0x00000007ede00000| Untracked +| 223|0x00000007edf00000, 0x00000007edf00000, 0x00000007ee000000| 0%| F| |TAMS 0x00000007edf00000, 0x00000007edf00000| Untracked +| 224|0x00000007ee000000, 0x00000007ee000000, 0x00000007ee100000| 0%| F| |TAMS 0x00000007ee000000, 0x00000007ee000000| Untracked +| 225|0x00000007ee100000, 0x00000007ee100000, 0x00000007ee200000| 0%| F| |TAMS 0x00000007ee100000, 0x00000007ee100000| Untracked +| 226|0x00000007ee200000, 0x00000007ee200000, 0x00000007ee300000| 0%| F| |TAMS 0x00000007ee200000, 0x00000007ee200000| Untracked +| 227|0x00000007ee300000, 0x00000007ee300000, 0x00000007ee400000| 0%| F| |TAMS 0x00000007ee300000, 0x00000007ee300000| Untracked +| 228|0x00000007ee400000, 0x00000007ee400000, 0x00000007ee500000| 0%| F| |TAMS 0x00000007ee400000, 0x00000007ee400000| Untracked +| 229|0x00000007ee500000, 0x00000007ee500000, 0x00000007ee600000| 0%| F| |TAMS 0x00000007ee500000, 0x00000007ee500000| Untracked +| 230|0x00000007ee600000, 0x00000007ee600000, 0x00000007ee700000| 0%| F| |TAMS 0x00000007ee600000, 0x00000007ee600000| Untracked +| 231|0x00000007ee700000, 0x00000007ee700000, 0x00000007ee800000| 0%| F| |TAMS 0x00000007ee700000, 0x00000007ee700000| Untracked +| 232|0x00000007ee800000, 0x00000007ee800000, 0x00000007ee900000| 0%| F| |TAMS 0x00000007ee800000, 0x00000007ee800000| Untracked +| 233|0x00000007ee900000, 0x00000007ee900000, 0x00000007eea00000| 0%| F| |TAMS 0x00000007ee900000, 0x00000007ee900000| Untracked +| 234|0x00000007eea00000, 0x00000007eea00000, 0x00000007eeb00000| 0%| F| |TAMS 0x00000007eea00000, 0x00000007eea00000| Untracked +| 235|0x00000007eeb00000, 0x00000007eeb00000, 0x00000007eec00000| 0%| F| |TAMS 0x00000007eeb00000, 0x00000007eeb00000| Untracked +| 236|0x00000007eec00000, 0x00000007eec00000, 0x00000007eed00000| 0%| F| |TAMS 0x00000007eec00000, 0x00000007eec00000| Untracked +| 237|0x00000007eed00000, 0x00000007eed00000, 0x00000007eee00000| 0%| F| |TAMS 0x00000007eed00000, 0x00000007eed00000| Untracked +| 238|0x00000007eee00000, 0x00000007eee00000, 0x00000007eef00000| 0%| F| |TAMS 0x00000007eee00000, 0x00000007eee00000| Untracked +| 239|0x00000007eef00000, 0x00000007eef00000, 0x00000007ef000000| 0%| F| |TAMS 0x00000007eef00000, 0x00000007eef00000| Untracked +| 240|0x00000007ef000000, 0x00000007ef000000, 0x00000007ef100000| 0%| F| |TAMS 0x00000007ef000000, 0x00000007ef000000| Untracked +| 241|0x00000007ef100000, 0x00000007ef100000, 0x00000007ef200000| 0%| F| |TAMS 0x00000007ef100000, 0x00000007ef100000| Untracked +| 242|0x00000007ef200000, 0x00000007ef200000, 0x00000007ef300000| 0%| F| |TAMS 0x00000007ef200000, 0x00000007ef200000| Untracked +| 243|0x00000007ef300000, 0x00000007ef300000, 0x00000007ef400000| 0%| F| |TAMS 0x00000007ef300000, 0x00000007ef300000| Untracked +| 244|0x00000007ef400000, 0x00000007ef400000, 0x00000007ef500000| 0%| F| |TAMS 0x00000007ef400000, 0x00000007ef400000| Untracked +| 245|0x00000007ef500000, 0x00000007ef500000, 0x00000007ef600000| 0%| F| |TAMS 0x00000007ef500000, 0x00000007ef500000| Untracked +| 246|0x00000007ef600000, 0x00000007ef600000, 0x00000007ef700000| 0%| F| |TAMS 0x00000007ef600000, 0x00000007ef600000| Untracked +| 247|0x00000007ef700000, 0x00000007ef700000, 0x00000007ef800000| 0%| F| |TAMS 0x00000007ef700000, 0x00000007ef700000| Untracked +| 248|0x00000007ef800000, 0x00000007ef800000, 0x00000007ef900000| 0%| F| |TAMS 0x00000007ef800000, 0x00000007ef800000| Untracked +| 249|0x00000007ef900000, 0x00000007ef900000, 0x00000007efa00000| 0%| F| |TAMS 0x00000007ef900000, 0x00000007ef900000| Untracked +| 250|0x00000007efa00000, 0x00000007efa00000, 0x00000007efb00000| 0%| F| |TAMS 0x00000007efa00000, 0x00000007efa00000| Untracked +| 251|0x00000007efb00000, 0x00000007efb00000, 0x00000007efc00000| 0%| F| |TAMS 0x00000007efb00000, 0x00000007efb00000| Untracked +| 252|0x00000007efc00000, 0x00000007efc00000, 0x00000007efd00000| 0%| F| |TAMS 0x00000007efc00000, 0x00000007efc00000| Untracked +| 253|0x00000007efd00000, 0x00000007efd00000, 0x00000007efe00000| 0%| F| |TAMS 0x00000007efd00000, 0x00000007efd00000| Untracked +| 254|0x00000007efe00000, 0x00000007efe00000, 0x00000007eff00000| 0%| F| |TAMS 0x00000007efe00000, 0x00000007efe00000| Untracked +| 255|0x00000007eff00000, 0x00000007eff00000, 0x00000007f0000000| 0%| F| |TAMS 0x00000007eff00000, 0x00000007eff00000| Untracked +| 256|0x00000007f0000000, 0x00000007f0000000, 0x00000007f0100000| 0%| F| |TAMS 0x00000007f0000000, 0x00000007f0000000| Untracked +| 257|0x00000007f0100000, 0x00000007f0100000, 0x00000007f0200000| 0%| F| |TAMS 0x00000007f0100000, 0x00000007f0100000| Untracked +| 258|0x00000007f0200000, 0x00000007f0200000, 0x00000007f0300000| 0%| F| |TAMS 0x00000007f0200000, 0x00000007f0200000| Untracked +| 259|0x00000007f0300000, 0x00000007f0300000, 0x00000007f0400000| 0%| F| |TAMS 0x00000007f0300000, 0x00000007f0300000| Untracked +| 260|0x00000007f0400000, 0x00000007f0400000, 0x00000007f0500000| 0%| F| |TAMS 0x00000007f0400000, 0x00000007f0400000| Untracked +| 261|0x00000007f0500000, 0x00000007f0500000, 0x00000007f0600000| 0%| F| |TAMS 0x00000007f0500000, 0x00000007f0500000| Untracked +| 262|0x00000007f0600000, 0x00000007f0600000, 0x00000007f0700000| 0%| F| |TAMS 0x00000007f0600000, 0x00000007f0600000| Untracked +| 263|0x00000007f0700000, 0x00000007f0700000, 0x00000007f0800000| 0%| F| |TAMS 0x00000007f0700000, 0x00000007f0700000| Untracked +| 264|0x00000007f0800000, 0x00000007f0800000, 0x00000007f0900000| 0%| F| |TAMS 0x00000007f0800000, 0x00000007f0800000| Untracked +| 265|0x00000007f0900000, 0x00000007f0900000, 0x00000007f0a00000| 0%| F| |TAMS 0x00000007f0900000, 0x00000007f0900000| Untracked +| 266|0x00000007f0a00000, 0x00000007f0a00000, 0x00000007f0b00000| 0%| F| |TAMS 0x00000007f0a00000, 0x00000007f0a00000| Untracked +| 267|0x00000007f0b00000, 0x00000007f0b00000, 0x00000007f0c00000| 0%| F| |TAMS 0x00000007f0b00000, 0x00000007f0b00000| Untracked +| 268|0x00000007f0c00000, 0x00000007f0c00000, 0x00000007f0d00000| 0%| F| |TAMS 0x00000007f0c00000, 0x00000007f0c00000| Untracked +| 269|0x00000007f0d00000, 0x00000007f0d00000, 0x00000007f0e00000| 0%| F| |TAMS 0x00000007f0d00000, 0x00000007f0d00000| Untracked +| 270|0x00000007f0e00000, 0x00000007f0e00000, 0x00000007f0f00000| 0%| F| |TAMS 0x00000007f0e00000, 0x00000007f0e00000| Untracked +| 271|0x00000007f0f00000, 0x00000007f0f00000, 0x00000007f1000000| 0%| F| |TAMS 0x00000007f0f00000, 0x00000007f0f00000| Untracked +| 272|0x00000007f1000000, 0x00000007f1000000, 0x00000007f1100000| 0%| F| |TAMS 0x00000007f1000000, 0x00000007f1000000| Untracked +| 273|0x00000007f1100000, 0x00000007f1100000, 0x00000007f1200000| 0%| F| |TAMS 0x00000007f1100000, 0x00000007f1100000| Untracked +| 274|0x00000007f1200000, 0x00000007f1200000, 0x00000007f1300000| 0%| F| |TAMS 0x00000007f1200000, 0x00000007f1200000| Untracked +| 275|0x00000007f1300000, 0x00000007f1300000, 0x00000007f1400000| 0%| F| |TAMS 0x00000007f1300000, 0x00000007f1300000| Untracked +| 276|0x00000007f1400000, 0x00000007f1400000, 0x00000007f1500000| 0%| F| |TAMS 0x00000007f1400000, 0x00000007f1400000| Untracked +| 277|0x00000007f1500000, 0x00000007f1500000, 0x00000007f1600000| 0%| F| |TAMS 0x00000007f1500000, 0x00000007f1500000| Untracked +| 278|0x00000007f1600000, 0x00000007f1600000, 0x00000007f1700000| 0%| F| |TAMS 0x00000007f1600000, 0x00000007f1600000| Untracked +| 279|0x00000007f1700000, 0x00000007f1700000, 0x00000007f1800000| 0%| F| |TAMS 0x00000007f1700000, 0x00000007f1700000| Untracked +| 280|0x00000007f1800000, 0x00000007f1800000, 0x00000007f1900000| 0%| F| |TAMS 0x00000007f1800000, 0x00000007f1800000| Untracked +| 281|0x00000007f1900000, 0x00000007f1900000, 0x00000007f1a00000| 0%| F| |TAMS 0x00000007f1900000, 0x00000007f1900000| Untracked +| 282|0x00000007f1a00000, 0x00000007f1a00000, 0x00000007f1b00000| 0%| F| |TAMS 0x00000007f1a00000, 0x00000007f1a00000| Untracked +| 283|0x00000007f1b00000, 0x00000007f1b00000, 0x00000007f1c00000| 0%| F| |TAMS 0x00000007f1b00000, 0x00000007f1b00000| Untracked +| 284|0x00000007f1c00000, 0x00000007f1c00000, 0x00000007f1d00000| 0%| F| |TAMS 0x00000007f1c00000, 0x00000007f1c00000| Untracked +| 285|0x00000007f1d00000, 0x00000007f1d00000, 0x00000007f1e00000| 0%| F| |TAMS 0x00000007f1d00000, 0x00000007f1d00000| Untracked +| 286|0x00000007f1e00000, 0x00000007f1e00000, 0x00000007f1f00000| 0%| F| |TAMS 0x00000007f1e00000, 0x00000007f1e00000| Untracked +| 287|0x00000007f1f00000, 0x00000007f1f00000, 0x00000007f2000000| 0%| F| |TAMS 0x00000007f1f00000, 0x00000007f1f00000| Untracked +| 288|0x00000007f2000000, 0x00000007f2000000, 0x00000007f2100000| 0%| F| |TAMS 0x00000007f2000000, 0x00000007f2000000| Untracked +| 289|0x00000007f2100000, 0x00000007f2100000, 0x00000007f2200000| 0%| F| |TAMS 0x00000007f2100000, 0x00000007f2100000| Untracked +| 290|0x00000007f2200000, 0x00000007f2200000, 0x00000007f2300000| 0%| F| |TAMS 0x00000007f2200000, 0x00000007f2200000| Untracked +| 291|0x00000007f2300000, 0x00000007f2300000, 0x00000007f2400000| 0%| F| |TAMS 0x00000007f2300000, 0x00000007f2300000| Untracked +| 292|0x00000007f2400000, 0x00000007f2400000, 0x00000007f2500000| 0%| F| |TAMS 0x00000007f2400000, 0x00000007f2400000| Untracked +| 293|0x00000007f2500000, 0x00000007f2500000, 0x00000007f2600000| 0%| F| |TAMS 0x00000007f2500000, 0x00000007f2500000| Untracked +| 294|0x00000007f2600000, 0x00000007f2600000, 0x00000007f2700000| 0%| F| |TAMS 0x00000007f2600000, 0x00000007f2600000| Untracked +| 295|0x00000007f2700000, 0x00000007f2700000, 0x00000007f2800000| 0%| F| |TAMS 0x00000007f2700000, 0x00000007f2700000| Untracked +| 296|0x00000007f2800000, 0x00000007f2800000, 0x00000007f2900000| 0%| F| |TAMS 0x00000007f2800000, 0x00000007f2800000| Untracked +| 297|0x00000007f2900000, 0x00000007f2900000, 0x00000007f2a00000| 0%| F| |TAMS 0x00000007f2900000, 0x00000007f2900000| Untracked +| 298|0x00000007f2a00000, 0x00000007f2a00000, 0x00000007f2b00000| 0%| F| |TAMS 0x00000007f2a00000, 0x00000007f2a00000| Untracked +| 299|0x00000007f2b00000, 0x00000007f2b00000, 0x00000007f2c00000| 0%| F| |TAMS 0x00000007f2b00000, 0x00000007f2b00000| Untracked +| 300|0x00000007f2c00000, 0x00000007f2c00000, 0x00000007f2d00000| 0%| F| |TAMS 0x00000007f2c00000, 0x00000007f2c00000| Untracked +| 301|0x00000007f2d00000, 0x00000007f2d00000, 0x00000007f2e00000| 0%| F| |TAMS 0x00000007f2d00000, 0x00000007f2d00000| Untracked +| 302|0x00000007f2e00000, 0x00000007f2e00000, 0x00000007f2f00000| 0%| F| |TAMS 0x00000007f2e00000, 0x00000007f2e00000| Untracked +| 303|0x00000007f2f00000, 0x00000007f2f00000, 0x00000007f3000000| 0%| F| |TAMS 0x00000007f2f00000, 0x00000007f2f00000| Untracked +| 304|0x00000007f3000000, 0x00000007f3000000, 0x00000007f3100000| 0%| F| |TAMS 0x00000007f3000000, 0x00000007f3000000| Untracked +| 305|0x00000007f3100000, 0x00000007f3100000, 0x00000007f3200000| 0%| F| |TAMS 0x00000007f3100000, 0x00000007f3100000| Untracked +| 306|0x00000007f3200000, 0x00000007f3200000, 0x00000007f3300000| 0%| F| |TAMS 0x00000007f3200000, 0x00000007f3200000| Untracked +| 307|0x00000007f3300000, 0x00000007f3300000, 0x00000007f3400000| 0%| F| |TAMS 0x00000007f3300000, 0x00000007f3300000| Untracked +| 308|0x00000007f3400000, 0x00000007f3400000, 0x00000007f3500000| 0%| F| |TAMS 0x00000007f3400000, 0x00000007f3400000| Untracked +| 309|0x00000007f3500000, 0x00000007f3500000, 0x00000007f3600000| 0%| F| |TAMS 0x00000007f3500000, 0x00000007f3500000| Untracked +| 310|0x00000007f3600000, 0x00000007f3600000, 0x00000007f3700000| 0%| F| |TAMS 0x00000007f3600000, 0x00000007f3600000| Untracked +| 311|0x00000007f3700000, 0x00000007f3700000, 0x00000007f3800000| 0%| F| |TAMS 0x00000007f3700000, 0x00000007f3700000| Untracked +| 312|0x00000007f3800000, 0x00000007f3800000, 0x00000007f3900000| 0%| F| |TAMS 0x00000007f3800000, 0x00000007f3800000| Untracked +| 313|0x00000007f3900000, 0x00000007f3900000, 0x00000007f3a00000| 0%| F| |TAMS 0x00000007f3900000, 0x00000007f3900000| Untracked +| 314|0x00000007f3a00000, 0x00000007f3a00000, 0x00000007f3b00000| 0%| F| |TAMS 0x00000007f3a00000, 0x00000007f3a00000| Untracked +| 315|0x00000007f3b00000, 0x00000007f3b00000, 0x00000007f3c00000| 0%| F| |TAMS 0x00000007f3b00000, 0x00000007f3b00000| Untracked +| 316|0x00000007f3c00000, 0x00000007f3c00000, 0x00000007f3d00000| 0%| F| |TAMS 0x00000007f3c00000, 0x00000007f3c00000| Untracked +| 317|0x00000007f3d00000, 0x00000007f3d00000, 0x00000007f3e00000| 0%| F| |TAMS 0x00000007f3d00000, 0x00000007f3d00000| Untracked +| 318|0x00000007f3e00000, 0x00000007f3e00000, 0x00000007f3f00000| 0%| F| |TAMS 0x00000007f3e00000, 0x00000007f3e00000| Untracked +| 319|0x00000007f3f00000, 0x00000007f3f00000, 0x00000007f4000000| 0%| F| |TAMS 0x00000007f3f00000, 0x00000007f3f00000| Untracked +| 320|0x00000007f4000000, 0x00000007f4000000, 0x00000007f4100000| 0%| F| |TAMS 0x00000007f4000000, 0x00000007f4000000| Untracked +| 321|0x00000007f4100000, 0x00000007f4100000, 0x00000007f4200000| 0%| F| |TAMS 0x00000007f4100000, 0x00000007f4100000| Untracked +| 322|0x00000007f4200000, 0x00000007f4200000, 0x00000007f4300000| 0%| F| |TAMS 0x00000007f4200000, 0x00000007f4200000| Untracked +| 323|0x00000007f4300000, 0x00000007f4300000, 0x00000007f4400000| 0%| F| |TAMS 0x00000007f4300000, 0x00000007f4300000| Untracked +| 324|0x00000007f4400000, 0x00000007f4400000, 0x00000007f4500000| 0%| F| |TAMS 0x00000007f4400000, 0x00000007f4400000| Untracked +| 325|0x00000007f4500000, 0x00000007f4500000, 0x00000007f4600000| 0%| F| |TAMS 0x00000007f4500000, 0x00000007f4500000| Untracked +| 326|0x00000007f4600000, 0x00000007f4600000, 0x00000007f4700000| 0%| F| |TAMS 0x00000007f4600000, 0x00000007f4600000| Untracked +| 327|0x00000007f4700000, 0x00000007f4700000, 0x00000007f4800000| 0%| F| |TAMS 0x00000007f4700000, 0x00000007f4700000| Untracked +| 328|0x00000007f4800000, 0x00000007f4800000, 0x00000007f4900000| 0%| F| |TAMS 0x00000007f4800000, 0x00000007f4800000| Untracked +| 329|0x00000007f4900000, 0x00000007f4900000, 0x00000007f4a00000| 0%| F| |TAMS 0x00000007f4900000, 0x00000007f4900000| Untracked +| 330|0x00000007f4a00000, 0x00000007f4a00000, 0x00000007f4b00000| 0%| F| |TAMS 0x00000007f4a00000, 0x00000007f4a00000| Untracked +| 331|0x00000007f4b00000, 0x00000007f4b00000, 0x00000007f4c00000| 0%| F| |TAMS 0x00000007f4b00000, 0x00000007f4b00000| Untracked +| 332|0x00000007f4c00000, 0x00000007f4c00000, 0x00000007f4d00000| 0%| F| |TAMS 0x00000007f4c00000, 0x00000007f4c00000| Untracked +| 333|0x00000007f4d00000, 0x00000007f4d00000, 0x00000007f4e00000| 0%| F| |TAMS 0x00000007f4d00000, 0x00000007f4d00000| Untracked +| 334|0x00000007f4e00000, 0x00000007f4e00000, 0x00000007f4f00000| 0%| F| |TAMS 0x00000007f4e00000, 0x00000007f4e00000| Untracked +| 335|0x00000007f4f00000, 0x00000007f4f00000, 0x00000007f5000000| 0%| F| |TAMS 0x00000007f4f00000, 0x00000007f4f00000| Untracked +| 336|0x00000007f5000000, 0x00000007f5000000, 0x00000007f5100000| 0%| F| |TAMS 0x00000007f5000000, 0x00000007f5000000| Untracked +| 337|0x00000007f5100000, 0x00000007f5100000, 0x00000007f5200000| 0%| F| |TAMS 0x00000007f5100000, 0x00000007f5100000| Untracked +| 338|0x00000007f5200000, 0x00000007f5200000, 0x00000007f5300000| 0%| F| |TAMS 0x00000007f5200000, 0x00000007f5200000| Untracked +| 339|0x00000007f5300000, 0x00000007f5300000, 0x00000007f5400000| 0%| F| |TAMS 0x00000007f5300000, 0x00000007f5300000| Untracked +| 340|0x00000007f5400000, 0x00000007f5400000, 0x00000007f5500000| 0%| F| |TAMS 0x00000007f5400000, 0x00000007f5400000| Untracked +| 341|0x00000007f5500000, 0x00000007f5500000, 0x00000007f5600000| 0%| F| |TAMS 0x00000007f5500000, 0x00000007f5500000| Untracked +| 342|0x00000007f5600000, 0x00000007f5600000, 0x00000007f5700000| 0%| F| |TAMS 0x00000007f5600000, 0x00000007f5600000| Untracked +| 343|0x00000007f5700000, 0x00000007f5700000, 0x00000007f5800000| 0%| F| |TAMS 0x00000007f5700000, 0x00000007f5700000| Untracked +| 344|0x00000007f5800000, 0x00000007f5800000, 0x00000007f5900000| 0%| F| |TAMS 0x00000007f5800000, 0x00000007f5800000| Untracked +| 345|0x00000007f5900000, 0x00000007f5900000, 0x00000007f5a00000| 0%| F| |TAMS 0x00000007f5900000, 0x00000007f5900000| Untracked +| 346|0x00000007f5a00000, 0x00000007f5a00000, 0x00000007f5b00000| 0%| F| |TAMS 0x00000007f5a00000, 0x00000007f5a00000| Untracked +| 347|0x00000007f5b00000, 0x00000007f5b00000, 0x00000007f5c00000| 0%| F| |TAMS 0x00000007f5b00000, 0x00000007f5b00000| Untracked +| 348|0x00000007f5c00000, 0x00000007f5c00000, 0x00000007f5d00000| 0%| F| |TAMS 0x00000007f5c00000, 0x00000007f5c00000| Untracked +| 349|0x00000007f5d00000, 0x00000007f5d00000, 0x00000007f5e00000| 0%| F| |TAMS 0x00000007f5d00000, 0x00000007f5d00000| Untracked +| 350|0x00000007f5e00000, 0x00000007f5e00000, 0x00000007f5f00000| 0%| F| |TAMS 0x00000007f5e00000, 0x00000007f5e00000| Untracked +| 351|0x00000007f5f00000, 0x00000007f5f00000, 0x00000007f6000000| 0%| F| |TAMS 0x00000007f5f00000, 0x00000007f5f00000| Untracked +| 352|0x00000007f6000000, 0x00000007f6000000, 0x00000007f6100000| 0%| F| |TAMS 0x00000007f6000000, 0x00000007f6000000| Untracked +| 353|0x00000007f6100000, 0x00000007f6100000, 0x00000007f6200000| 0%| F| |TAMS 0x00000007f6100000, 0x00000007f6100000| Untracked +| 354|0x00000007f6200000, 0x00000007f6200000, 0x00000007f6300000| 0%| F| |TAMS 0x00000007f6200000, 0x00000007f6200000| Untracked +| 355|0x00000007f6300000, 0x00000007f6300000, 0x00000007f6400000| 0%| F| |TAMS 0x00000007f6300000, 0x00000007f6300000| Untracked +| 356|0x00000007f6400000, 0x00000007f6400000, 0x00000007f6500000| 0%| F| |TAMS 0x00000007f6400000, 0x00000007f6400000| Untracked +| 357|0x00000007f6500000, 0x00000007f6500000, 0x00000007f6600000| 0%| F| |TAMS 0x00000007f6500000, 0x00000007f6500000| Untracked +| 358|0x00000007f6600000, 0x00000007f6600000, 0x00000007f6700000| 0%| F| |TAMS 0x00000007f6600000, 0x00000007f6600000| Untracked +| 359|0x00000007f6700000, 0x00000007f6700000, 0x00000007f6800000| 0%| F| |TAMS 0x00000007f6700000, 0x00000007f6700000| Untracked +| 360|0x00000007f6800000, 0x00000007f6800000, 0x00000007f6900000| 0%| F| |TAMS 0x00000007f6800000, 0x00000007f6800000| Untracked +| 361|0x00000007f6900000, 0x00000007f6900000, 0x00000007f6a00000| 0%| F| |TAMS 0x00000007f6900000, 0x00000007f6900000| Untracked +| 362|0x00000007f6a00000, 0x00000007f6a00000, 0x00000007f6b00000| 0%| F| |TAMS 0x00000007f6a00000, 0x00000007f6a00000| Untracked +| 363|0x00000007f6b00000, 0x00000007f6b00000, 0x00000007f6c00000| 0%| F| |TAMS 0x00000007f6b00000, 0x00000007f6b00000| Untracked +| 364|0x00000007f6c00000, 0x00000007f6c00000, 0x00000007f6d00000| 0%| F| |TAMS 0x00000007f6c00000, 0x00000007f6c00000| Untracked +| 365|0x00000007f6d00000, 0x00000007f6d00000, 0x00000007f6e00000| 0%| F| |TAMS 0x00000007f6d00000, 0x00000007f6d00000| Untracked +| 366|0x00000007f6e00000, 0x00000007f6e00000, 0x00000007f6f00000| 0%| F| |TAMS 0x00000007f6e00000, 0x00000007f6e00000| Untracked +| 367|0x00000007f6f00000, 0x00000007f6f00000, 0x00000007f7000000| 0%| F| |TAMS 0x00000007f6f00000, 0x00000007f6f00000| Untracked +| 368|0x00000007f7000000, 0x00000007f7000000, 0x00000007f7100000| 0%| F| |TAMS 0x00000007f7000000, 0x00000007f7000000| Untracked +| 369|0x00000007f7100000, 0x00000007f7100000, 0x00000007f7200000| 0%| F| |TAMS 0x00000007f7100000, 0x00000007f7100000| Untracked +| 370|0x00000007f7200000, 0x00000007f7200000, 0x00000007f7300000| 0%| F| |TAMS 0x00000007f7200000, 0x00000007f7200000| Untracked +| 371|0x00000007f7300000, 0x00000007f7300000, 0x00000007f7400000| 0%| F| |TAMS 0x00000007f7300000, 0x00000007f7300000| Untracked +| 372|0x00000007f7400000, 0x00000007f7400000, 0x00000007f7500000| 0%| F| |TAMS 0x00000007f7400000, 0x00000007f7400000| Untracked +| 373|0x00000007f7500000, 0x00000007f7500000, 0x00000007f7600000| 0%| F| |TAMS 0x00000007f7500000, 0x00000007f7500000| Untracked +| 374|0x00000007f7600000, 0x00000007f7600000, 0x00000007f7700000| 0%| F| |TAMS 0x00000007f7600000, 0x00000007f7600000| Untracked +| 375|0x00000007f7700000, 0x00000007f7700000, 0x00000007f7800000| 0%| F| |TAMS 0x00000007f7700000, 0x00000007f7700000| Untracked +| 376|0x00000007f7800000, 0x00000007f7800000, 0x00000007f7900000| 0%| F| |TAMS 0x00000007f7800000, 0x00000007f7800000| Untracked +| 377|0x00000007f7900000, 0x00000007f7900000, 0x00000007f7a00000| 0%| F| |TAMS 0x00000007f7900000, 0x00000007f7900000| Untracked +| 378|0x00000007f7a00000, 0x00000007f7a00000, 0x00000007f7b00000| 0%| F| |TAMS 0x00000007f7a00000, 0x00000007f7a00000| Untracked +| 379|0x00000007f7b00000, 0x00000007f7b00000, 0x00000007f7c00000| 0%| F| |TAMS 0x00000007f7b00000, 0x00000007f7b00000| Untracked +| 380|0x00000007f7c00000, 0x00000007f7c00000, 0x00000007f7d00000| 0%| F| |TAMS 0x00000007f7c00000, 0x00000007f7c00000| Untracked +| 381|0x00000007f7d00000, 0x00000007f7d00000, 0x00000007f7e00000| 0%| F| |TAMS 0x00000007f7d00000, 0x00000007f7d00000| Untracked +| 382|0x00000007f7e00000, 0x00000007f7e00000, 0x00000007f7f00000| 0%| F| |TAMS 0x00000007f7e00000, 0x00000007f7e00000| Untracked +| 383|0x00000007f7f00000, 0x00000007f7f00000, 0x00000007f8000000| 0%| F| |TAMS 0x00000007f7f00000, 0x00000007f7f00000| Untracked +| 384|0x00000007f8000000, 0x00000007f8000000, 0x00000007f8100000| 0%| F| |TAMS 0x00000007f8000000, 0x00000007f8000000| Untracked +| 385|0x00000007f8100000, 0x00000007f8100000, 0x00000007f8200000| 0%| F| |TAMS 0x00000007f8100000, 0x00000007f8100000| Untracked +| 386|0x00000007f8200000, 0x00000007f8200000, 0x00000007f8300000| 0%| F| |TAMS 0x00000007f8200000, 0x00000007f8200000| Untracked +| 387|0x00000007f8300000, 0x00000007f8300000, 0x00000007f8400000| 0%| F| |TAMS 0x00000007f8300000, 0x00000007f8300000| Untracked +| 388|0x00000007f8400000, 0x00000007f8400000, 0x00000007f8500000| 0%| F| |TAMS 0x00000007f8400000, 0x00000007f8400000| Untracked +| 389|0x00000007f8500000, 0x00000007f8500000, 0x00000007f8600000| 0%| F| |TAMS 0x00000007f8500000, 0x00000007f8500000| Untracked +| 390|0x00000007f8600000, 0x00000007f8600000, 0x00000007f8700000| 0%| F| |TAMS 0x00000007f8600000, 0x00000007f8600000| Untracked +| 391|0x00000007f8700000, 0x00000007f8700000, 0x00000007f8800000| 0%| F| |TAMS 0x00000007f8700000, 0x00000007f8700000| Untracked +| 392|0x00000007f8800000, 0x00000007f8800000, 0x00000007f8900000| 0%| F| |TAMS 0x00000007f8800000, 0x00000007f8800000| Untracked +| 393|0x00000007f8900000, 0x00000007f8900000, 0x00000007f8a00000| 0%| F| |TAMS 0x00000007f8900000, 0x00000007f8900000| Untracked +| 394|0x00000007f8a00000, 0x00000007f8a00000, 0x00000007f8b00000| 0%| F| |TAMS 0x00000007f8a00000, 0x00000007f8a00000| Untracked +| 395|0x00000007f8b00000, 0x00000007f8b00000, 0x00000007f8c00000| 0%| F| |TAMS 0x00000007f8b00000, 0x00000007f8b00000| Untracked +| 396|0x00000007f8c00000, 0x00000007f8c00000, 0x00000007f8d00000| 0%| F| |TAMS 0x00000007f8c00000, 0x00000007f8c00000| Untracked +| 397|0x00000007f8d00000, 0x00000007f8d00000, 0x00000007f8e00000| 0%| F| |TAMS 0x00000007f8d00000, 0x00000007f8d00000| Untracked +| 398|0x00000007f8e00000, 0x00000007f8e00000, 0x00000007f8f00000| 0%| F| |TAMS 0x00000007f8e00000, 0x00000007f8e00000| Untracked +| 399|0x00000007f8f00000, 0x00000007f8f00000, 0x00000007f9000000| 0%| F| |TAMS 0x00000007f8f00000, 0x00000007f8f00000| Untracked +| 400|0x00000007f9000000, 0x00000007f9000000, 0x00000007f9100000| 0%| F| |TAMS 0x00000007f9000000, 0x00000007f9000000| Untracked +| 401|0x00000007f9100000, 0x00000007f9100000, 0x00000007f9200000| 0%| F| |TAMS 0x00000007f9100000, 0x00000007f9100000| Untracked +| 402|0x00000007f9200000, 0x00000007f9200000, 0x00000007f9300000| 0%| F| |TAMS 0x00000007f9200000, 0x00000007f9200000| Untracked +| 403|0x00000007f9300000, 0x00000007f9300000, 0x00000007f9400000| 0%| F| |TAMS 0x00000007f9300000, 0x00000007f9300000| Untracked +| 404|0x00000007f9400000, 0x00000007f9400000, 0x00000007f9500000| 0%| F| |TAMS 0x00000007f9400000, 0x00000007f9400000| Untracked +| 405|0x00000007f9500000, 0x00000007f9500000, 0x00000007f9600000| 0%| F| |TAMS 0x00000007f9500000, 0x00000007f9500000| Untracked +| 406|0x00000007f9600000, 0x00000007f9600000, 0x00000007f9700000| 0%| F| |TAMS 0x00000007f9600000, 0x00000007f9600000| Untracked +| 407|0x00000007f9700000, 0x00000007f9700000, 0x00000007f9800000| 0%| F| |TAMS 0x00000007f9700000, 0x00000007f9700000| Untracked +| 408|0x00000007f9800000, 0x00000007f9800000, 0x00000007f9900000| 0%| F| |TAMS 0x00000007f9800000, 0x00000007f9800000| Untracked +| 409|0x00000007f9900000, 0x00000007f9900000, 0x00000007f9a00000| 0%| F| |TAMS 0x00000007f9900000, 0x00000007f9900000| Untracked +| 410|0x00000007f9a00000, 0x00000007f9a00000, 0x00000007f9b00000| 0%| F| |TAMS 0x00000007f9a00000, 0x00000007f9a00000| Untracked +| 411|0x00000007f9b00000, 0x00000007f9b00000, 0x00000007f9c00000| 0%| F| |TAMS 0x00000007f9b00000, 0x00000007f9b00000| Untracked +| 412|0x00000007f9c00000, 0x00000007f9c00000, 0x00000007f9d00000| 0%| F| |TAMS 0x00000007f9c00000, 0x00000007f9c00000| Untracked +| 413|0x00000007f9d00000, 0x00000007f9d00000, 0x00000007f9e00000| 0%| F| |TAMS 0x00000007f9d00000, 0x00000007f9d00000| Untracked +| 414|0x00000007f9e00000, 0x00000007f9e00000, 0x00000007f9f00000| 0%| F| |TAMS 0x00000007f9e00000, 0x00000007f9e00000| Untracked +| 415|0x00000007f9f00000, 0x00000007f9f00000, 0x00000007fa000000| 0%| F| |TAMS 0x00000007f9f00000, 0x00000007f9f00000| Untracked +| 416|0x00000007fa000000, 0x00000007fa000000, 0x00000007fa100000| 0%| F| |TAMS 0x00000007fa000000, 0x00000007fa000000| Untracked +| 417|0x00000007fa100000, 0x00000007fa100000, 0x00000007fa200000| 0%| F| |TAMS 0x00000007fa100000, 0x00000007fa100000| Untracked +| 418|0x00000007fa200000, 0x00000007fa200000, 0x00000007fa300000| 0%| F| |TAMS 0x00000007fa200000, 0x00000007fa200000| Untracked +| 419|0x00000007fa300000, 0x00000007fa300000, 0x00000007fa400000| 0%| F| |TAMS 0x00000007fa300000, 0x00000007fa300000| Untracked +| 420|0x00000007fa400000, 0x00000007fa400000, 0x00000007fa500000| 0%| F| |TAMS 0x00000007fa400000, 0x00000007fa400000| Untracked +| 421|0x00000007fa500000, 0x00000007fa500000, 0x00000007fa600000| 0%| F| |TAMS 0x00000007fa500000, 0x00000007fa500000| Untracked +| 422|0x00000007fa600000, 0x00000007fa600000, 0x00000007fa700000| 0%| F| |TAMS 0x00000007fa600000, 0x00000007fa600000| Untracked +| 423|0x00000007fa700000, 0x00000007fa700000, 0x00000007fa800000| 0%| F| |TAMS 0x00000007fa700000, 0x00000007fa700000| Untracked +| 424|0x00000007fa800000, 0x00000007fa800000, 0x00000007fa900000| 0%| F| |TAMS 0x00000007fa800000, 0x00000007fa800000| Untracked +| 425|0x00000007fa900000, 0x00000007fa900000, 0x00000007faa00000| 0%| F| |TAMS 0x00000007fa900000, 0x00000007fa900000| Untracked +| 426|0x00000007faa00000, 0x00000007faa00000, 0x00000007fab00000| 0%| F| |TAMS 0x00000007faa00000, 0x00000007faa00000| Untracked +| 427|0x00000007fab00000, 0x00000007fab00000, 0x00000007fac00000| 0%| F| |TAMS 0x00000007fab00000, 0x00000007fab00000| Untracked +| 428|0x00000007fac00000, 0x00000007fac00000, 0x00000007fad00000| 0%| F| |TAMS 0x00000007fac00000, 0x00000007fac00000| Untracked +| 429|0x00000007fad00000, 0x00000007fad00000, 0x00000007fae00000| 0%| F| |TAMS 0x00000007fad00000, 0x00000007fad00000| Untracked +| 430|0x00000007fae00000, 0x00000007fae00000, 0x00000007faf00000| 0%| F| |TAMS 0x00000007fae00000, 0x00000007fae00000| Untracked +| 431|0x00000007faf00000, 0x00000007faf00000, 0x00000007fb000000| 0%| F| |TAMS 0x00000007faf00000, 0x00000007faf00000| Untracked +| 432|0x00000007fb000000, 0x00000007fb000000, 0x00000007fb100000| 0%| F| |TAMS 0x00000007fb000000, 0x00000007fb000000| Untracked +| 433|0x00000007fb100000, 0x00000007fb100000, 0x00000007fb200000| 0%| F| |TAMS 0x00000007fb100000, 0x00000007fb100000| Untracked +| 434|0x00000007fb200000, 0x00000007fb200000, 0x00000007fb300000| 0%| F| |TAMS 0x00000007fb200000, 0x00000007fb200000| Untracked +| 435|0x00000007fb300000, 0x00000007fb300000, 0x00000007fb400000| 0%| F| |TAMS 0x00000007fb300000, 0x00000007fb300000| Untracked +| 436|0x00000007fb400000, 0x00000007fb400000, 0x00000007fb500000| 0%| F| |TAMS 0x00000007fb400000, 0x00000007fb400000| Untracked +| 437|0x00000007fb500000, 0x00000007fb500000, 0x00000007fb600000| 0%| F| |TAMS 0x00000007fb500000, 0x00000007fb500000| Untracked +| 438|0x00000007fb600000, 0x00000007fb600000, 0x00000007fb700000| 0%| F| |TAMS 0x00000007fb600000, 0x00000007fb600000| Untracked +| 439|0x00000007fb700000, 0x00000007fb700000, 0x00000007fb800000| 0%| F| |TAMS 0x00000007fb700000, 0x00000007fb700000| Untracked +| 440|0x00000007fb800000, 0x00000007fb800000, 0x00000007fb900000| 0%| F| |TAMS 0x00000007fb800000, 0x00000007fb800000| Untracked +| 441|0x00000007fb900000, 0x00000007fb900000, 0x00000007fba00000| 0%| F| |TAMS 0x00000007fb900000, 0x00000007fb900000| Untracked +| 442|0x00000007fba00000, 0x00000007fba00000, 0x00000007fbb00000| 0%| F| |TAMS 0x00000007fba00000, 0x00000007fba00000| Untracked +| 443|0x00000007fbb00000, 0x00000007fbb00000, 0x00000007fbc00000| 0%| F| |TAMS 0x00000007fbb00000, 0x00000007fbb00000| Untracked +| 444|0x00000007fbc00000, 0x00000007fbc00000, 0x00000007fbd00000| 0%| F| |TAMS 0x00000007fbc00000, 0x00000007fbc00000| Untracked +| 445|0x00000007fbd00000, 0x00000007fbd00000, 0x00000007fbe00000| 0%| F| |TAMS 0x00000007fbd00000, 0x00000007fbd00000| Untracked +| 446|0x00000007fbe00000, 0x00000007fbe00000, 0x00000007fbf00000| 0%| F| |TAMS 0x00000007fbe00000, 0x00000007fbe00000| Untracked +| 447|0x00000007fbf00000, 0x00000007fbf00000, 0x00000007fc000000| 0%| F| |TAMS 0x00000007fbf00000, 0x00000007fbf00000| Untracked +| 448|0x00000007fc000000, 0x00000007fc000000, 0x00000007fc100000| 0%| F| |TAMS 0x00000007fc000000, 0x00000007fc000000| Untracked +| 449|0x00000007fc100000, 0x00000007fc100000, 0x00000007fc200000| 0%| F| |TAMS 0x00000007fc100000, 0x00000007fc100000| Untracked +| 450|0x00000007fc200000, 0x00000007fc200000, 0x00000007fc300000| 0%| F| |TAMS 0x00000007fc200000, 0x00000007fc200000| Untracked +| 451|0x00000007fc300000, 0x00000007fc300000, 0x00000007fc400000| 0%| F| |TAMS 0x00000007fc300000, 0x00000007fc300000| Untracked +| 452|0x00000007fc400000, 0x00000007fc400000, 0x00000007fc500000| 0%| F| |TAMS 0x00000007fc400000, 0x00000007fc400000| Untracked +| 453|0x00000007fc500000, 0x00000007fc500000, 0x00000007fc600000| 0%| F| |TAMS 0x00000007fc500000, 0x00000007fc500000| Untracked +| 454|0x00000007fc600000, 0x00000007fc600000, 0x00000007fc700000| 0%| F| |TAMS 0x00000007fc600000, 0x00000007fc600000| Untracked +| 455|0x00000007fc700000, 0x00000007fc700000, 0x00000007fc800000| 0%| F| |TAMS 0x00000007fc700000, 0x00000007fc700000| Untracked +| 456|0x00000007fc800000, 0x00000007fc800000, 0x00000007fc900000| 0%| F| |TAMS 0x00000007fc800000, 0x00000007fc800000| Untracked +| 457|0x00000007fc900000, 0x00000007fc900000, 0x00000007fca00000| 0%| F| |TAMS 0x00000007fc900000, 0x00000007fc900000| Untracked +| 458|0x00000007fca00000, 0x00000007fca00000, 0x00000007fcb00000| 0%| F| |TAMS 0x00000007fca00000, 0x00000007fca00000| Untracked +| 459|0x00000007fcb00000, 0x00000007fcb00000, 0x00000007fcc00000| 0%| F| |TAMS 0x00000007fcb00000, 0x00000007fcb00000| Untracked +| 460|0x00000007fcc00000, 0x00000007fcc00000, 0x00000007fcd00000| 0%| F| |TAMS 0x00000007fcc00000, 0x00000007fcc00000| Untracked +| 461|0x00000007fcd00000, 0x00000007fcd00000, 0x00000007fce00000| 0%| F| |TAMS 0x00000007fcd00000, 0x00000007fcd00000| Untracked +| 462|0x00000007fce00000, 0x00000007fce00000, 0x00000007fcf00000| 0%| F| |TAMS 0x00000007fce00000, 0x00000007fce00000| Untracked +| 463|0x00000007fcf00000, 0x00000007fcf00000, 0x00000007fd000000| 0%| F| |TAMS 0x00000007fcf00000, 0x00000007fcf00000| Untracked +| 464|0x00000007fd000000, 0x00000007fd000000, 0x00000007fd100000| 0%| F| |TAMS 0x00000007fd000000, 0x00000007fd000000| Untracked +| 465|0x00000007fd100000, 0x00000007fd100000, 0x00000007fd200000| 0%| F| |TAMS 0x00000007fd100000, 0x00000007fd100000| Untracked +| 466|0x00000007fd200000, 0x00000007fd200000, 0x00000007fd300000| 0%| F| |TAMS 0x00000007fd200000, 0x00000007fd200000| Untracked +| 467|0x00000007fd300000, 0x00000007fd300000, 0x00000007fd400000| 0%| F| |TAMS 0x00000007fd300000, 0x00000007fd300000| Untracked +| 468|0x00000007fd400000, 0x00000007fd400000, 0x00000007fd500000| 0%| F| |TAMS 0x00000007fd400000, 0x00000007fd400000| Untracked +| 469|0x00000007fd500000, 0x00000007fd500000, 0x00000007fd600000| 0%| F| |TAMS 0x00000007fd500000, 0x00000007fd500000| Untracked +| 470|0x00000007fd600000, 0x00000007fd600000, 0x00000007fd700000| 0%| F| |TAMS 0x00000007fd600000, 0x00000007fd600000| Untracked +| 471|0x00000007fd700000, 0x00000007fd700000, 0x00000007fd800000| 0%| F| |TAMS 0x00000007fd700000, 0x00000007fd700000| Untracked +| 472|0x00000007fd800000, 0x00000007fd800000, 0x00000007fd900000| 0%| F| |TAMS 0x00000007fd800000, 0x00000007fd800000| Untracked +| 473|0x00000007fd900000, 0x00000007fd900000, 0x00000007fda00000| 0%| F| |TAMS 0x00000007fd900000, 0x00000007fd900000| Untracked +| 474|0x00000007fda00000, 0x00000007fda00000, 0x00000007fdb00000| 0%| F| |TAMS 0x00000007fda00000, 0x00000007fda00000| Untracked +| 475|0x00000007fdb00000, 0x00000007fdb00000, 0x00000007fdc00000| 0%| F| |TAMS 0x00000007fdb00000, 0x00000007fdb00000| Untracked +| 476|0x00000007fdc00000, 0x00000007fdc00000, 0x00000007fdd00000| 0%| F| |TAMS 0x00000007fdc00000, 0x00000007fdc00000| Untracked +| 477|0x00000007fdd00000, 0x00000007fde00000, 0x00000007fde00000|100%| E| |TAMS 0x00000007fdd00000, 0x00000007fdd00000| Complete +| 478|0x00000007fde00000, 0x00000007fdf00000, 0x00000007fdf00000|100%| E|CS|TAMS 0x00000007fde00000, 0x00000007fde00000| Complete +| 479|0x00000007fdf00000, 0x00000007fe000000, 0x00000007fe000000|100%| E|CS|TAMS 0x00000007fdf00000, 0x00000007fdf00000| Complete +| 480|0x00000007fe000000, 0x00000007fe100000, 0x00000007fe100000|100%| E|CS|TAMS 0x00000007fe000000, 0x00000007fe000000| Complete +| 481|0x00000007fe100000, 0x00000007fe200000, 0x00000007fe200000|100%| S|CS|TAMS 0x00000007fe100000, 0x00000007fe100000| Complete +| 482|0x00000007fe200000, 0x00000007fe300000, 0x00000007fe300000|100%| S|CS|TAMS 0x00000007fe200000, 0x00000007fe200000| Complete +| 483|0x00000007fe300000, 0x00000007fe400000, 0x00000007fe400000|100%| S|CS|TAMS 0x00000007fe300000, 0x00000007fe300000| Complete +| 484|0x00000007fe400000, 0x00000007fe500000, 0x00000007fe500000|100%| S|CS|TAMS 0x00000007fe400000, 0x00000007fe400000| Complete +| 485|0x00000007fe500000, 0x00000007fe600000, 0x00000007fe600000|100%| E|CS|TAMS 0x00000007fe500000, 0x00000007fe500000| Complete +| 486|0x00000007fe600000, 0x00000007fe700000, 0x00000007fe700000|100%| E|CS|TAMS 0x00000007fe600000, 0x00000007fe600000| Complete +| 487|0x00000007fe700000, 0x00000007fe800000, 0x00000007fe800000|100%| E|CS|TAMS 0x00000007fe700000, 0x00000007fe700000| Complete +| 488|0x00000007fe800000, 0x00000007fe900000, 0x00000007fe900000|100%| E|CS|TAMS 0x00000007fe800000, 0x00000007fe800000| Complete +| 489|0x00000007fe900000, 0x00000007fea00000, 0x00000007fea00000|100%| E|CS|TAMS 0x00000007fe900000, 0x00000007fe900000| Complete +| 490|0x00000007fea00000, 0x00000007feb00000, 0x00000007feb00000|100%| E|CS|TAMS 0x00000007fea00000, 0x00000007fea00000| Complete +| 491|0x00000007feb00000, 0x00000007fec00000, 0x00000007fec00000|100%| E|CS|TAMS 0x00000007feb00000, 0x00000007feb00000| Complete +| 492|0x00000007fec00000, 0x00000007fed00000, 0x00000007fed00000|100%| E|CS|TAMS 0x00000007fec00000, 0x00000007fec00000| Complete +| 493|0x00000007fed00000, 0x00000007fee00000, 0x00000007fee00000|100%| E|CS|TAMS 0x00000007fed00000, 0x00000007fed00000| Complete +| 494|0x00000007fee00000, 0x00000007fef00000, 0x00000007fef00000|100%| E|CS|TAMS 0x00000007fee00000, 0x00000007fee00000| Complete +| 495|0x00000007fef00000, 0x00000007ff000000, 0x00000007ff000000|100%| E|CS|TAMS 0x00000007fef00000, 0x00000007fef00000| Complete +| 496|0x00000007ff000000, 0x00000007ff100000, 0x00000007ff100000|100%| E|CS|TAMS 0x00000007ff000000, 0x00000007ff000000| Complete +| 497|0x00000007ff100000, 0x00000007ff200000, 0x00000007ff200000|100%| E|CS|TAMS 0x00000007ff100000, 0x00000007ff100000| Complete +| 498|0x00000007ff200000, 0x00000007ff300000, 0x00000007ff300000|100%| E|CS|TAMS 0x00000007ff200000, 0x00000007ff200000| Complete +| 499|0x00000007ff300000, 0x00000007ff400000, 0x00000007ff400000|100%| E|CS|TAMS 0x00000007ff300000, 0x00000007ff300000| Complete +| 500|0x00000007ff400000, 0x00000007ff500000, 0x00000007ff500000|100%| E|CS|TAMS 0x00000007ff400000, 0x00000007ff400000| Complete +| 501|0x00000007ff500000, 0x00000007ff600000, 0x00000007ff600000|100%| E|CS|TAMS 0x00000007ff500000, 0x00000007ff500000| Complete +| 502|0x00000007ff600000, 0x00000007ff700000, 0x00000007ff700000|100%| E|CS|TAMS 0x00000007ff600000, 0x00000007ff600000| Complete +| 503|0x00000007ff700000, 0x00000007ff800000, 0x00000007ff800000|100%| E|CS|TAMS 0x00000007ff700000, 0x00000007ff700000| Complete +| 504|0x00000007ff800000, 0x00000007ff900000, 0x00000007ff900000|100%| E|CS|TAMS 0x00000007ff800000, 0x00000007ff800000| Complete +| 505|0x00000007ff900000, 0x00000007ffa00000, 0x00000007ffa00000|100%| E|CS|TAMS 0x00000007ff900000, 0x00000007ff900000| Complete +| 506|0x00000007ffa00000, 0x00000007ffb00000, 0x00000007ffb00000|100%| E|CS|TAMS 0x00000007ffa00000, 0x00000007ffa00000| Complete +| 507|0x00000007ffb00000, 0x00000007ffc00000, 0x00000007ffc00000|100%| E|CS|TAMS 0x00000007ffb00000, 0x00000007ffb00000| Complete +| 508|0x00000007ffc00000, 0x00000007ffd00000, 0x00000007ffd00000|100%| E|CS|TAMS 0x00000007ffc00000, 0x00000007ffc00000| Complete +| 509|0x00000007ffd00000, 0x00000007ffe00000, 0x00000007ffe00000|100%| E|CS|TAMS 0x00000007ffd00000, 0x00000007ffd00000| Complete +| 510|0x00000007ffe00000, 0x00000007ffe78000, 0x00000007fff00000| 46%|OA| |TAMS 0x00000007ffe00000, 0x00000007ffe00000| Untracked +| 511|0x00000007fff00000, 0x00000007fff80000, 0x0000000800000000| 50%|CA| |TAMS 0x00000007fff00000, 0x00000007fff00000| Untracked + +Card table byte_map: [0x0000000104b34000,0x0000000104c34000] _byte_map_base: 0x0000000100c34000 + +Marking Bits (Prev, Next): (CMBitMap*) 0x000000013681c810, (CMBitMap*) 0x000000013681c850 + Prev Bits: [0x0000000104d34000, 0x0000000105534000) + Next Bits: [0x000000011d5c0000, 0x000000011ddc0000) + +Polling page: 0x000000010463c000 + +Metaspace: + +Usage: + Non-class: 11.34 MB used. + Class: 2.10 MB used. + Both: 13.45 MB used. + +Virtual space: + Non-class space: 16.00 MB reserved, 11.44 MB ( 71%) committed, 2 nodes. + Class space: 1.00 GB reserved, 2.25 MB ( <1%) committed, 1 nodes. + Both: 1.02 GB reserved, 13.69 MB ( 1%) committed. + +Chunk freelists: + Non-Class: 400.00 KB + Class: 1.72 MB + Both: 2.11 MB + +MaxMetaspaceSize: unlimited +CompressedClassSpaceSize: 1.00 GB +Initial GC threshold: 21.00 MB +Current GC threshold: 21.00 MB +CDS: on +MetaspaceReclaimPolicy: balanced + - commit_granule_bytes: 65536. + - commit_granule_words: 8192. + - virtual_space_node_default_size: 1048576. + - enlarge_chunks_in_place: 1. + - new_chunks_are_fully_committed: 0. + - uncommit_free_chunks: 1. + - use_allocation_guard: 0. + - handle_deallocations: 1. + + +Internal statistics: + +num_allocs_failed_limit: 0. +num_arena_births: 190. +num_arena_deaths: 0. +num_vsnodes_births: 3. +num_vsnodes_deaths: 0. +num_space_committed: 219. +num_space_uncommitted: 0. +num_chunks_returned_to_freelist: 0. +num_chunks_taken_from_freelist: 660. +num_chunk_merges: 0. +num_chunk_splits: 425. +num_chunks_enlarged: 309. +num_purges: 0. +num_inconsistent_stats: 0. + +CodeHeap 'non-profiled nmethods': size=120032Kb used=701Kb max_used=701Kb free=119331Kb + bounds [0x0000000116088000, 0x00000001162f8000, 0x000000011d5c0000] +CodeHeap 'profiled nmethods': size=120016Kb used=3675Kb max_used=3675Kb free=116340Kb + bounds [0x000000010eb54000, 0x000000010eef4000, 0x0000000116088000] +CodeHeap 'non-nmethods': size=5712Kb used=1167Kb max_used=1232Kb free=4545Kb + bounds [0x000000010e5c0000, 0x000000010e830000, 0x000000010eb54000] + total_blobs=2254 nmethods=1785 adapters=384 + compilation: enabled + stopped_count=0, restarted_count=0 + full_count=0 + +Compilation events (20 events): +Event: 0.520 Thread 0x000000012481cc00 nmethod 1819 0x000000010eee7c90 code [0x000000010eee7e40, 0x000000010eee7fd8] +Event: 0.524 Thread 0x000000012080ae00 nmethod 1706 0x000000011612ff10 code [0x0000000116130600, 0x0000000116133f50] +Event: 0.525 Thread 0x000000012080ae00 1820 4 java.util.Arrays::copyOf (19 bytes) +Event: 0.526 Thread 0x000000012080ae00 nmethod 1820 0x0000000116136010 code [0x00000001161361c0, 0x0000000116136410] +Event: 0.528 Thread 0x000000012481cc00 1823 3 jdk.internal.misc.VM::isModuleSystemInited (13 bytes) +Event: 0.528 Thread 0x000000012481cc00 nmethod 1823 0x000000010eee8090 code [0x000000010eee8240, 0x000000010eee8428] +Event: 0.528 Thread 0x000000012481cc00 1822 3 java.util.Collections$UnmodifiableCollection$1::hasNext (10 bytes) +Event: 0.528 Thread 0x000000012481cc00 nmethod 1822 0x000000010eee8510 code [0x000000010eee86c0, 0x000000010eee8918] +Event: 0.528 Thread 0x000000012481cc00 1824 3 java.lang.ModuleLayer::boot (4 bytes) +Event: 0.528 Thread 0x000000012481cc00 nmethod 1824 0x000000010eee8a10 code [0x000000010eee8bc0, 0x000000010eee8ce8] +Event: 0.528 Thread 0x000000012080ae00 1825 4 sun.net.www.ParseUtil::firstEncodeIndex (86 bytes) +Event: 0.530 Thread 0x000000012080ae00 nmethod 1825 0x0000000116136510 code [0x00000001161366c0, 0x0000000116136950] +Event: 0.530 Thread 0x000000012481cc00 1826 3 java.lang.StackTraceElement:: (10 bytes) +Event: 0.530 Thread 0x000000012481cc00 nmethod 1826 0x000000010eee8d90 code [0x000000010eee8f40, 0x000000010eee90e8] +Event: 0.530 Thread 0x000000012481cc00 1827 s! 3 java.lang.StackTraceElement::computeFormat (71 bytes) +Event: 0.530 Thread 0x000000012481cc00 nmethod 1827 0x000000010eee9190 code [0x000000010eee9400, 0x000000010eee9d88] +Event: 0.530 Thread 0x000000012481cc00 1828 3 java.lang.StackTraceElement::isHashedInJavaBase (31 bytes) +Event: 0.530 Thread 0x000000012481cc00 nmethod 1828 0x000000010eeea090 code [0x000000010eeea2c0, 0x000000010eeea848] +Event: 0.531 Thread 0x000000012481cc00 1829 3 java.util.AbstractCollection::isEmpty (13 bytes) +Event: 0.531 Thread 0x000000012481cc00 nmethod 1829 0x000000010eeeaa10 code [0x000000010eeeabc0, 0x000000010eeeae18] + +GC Heap History (2 events): +Event: 0.323 GC heap before +{Heap before GC invocations=0 (full 0): + garbage-first heap total 524288K, used 26592K [0x00000007e0000000, 0x0000000800000000) + region size 1024K, 25 young (25600K), 0 survivors (0K) + Metaspace used 7348K, committed 7616K, reserved 1056768K + class space used 1042K, committed 1152K, reserved 1048576K +} +Event: 0.325 GC heap after +{Heap after GC invocations=1 (full 0): + garbage-first heap total 524288K, used 5602K [0x00000007e0000000, 0x0000000800000000) + region size 1024K, 4 young (4096K), 4 survivors (4096K) + Metaspace used 7348K, committed 7616K, reserved 1056768K + class space used 1042K, committed 1152K, reserved 1048576K +} + +Deoptimization events (20 events): +Event: 0.480 Thread 0x000000013580a200 DEOPT PACKING pc=0x00000001160f883c sp=0x000000016ba5de70 +Event: 0.480 Thread 0x000000013580a200 DEOPT UNPACKING pc=0x000000010e5fed1c sp=0x000000016ba5ddb0 mode 2 +Event: 0.481 Thread 0x000000013580a200 Uncommon trap: trap_request=0xffffff45 fr.pc=0x000000011611d930 relative=0x0000000000000f30 +Event: 0.481 Thread 0x000000013580a200 Uncommon trap: reason=unstable_if action=reinterpret pc=0x000000011611d930 method=sun.net.www.ParseUtil.firstEncodeIndex(Ljava/lang/String;)I @ 51 c2 +Event: 0.481 Thread 0x000000013580a200 DEOPT PACKING pc=0x000000011611d930 sp=0x000000016ba61050 +Event: 0.481 Thread 0x000000013580a200 DEOPT UNPACKING pc=0x000000010e5fed1c sp=0x000000016ba60ea0 mode 2 +Event: 0.481 Thread 0x000000013580a200 Uncommon trap: trap_request=0xffffff45 fr.pc=0x00000001160e0810 relative=0x00000000000000d0 +Event: 0.481 Thread 0x000000013580a200 Uncommon trap: reason=unstable_if action=reinterpret pc=0x00000001160e0810 method=sun.net.www.ParseUtil.firstEncodeIndex(Ljava/lang/String;)I @ 51 c2 +Event: 0.481 Thread 0x000000013580a200 DEOPT PACKING pc=0x00000001160e0810 sp=0x000000016ba60ec0 +Event: 0.481 Thread 0x000000013580a200 DEOPT UNPACKING pc=0x000000010e5fed1c sp=0x000000016ba60e40 mode 2 +Event: 0.491 Thread 0x000000013580a200 DEOPT PACKING pc=0x000000010eeb8f84 sp=0x000000016ba60f10 +Event: 0.491 Thread 0x000000013580a200 DEOPT UNPACKING pc=0x000000010e5feb7c sp=0x000000016ba60c30 mode 0 +Event: 0.500 Thread 0x000000013580a200 DEOPT PACKING pc=0x000000010eeb8f84 sp=0x000000016ba60ca0 +Event: 0.500 Thread 0x000000013580a200 DEOPT UNPACKING pc=0x000000010e5feb7c sp=0x000000016ba609c0 mode 0 +Event: 0.506 Thread 0x000000013580a200 DEOPT PACKING pc=0x000000010eeb8f84 sp=0x000000016ba60c90 +Event: 0.506 Thread 0x000000013580a200 DEOPT UNPACKING pc=0x000000010e5feb7c sp=0x000000016ba609b0 mode 0 +Event: 0.519 Thread 0x000000013580a200 DEOPT PACKING pc=0x000000010eeb8f84 sp=0x000000016ba61bd0 +Event: 0.519 Thread 0x000000013580a200 DEOPT UNPACKING pc=0x000000010e5feb7c sp=0x000000016ba618f0 mode 0 +Event: 0.528 Thread 0x000000013580a200 DEOPT PACKING pc=0x000000010eeb8f84 sp=0x000000016ba5eaa0 +Event: 0.528 Thread 0x000000013580a200 DEOPT UNPACKING pc=0x000000010e5feb7c sp=0x000000016ba5e7c0 mode 0 + +Classes unloaded (0 events): +No events + +Classes redefined (0 events): +No events + +Internal exceptions (20 events): +Event: 0.286 Thread 0x000000013580a200 Exception (0x00000007fe846568) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] +Event: 0.289 Thread 0x000000013580a200 Exception (0x00000007fe899f88) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] +Event: 0.289 Thread 0x000000013580a200 Exception (0x00000007fe89db58) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 833] +Event: 0.290 Thread 0x000000013580a200 Exception (0x00000007fe8b4f40) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] +Event: 0.292 Thread 0x000000013580a200 Exception (0x00000007fe71a0b8) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] +Event: 0.292 Thread 0x000000013580a200 Exception (0x00000007fe71da38) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] +Event: 0.293 Thread 0x000000013580a200 Exception (0x00000007fe72d1f0) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] +Event: 0.301 Thread 0x000000013580a200 Exception (0x00000007fe631380) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] +Event: 0.303 Thread 0x000000013580a200 Exception (0x00000007fe66cc58) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] +Event: 0.316 Thread 0x000000013580a200 Exception (0x00000007fe542858) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] +Event: 0.318 Thread 0x000000013580a200 Exception (0x00000007fe57af18) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] +Event: 0.318 Thread 0x000000013580a200 Exception (0x00000007fe57fad0) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] +Event: 0.319 Thread 0x000000013580a200 Exception (0x00000007fe58b530) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] +Event: 0.319 Thread 0x000000013580a200 Exception (0x00000007fe58f328) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 833] +Event: 0.322 Thread 0x000000013580a200 Exception (0x00000007fe5e46b8) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 833] +Event: 0.431 Thread 0x000000013580a200 Exception (0x00000007fee7a410) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] +Event: 0.432 Thread 0x000000013580a200 Exception (0x00000007fee84300) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 833] +Event: 0.432 Thread 0x000000013580a200 Exception (0x00000007fee87a70) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] +Event: 0.432 Thread 0x000000013580a200 Exception (0x00000007fee8dea8) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] +Event: 0.452 Thread 0x000000013580a200 Exception (0x00000007feb660a8) +thrown [src/hotspot/share/classfile/systemDictionary.cpp, line 256] + +VM Operations (20 events): +Event: 0.185 Executing VM operation: ICBufferFull +Event: 0.185 Executing VM operation: ICBufferFull done +Event: 0.215 Executing VM operation: HandshakeAllThreads +Event: 0.215 Executing VM operation: HandshakeAllThreads done +Event: 0.226 Executing VM operation: HandshakeAllThreads +Event: 0.226 Executing VM operation: HandshakeAllThreads done +Event: 0.237 Executing VM operation: HandshakeAllThreads +Event: 0.237 Executing VM operation: HandshakeAllThreads done +Event: 0.300 Executing VM operation: ICBufferFull +Event: 0.301 Executing VM operation: ICBufferFull done +Event: 0.320 Executing VM operation: HandshakeAllThreads +Event: 0.320 Executing VM operation: HandshakeAllThreads done +Event: 0.323 Executing VM operation: G1CollectForAllocation +Event: 0.325 Executing VM operation: G1CollectForAllocation done +Event: 0.403 Executing VM operation: ICBufferFull +Event: 0.403 Executing VM operation: ICBufferFull done +Event: 0.462 Executing VM operation: ICBufferFull +Event: 0.462 Executing VM operation: ICBufferFull done +Event: 0.512 Executing VM operation: ICBufferFull +Event: 0.512 Executing VM operation: ICBufferFull done + +Events (20 events): +Event: 0.522 loading class java/util/concurrent/CompletableFuture$AltResult done +Event: 0.522 loading class java/util/concurrent/CompletableFuture$Completion +Event: 0.522 loading class java/util/concurrent/CompletableFuture$AsynchronousCompletionTask +Event: 0.522 loading class java/util/concurrent/CompletableFuture$AsynchronousCompletionTask done +Event: 0.522 loading class java/util/concurrent/CompletableFuture$Completion done +Event: 0.527 loading class sun/misc/SharedSecrets +Event: 0.527 loading class sun/misc/SharedSecrets done +Event: 0.528 loading class java/lang/StackTraceElement$HashedModules +Event: 0.528 loading class java/lang/StackTraceElement$HashedModules done +Event: 0.538 loading class java/util/concurrent/CompletableFuture$UniApply +Event: 0.538 loading class java/util/concurrent/CompletableFuture$UniCompletion +Event: 0.538 loading class java/util/concurrent/CompletableFuture$UniCompletion done +Event: 0.538 loading class java/util/concurrent/CompletableFuture$UniApply done +Event: 0.538 Thread 0x00000001369a0400 Thread added: 0x00000001369a0400 +Event: 0.538 Protecting memory [0x000000016f8f0000,0x000000016f8fc000] with protection modes 0 +Event: 0.539 Loading shared library /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libglide_rs.dylib failed, dlopen(/Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libglide_rs.dylib, 0x0001): tried: +Event: 0.539 Loading shared library /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libglide_rs.jnilib failed, dlopen(/Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libglide_rs.jnilib, 0x0001): tried +Event: 0.539 loading class java/util/concurrent/CompletableFuture$Signaller +Event: 0.539 loading class java/util/concurrent/CompletableFuture$Signaller done +Event: 0.541 Loaded shared library /Users/andrewc/git/bq/babushka/java/target/release/libglide_rs.dylib + + +Dynamic libraries: +0x0000000104aa4000 /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libjli.dylib +0x0000000195f50000 /usr/lib/libz.1.dylib +0x000000019600d000 /usr/lib/libSystem.B.dylib +0x0000000196007000 /usr/lib/system/libcache.dylib +0x0000000195fc2000 /usr/lib/system/libcommonCrypto.dylib +0x0000000195fee000 /usr/lib/system/libcompiler_rt.dylib +0x0000000195fe4000 /usr/lib/system/libcopyfile.dylib +0x00000001894f3000 /usr/lib/system/libcorecrypto.dylib +0x00000001895c9000 /usr/lib/system/libdispatch.dylib +0x0000000189784000 /usr/lib/system/libdyld.dylib +0x0000000195ffd000 /usr/lib/system/libkeymgr.dylib +0x0000000195f9a000 /usr/lib/system/libmacho.dylib +0x0000000195533000 /usr/lib/system/libquarantine.dylib +0x0000000195ffa000 /usr/lib/system/libremovefile.dylib +0x000000018ee4e000 /usr/lib/system/libsystem_asl.dylib +0x000000018948c000 /usr/lib/system/libsystem_blocks.dylib +0x0000000189613000 /usr/lib/system/libsystem_c.dylib +0x0000000195ff2000 /usr/lib/system/libsystem_collections.dylib +0x000000019480e000 /usr/lib/system/libsystem_configuration.dylib +0x000000019388e000 /usr/lib/system/libsystem_containermanager.dylib +0x0000000195c39000 /usr/lib/system/libsystem_coreservices.dylib +0x000000018cb22000 /usr/lib/system/libsystem_darwin.dylib +0x000000022aafa000 /usr/lib/system/libsystem_darwindirectory.dylib +0x0000000195ffe000 /usr/lib/system/libsystem_dnssd.dylib +0x0000000189610000 /usr/lib/system/libsystem_featureflags.dylib +0x00000001897b1000 /usr/lib/system/libsystem_info.dylib +0x0000000195f5f000 /usr/lib/system/libsystem_m.dylib +0x0000000189592000 /usr/lib/system/libsystem_malloc.dylib +0x000000018edbe000 /usr/lib/system/libsystem_networkextension.dylib +0x000000018cf95000 /usr/lib/system/libsystem_notify.dylib +0x0000000194813000 /usr/lib/system/libsystem_sandbox.dylib +0x0000000195ff7000 /usr/lib/system/libsystem_secinit.dylib +0x000000018973c000 /usr/lib/system/libsystem_kernel.dylib +0x00000001897aa000 /usr/lib/system/libsystem_platform.dylib +0x0000000189777000 /usr/lib/system/libsystem_pthread.dylib +0x0000000190823000 /usr/lib/system/libsystem_symptoms.dylib +0x00000001894d8000 /usr/lib/system/libsystem_trace.dylib +0x0000000195fd0000 /usr/lib/system/libunwind.dylib +0x0000000189491000 /usr/lib/system/libxpc.dylib +0x0000000189720000 /usr/lib/libc++abi.dylib +0x00000001893a8000 /usr/lib/libobjc.A.dylib +0x0000000195fdc000 /usr/lib/liboah.dylib +0x0000000189692000 /usr/lib/libc++.1.dylib +0x00000001a3479000 /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa +0x000000018cffd000 /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit +0x0000000190031000 /System/Library/Frameworks/CoreData.framework/Versions/A/CoreData +0x000000018a909000 /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation +0x000000018e318000 /System/Library/PrivateFrameworks/UIFoundation.framework/Versions/A/UIFoundation +0x000000020020e000 /System/Library/PrivateFrameworks/CollectionViewCore.framework/Versions/A/CollectionViewCore +0x000000019d1b1000 /System/Library/PrivateFrameworks/RemoteViewServices.framework/Versions/A/RemoteViewServices +0x00000001940b0000 /System/Library/PrivateFrameworks/XCTTargetBootstrap.framework/Versions/A/XCTTargetBootstrap +0x00000001985f6000 /System/Library/PrivateFrameworks/InternationalSupport.framework/Versions/A/InternationalSupport +0x000000019867e000 /System/Library/PrivateFrameworks/UserActivity.framework/Versions/A/UserActivity +0x00000002224d6000 /System/Library/PrivateFrameworks/WindowManagement.framework/Versions/A/WindowManagement +0x000000018a593000 /System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration +0x0000000197a98000 /usr/lib/libspindump.dylib +0x000000018e4cd000 /System/Library/Frameworks/UniformTypeIdentifiers.framework/Versions/A/UniformTypeIdentifiers +0x0000000192007000 /usr/lib/libapp_launch_measurement.dylib +0x0000000191419000 /System/Library/PrivateFrameworks/CoreAnalytics.framework/Versions/A/CoreAnalytics +0x000000019200e000 /System/Library/PrivateFrameworks/CoreAutoLayout.framework/Versions/A/CoreAutoLayout +0x00000001938da000 /System/Library/Frameworks/Metal.framework/Versions/A/Metal +0x0000000194820000 /usr/lib/liblangid.dylib +0x00000001940b6000 /System/Library/PrivateFrameworks/CoreSVG.framework/Versions/A/CoreSVG +0x000000018ee87000 /System/Library/PrivateFrameworks/SkyLight.framework/Versions/A/SkyLight +0x000000018f31d000 /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics +0x000000019d8f9000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate +0x00000001978f6000 /System/Library/PrivateFrameworks/IconServices.framework/Versions/A/IconServices +0x00000001938b8000 /System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface +0x0000000191448000 /usr/lib/libDiagnosticMessagesClient.dylib +0x00000001a0fe7000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices +0x0000000194098000 /System/Library/PrivateFrameworks/DFRFoundation.framework/Versions/A/DFRFoundation +0x000000018c869000 /usr/lib/libicucore.A.dylib +0x000000019965b000 /System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox +0x0000000198603000 /System/Library/PrivateFrameworks/DataDetectorsCore.framework/Versions/A/DataDetectorsCore +0x00000001b1851000 /System/Library/PrivateFrameworks/TextInput.framework/Versions/A/TextInput +0x000000018edda000 /usr/lib/libMobileGestalt.dylib +0x0000000193dd8000 /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/HIToolbox +0x000000019191a000 /System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore +0x000000018c4a7000 /System/Library/Frameworks/Security.framework/Versions/A/Security +0x000000019d1f1000 /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/SpeechRecognition.framework/Versions/A/SpeechRecognition +0x0000000191d35000 /System/Library/PrivateFrameworks/CoreUI.framework/Versions/A/CoreUI +0x000000018bdb4000 /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio +0x000000019152c000 /System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration +0x0000000197eee000 /System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/A/MultitouchSupport +0x000000018edd8000 /usr/lib/libenergytrace.dylib +0x00000001a744d000 /System/Library/PrivateFrameworks/RenderBox.framework/Versions/A/RenderBox +0x000000018ceb3000 /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit +0x000000019d5f5000 /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices +0x0000000191f93000 /System/Library/PrivateFrameworks/PerformanceAnalysis.framework/Versions/A/PerformanceAnalysis +0x00000001f1e60000 /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL +0x0000000192058000 /usr/lib/libxml2.2.dylib +0x000000019544d000 /System/Library/PrivateFrameworks/MobileKeyBag.framework/Versions/A/MobileKeyBag +0x000000019d572000 /System/Library/Frameworks/Accessibility.framework/Versions/A/Accessibility +0x000000018f9fa000 /System/Library/Frameworks/ColorSync.framework/Versions/A/ColorSync +0x00000001897de000 /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation +0x000000019440b000 /System/Library/Frameworks/CoreImage.framework/Versions/A/CoreImage +0x000000018bbbf000 /System/Library/Frameworks/CoreText.framework/Versions/A/CoreText +0x00000001f6662000 /System/Library/Frameworks/CoreTransferable.framework/Versions/A/CoreTransferable +0x00000001f6b44000 /System/Library/Frameworks/DeveloperToolsSupport.framework/Versions/A/DeveloperToolsSupport +0x00000001940f1000 /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO +0x00000001faa91000 /System/Library/Frameworks/Symbols.framework/Versions/A/Symbols +0x0000000196013000 /System/Library/PrivateFrameworks/SoftLinking.framework/Versions/A/SoftLinking +0x000000019902d000 /usr/lib/swift/libswiftCore.dylib +0x00000001ae582000 /usr/lib/swift/libswiftCoreFoundation.dylib +0x00000001ac213000 /usr/lib/swift/libswiftCoreGraphics.dylib +0x00000001ae5ce000 /usr/lib/swift/libswiftCoreImage.dylib +0x00000001ac21a000 /usr/lib/swift/libswiftDarwin.dylib +0x000000019ec68000 /usr/lib/swift/libswiftDispatch.dylib +0x00000001ae5cf000 /usr/lib/swift/libswiftIOKit.dylib +0x00000001b9f8b000 /usr/lib/swift/libswiftMetal.dylib +0x00000001c690d000 /usr/lib/swift/libswiftOSLog.dylib +0x00000001a1453000 /usr/lib/swift/libswiftObjectiveC.dylib +0x00000001bdbab000 /usr/lib/swift/libswiftQuartzCore.dylib +0x00000001c1bfe000 /usr/lib/swift/libswiftUniformTypeIdentifiers.dylib +0x00000001ae598000 /usr/lib/swift/libswiftXPC.dylib +0x000000022a7ce000 /usr/lib/swift/libswift_Concurrency.dylib +0x00000001a1457000 /usr/lib/swift/libswiftos.dylib +0x00000001b17b5000 /usr/lib/swift/libswiftsimd.dylib +0x00000001961c0000 /usr/lib/libcompression.dylib +0x0000000198550000 /System/Library/PrivateFrameworks/TextureIO.framework/Versions/A/TextureIO +0x00000001975a9000 /usr/lib/libate.dylib +0x000000019745c000 /usr/lib/liblzma.5.dylib +0x000000019600f000 /usr/lib/libfakelink.dylib +0x000000018e9ea000 /System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork +0x0000000196063000 /usr/lib/libarchive.2.dylib +0x000000019b4dc000 /System/Library/Frameworks/Combine.framework/Versions/A/Combine +0x0000000200222000 /System/Library/PrivateFrameworks/CollectionsInternal.framework/Versions/A/CollectionsInternal +0x000000021596a000 /System/Library/PrivateFrameworks/ReflectionInternal.framework/Versions/A/ReflectionInternal +0x0000000215f17000 /System/Library/PrivateFrameworks/RuntimeInternal.framework/Versions/A/RuntimeInternal +0x000000022a917000 /usr/lib/swift/libswift_StringProcessing.dylib +0x000000018ce32000 /System/Library/PrivateFrameworks/CoreServicesInternal.framework/Versions/A/CoreServicesInternal +0x000000019555a000 /usr/lib/libbsm.0.dylib +0x0000000195fa2000 /usr/lib/system/libkxld.dylib +0x0000000191fcf000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/FSEvents +0x000000018cb2d000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore +0x0000000191491000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Metadata +0x0000000195c3f000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/OSServices +0x00000001960ec000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SearchKit.framework/Versions/A/SearchKit +0x00000001907a5000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE +0x0000000189cb6000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/LaunchServices +0x0000000197405000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/DictionaryServices +0x0000000191fdc000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SharedFileList.framework/Versions/A/SharedFileList +0x000000019618b000 /usr/lib/libapple_nghttp2.dylib +0x0000000190427000 /usr/lib/libsqlite3.dylib +0x000000019082c000 /System/Library/Frameworks/Network.framework/Versions/A/Network +0x0000000229265000 /usr/lib/libCoreEntitlements.dylib +0x0000000210ce3000 /System/Library/PrivateFrameworks/MessageSecurity.framework/Versions/A/MessageSecurity +0x000000019040d000 /System/Library/PrivateFrameworks/ProtocolBuffer.framework/Versions/A/ProtocolBuffer +0x0000000195b68000 /System/Library/PrivateFrameworks/AppleFSCompression.framework/Versions/A/AppleFSCompression +0x0000000195542000 /usr/lib/libcoretls.dylib +0x0000000197475000 /usr/lib/libcoretls_cfhelpers.dylib +0x00000001961ba000 /usr/lib/libpam.2.dylib +0x00000001974e6000 /usr/lib/libxar.1.dylib +0x00000001978cd000 /usr/lib/libheimdal-asn1.dylib +0x000000018e9e9000 /usr/lib/libnetwork.dylib +0x0000000196014000 /usr/lib/libpcap.A.dylib +0x0000000190819000 /usr/lib/libdns_services.dylib +0x000000019481b000 /System/Library/PrivateFrameworks/AppleSystemInfo.framework/Versions/A/AppleSystemInfo +0x0000000195243000 /System/Library/PrivateFrameworks/IOMobileFramebuffer.framework/Versions/A/IOMobileFramebuffer +0x000000022a86b000 /usr/lib/swift/libswift_RegexParser.dylib +0x0000000195c2c000 /usr/lib/libbz2.1.0.dylib +0x0000000195536000 /usr/lib/libCheckFix.dylib +0x000000018ee66000 /System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC +0x0000000194822000 /System/Library/PrivateFrameworks/CoreNLP.framework/Versions/A/CoreNLP +0x000000019144a000 /System/Library/PrivateFrameworks/MetadataUtilities.framework/Versions/A/MetadataUtilities +0x000000019556c000 /usr/lib/libmecab.dylib +0x000000018a626000 /usr/lib/libCRFSuite.dylib +0x00000001955c8000 /usr/lib/libgermantok.dylib +0x0000000196163000 /usr/lib/libThaiTokenizer.dylib +0x0000000191535000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vImage.framework/Versions/A/vImage +0x000000019d5cc000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib +0x000000019752d000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvMisc.dylib +0x000000019511f000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvDSP.dylib +0x000000018a0b5000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib +0x0000000196293000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib +0x00000001955cb000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLinearAlgebra.dylib +0x00000001961a5000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libSparseBLAS.dylib +0x000000019628e000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libQuadrature.dylib +0x0000000194944000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBNNS.dylib +0x000000018a52c000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libSparse.dylib +0x000000020f559000 /System/Library/PrivateFrameworks/MIL.framework/Versions/A/MIL +0x000000019604a000 /usr/lib/libiconv.2.dylib +0x0000000195f96000 /usr/lib/libcharset.1.dylib +0x0000000191faf000 /System/Library/Frameworks/OpenDirectory.framework/Versions/A/Frameworks/CFOpenDirectory.framework/Versions/A/CFOpenDirectory +0x0000000191f9f000 /System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory +0x0000000197477000 /System/Library/PrivateFrameworks/APFS.framework/Versions/A/APFS +0x0000000195473000 /System/Library/Frameworks/SecurityFoundation.framework/Versions/A/SecurityFoundation +0x00000001974f5000 /usr/lib/libutil.dylib +0x000000020d78e000 /System/Library/PrivateFrameworks/InstalledContentLibrary.framework/Versions/A/InstalledContentLibrary +0x000000018ce72000 /System/Library/PrivateFrameworks/CoreServicesStore.framework/Versions/A/CoreServicesStore +0x00000001fddd6000 /System/Library/PrivateFrameworks/AppleMobileFileIntegrity.framework/Versions/A/AppleMobileFileIntegrity +0x00000001ae560000 /usr/lib/libmis.dylib +0x00000001be072000 /System/Library/PrivateFrameworks/MobileSystemServices.framework/Versions/A/MobileSystemServices +0x00000001ef2c8000 /System/Library/PrivateFrameworks/ConfigProfileHelper.framework/Versions/A/ConfigProfileHelper +0x0000000196165000 /System/Library/PrivateFrameworks/AppleSauce.framework/Versions/A/AppleSauce +0x000000018b551000 /System/Library/PrivateFrameworks/LanguageModeling.framework/Versions/A/LanguageModeling +0x00000001974f9000 /usr/lib/libxslt.1.dylib +0x0000000196051000 /usr/lib/libcmph.dylib +0x0000000195210000 /System/Library/PrivateFrameworks/CoreEmoji.framework/Versions/A/CoreEmoji +0x000000019493e000 /System/Library/PrivateFrameworks/LinguisticData.framework/Versions/A/LinguisticData +0x000000018a43f000 /System/Library/PrivateFrameworks/Lexicon.framework/Versions/A/Lexicon +0x0000000195501000 /System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/BackgroundTaskManagement +0x000000022944e000 /usr/lib/libTLE.dylib +0x0000000197db4000 /System/Library/PrivateFrameworks/AppleJPEG.framework/Versions/A/AppleJPEG +0x00000001978b2000 /usr/lib/libexpat.1.dylib +0x00000001983ae000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libPng.dylib +0x00000001983d9000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib +0x00000001984c4000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libGIF.dylib +0x0000000197dfa000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJP2.dylib +0x0000000198469000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJPEG.dylib +0x0000000198460000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libRadiance.dylib +0x0000000193c73000 /System/Library/PrivateFrameworks/FontServices.framework/libFontParser.dylib +0x0000000190743000 /System/Library/PrivateFrameworks/RunningBoardServices.framework/Versions/A/RunningBoardServices +0x00000001a3d0d000 /System/Library/PrivateFrameworks/IOSurfaceAccelerator.framework/Versions/A/IOSurfaceAccelerator +0x0000000197eea000 /System/Library/PrivateFrameworks/WatchdogClient.framework/Versions/A/WatchdogClient +0x000000018b734000 /System/Library/Frameworks/CoreDisplay.framework/Versions/A/CoreDisplay +0x0000000193b2c000 /System/Library/Frameworks/CoreMedia.framework/Versions/A/CoreMedia +0x00000001938d0000 /System/Library/PrivateFrameworks/IOAccelerator.framework/Versions/A/IOAccelerator +0x0000000192142000 /System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo +0x00000001961b8000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/MetalPerformanceShaders +0x0000000197f2d000 /System/Library/Frameworks/VideoToolbox.framework/Versions/A/VideoToolbox +0x00000001921dd000 /System/Library/PrivateFrameworks/UserManagement.framework/Versions/A/UserManagement +0x0000000190672000 /System/Library/PrivateFrameworks/BaseBoard.framework/Versions/A/BaseBoard +0x0000000194819000 /System/Library/PrivateFrameworks/AggregateDictionary.framework/Versions/A/AggregateDictionary +0x00000001fdd56000 /System/Library/PrivateFrameworks/AppleKeyStore.framework/Versions/A/AppleKeyStore +0x000000019845b000 /System/Library/PrivateFrameworks/GPUWrangler.framework/Versions/A/GPUWrangler +0x000000019843b000 /System/Library/PrivateFrameworks/IOPresentment.framework/Versions/A/IOPresentment +0x0000000198463000 /System/Library/PrivateFrameworks/DSExternalDisplay.framework/Versions/A/DSExternalDisplay +0x0000000209900000 /System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/32023/Libraries/libllvm-flatbuffers.dylib +0x00000001f1e53000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreFSCache.dylib +0x0000000206b38000 /System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/32023/Libraries/libGPUCompilerUtils.dylib +0x00000001984ca000 /System/Library/PrivateFrameworks/CMCaptureCore.framework/Versions/A/CMCaptureCore +0x00000001f6c49000 /System/Library/Frameworks/ExtensionFoundation.framework/Versions/A/ExtensionFoundation +0x000000019f4a4000 /System/Library/PrivateFrameworks/CoreTime.framework/Versions/A/CoreTime +0x0000000197a83000 /System/Library/PrivateFrameworks/AppServerSupport.framework/Versions/A/AppServerSupport +0x0000000199fdb000 /System/Library/PrivateFrameworks/perfdata.framework/Versions/A/perfdata +0x000000018b858000 /System/Library/PrivateFrameworks/AudioToolboxCore.framework/Versions/A/AudioToolboxCore +0x0000000193b02000 /System/Library/PrivateFrameworks/caulk.framework/Versions/A/caulk +0x0000000199856000 /usr/lib/libAudioStatistics.dylib +0x00000001ad8bc000 /System/Library/PrivateFrameworks/SystemPolicy.framework/Versions/A/SystemPolicy +0x0000000199b2e000 /usr/lib/libSMC.dylib +0x00000001a3308000 /System/Library/Frameworks/CoreMIDI.framework/Versions/A/CoreMIDI +0x0000000198375000 /usr/lib/libAudioToolboxUtility.dylib +0x00000001a90f2000 /System/Library/PrivateFrameworks/OSAServicesClient.framework/Versions/A/OSAServicesClient +0x0000000199fe9000 /usr/lib/libperfcheck.dylib +0x000000019779c000 /System/Library/PrivateFrameworks/PlugInKit.framework/Versions/A/PlugInKit +0x0000000195465000 /System/Library/PrivateFrameworks/AssertionServices.framework/Versions/A/AssertionServices +0x00000001a241d000 /System/Library/PrivateFrameworks/ASEProcessing.framework/Versions/A/ASEProcessing +0x00000001c9cc4000 /System/Library/PrivateFrameworks/Symbolication.framework/Versions/A/Symbolication +0x00000002149db000 /System/Library/PrivateFrameworks/PhotosensitivityProcessing.framework/Versions/A/PhotosensitivityProcessing +0x0000000197a35000 /System/Library/PrivateFrameworks/GraphVisualizer.framework/Versions/A/GraphVisualizer +0x00000001f1eb5000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.dylib +0x00000001f1e74000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGFXShared.dylib +0x00000001f204d000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib +0x00000001f1e7d000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLImage.dylib +0x00000001f1e71000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCVMSPluginSupport.dylib +0x0000000229407000 /usr/lib/libRosetta.dylib +0x00000001f1e5a000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreVMClient.dylib +0x0000000204ef2000 /System/Library/PrivateFrameworks/FontServices.framework/Versions/A/FontServices +0x0000000197a41000 /System/Library/PrivateFrameworks/OTSVG.framework/Versions/A/OTSVG +0x0000000191ce3000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontRegistry.dylib +0x0000000197a8d000 /System/Library/PrivateFrameworks/FontServices.framework/libhvf.dylib +0x0000000204ef3000 /System/Library/PrivateFrameworks/FontServices.framework/libXTFontStaticRegistryData.dylib +0x0000000194790000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSCore.framework/Versions/A/MPSCore +0x0000000195adb000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSImage.framework/Versions/A/MPSImage +0x00000001955e0000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSNeuralNetwork.framework/Versions/A/MPSNeuralNetwork +0x00000001959ce000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSMatrix.framework/Versions/A/MPSMatrix +0x00000001957da000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSRayIntersector.framework/Versions/A/MPSRayIntersector +0x00000001959fd000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSNDArray.framework/Versions/A/MPSNDArray +0x00000001f8321000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSFunctions.framework/Versions/A/MPSFunctions +0x00000001f8303000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSBenchmarkLoop.framework/Versions/A/MPSBenchmarkLoop +0x0000000189f6a000 /System/Library/PrivateFrameworks/MetalTools.framework/Versions/A/MetalTools +0x00000001b2971000 /System/Library/PrivateFrameworks/IOAccelMemoryInfo.framework/Versions/A/IOAccelMemoryInfo +0x00000001bdf7f000 /System/Library/PrivateFrameworks/kperf.framework/Versions/A/kperf +0x00000001ae574000 /System/Library/PrivateFrameworks/GPURawCounter.framework/Versions/A/GPURawCounter +0x000000019f394000 /System/Library/PrivateFrameworks/CoreSymbolication.framework/Versions/A/CoreSymbolication +0x00000001ae531000 /System/Library/PrivateFrameworks/MallocStackLogging.framework/Versions/A/MallocStackLogging +0x0000000197643000 /System/Library/PrivateFrameworks/CrashReporterSupport.framework/Versions/A/CrashReporterSupport +0x000000019f34f000 /System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols +0x00000001bd2bd000 /System/Library/PrivateFrameworks/OSAnalytics.framework/Versions/A/OSAnalytics +0x0000000220990000 /System/Library/PrivateFrameworks/VideoToolboxParavirtualizationSupport.framework/Versions/A/VideoToolboxParavirtualizationSupport +0x0000000197866000 /System/Library/PrivateFrameworks/AppleVA.framework/Versions/A/AppleVA +0x000000019989e000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/ATS +0x000000018fba9000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/HIServices +0x00000001984d8000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/PrintCore +0x0000000199c87000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/QD.framework/Versions/A/QD +0x0000000199c7b000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ColorSyncLegacy.framework/Versions/A/ColorSyncLegacy +0x000000019986e000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/SpeechSynthesis.framework/Versions/A/SpeechSynthesis +0x0000000198494000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATSUI.framework/Versions/A/ATSUI +0x0000000199c0e000 /usr/lib/libcups.2.dylib +0x0000000199ff7000 /System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos +0x000000019a008000 /System/Library/Frameworks/GSS.framework/Versions/A/GSS +0x000000019991d000 /usr/lib/libresolv.9.dylib +0x0000000197a9e000 /System/Library/PrivateFrameworks/Heimdal.framework/Versions/A/Heimdal +0x00000001a13bf000 /System/Library/Frameworks/Kerberos.framework/Versions/A/Libraries/libHeimdalProxy.dylib +0x000000019a062000 /System/Library/PrivateFrameworks/CommonAuth.framework/Versions/A/CommonAuth +0x00000001f5a4a000 /System/Library/Frameworks/AVFAudio.framework/Versions/A/AVFAudio +0x00000001a9141000 /System/Library/PrivateFrameworks/AXCoreUtilities.framework/Versions/A/AXCoreUtilities +0x00000001997da000 /System/Library/PrivateFrameworks/AudioSession.framework/Versions/A/AudioSession +0x000000019b27f000 /System/Library/Frameworks/IOBluetooth.framework/Versions/A/IOBluetooth +0x0000000197971000 /System/Library/PrivateFrameworks/MediaExperience.framework/Versions/A/MediaExperience +0x000000019961d000 /System/Library/PrivateFrameworks/AudioSession.framework/libSessionUtility.dylib +0x0000000199c93000 /System/Library/PrivateFrameworks/AudioResourceArbitration.framework/Versions/A/AudioResourceArbitration +0x000000019e322000 /System/Library/PrivateFrameworks/PowerLog.framework/Versions/A/PowerLog +0x000000019e245000 /System/Library/Frameworks/CoreBluetooth.framework/Versions/A/CoreBluetooth +0x00000001a13c0000 /System/Library/Frameworks/AudioUnit.framework/Versions/A/AudioUnit +0x00000001952d0000 /System/Library/PrivateFrameworks/CoreUtils.framework/Versions/A/CoreUtils +0x0000000203368000 /System/Library/PrivateFrameworks/CoreUtilsExtras.framework/Versions/A/CoreUtilsExtras +0x000000020d625000 /System/Library/PrivateFrameworks/IO80211.framework/Versions/A/IO80211 +0x00000001a915c000 /usr/lib/libAccessibility.dylib +0x000000019d945000 /System/Library/Frameworks/MediaAccessibility.framework/Versions/A/MediaAccessibility +0x000000019eecb000 /System/Library/PrivateFrameworks/FrontBoardServices.framework/Versions/A/FrontBoardServices +0x00000001a099d000 /System/Library/PrivateFrameworks/BackBoardServices.framework/Versions/A/BackBoardServices +0x000000019ef85000 /System/Library/PrivateFrameworks/BoardServices.framework/Versions/A/BoardServices +0x00000001978d8000 /System/Library/PrivateFrameworks/IconFoundation.framework/Versions/A/IconFoundation +0x000000019d1dd000 /System/Library/PrivateFrameworks/SpeechRecognitionCore.framework/Versions/A/SpeechRecognitionCore +0x00000001cd0d6000 /System/Library/Frameworks/OSLog.framework/Versions/A/OSLog +0x00000001ae4c1000 /System/Library/PrivateFrameworks/LoggingSupport.framework/Versions/A/LoggingSupport +0x0000000105b38000 /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/server/libjvm.dylib +0x0000000104650000 /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libjimage.dylib +0x0000000104698000 /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libjava.dylib +0x00000001049c8000 /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libnio.dylib +0x0000000104a0c000 /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libnet.dylib +0x00000001049e8000 /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libzip.dylib +0x0000000105534000 /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libverify.dylib +0x0000000105550000 /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libextnet.dylib +0x00000001254a8000 /Users/andrewc/git/bq/babushka/java/target/release/libglide_rs.dylib + + +VM Arguments: +jvm_args: -Djava.library.path=/Users/andrewc/git/bq/babushka/java/client/../target/release:/Users/andrewc/git/bq/babushka/java/client/../target/debug -Dorg.gradle.internal.worker.tmpdir=/Users/andrewc/git/bq/babushka/java/client/build/tmp/test/work -Dorg.gradle.native=false -Xmx512m -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en -Duser.variant -ea +java_command: worker.org.gradle.process.internal.worker.GradleWorkerMain 'Gradle Test Executor 12' +java_class_path (initial): /Users/andrewc/.gradle/caches/8.3/workerMain/gradle-worker.jar:/Users/andrewc/git/bq/babushka/java/client/build/classes/java/test:/Users/andrewc/git/bq/babushka/java/client/build/classes/java/main:/Users/andrewc/.gradle/caches/modules-2/files-2.1/com.google.protobuf/protobuf-java/3.24.3/8e0f08a59c21e3f17121667489a005a8df091af0/protobuf-java-3.24.3.jar:/Users/andrewc/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.13.0/b7263237aa89c1f99b327197c41d0669707a462e/commons-lang3-3.13.0.jar:/Users/andrewc/.gradle/caches/modules-2/files-2.1/io.netty/netty-handler/4.1.100.Final/4c0acdb8bb73647ebb3847ac2d503d53d72c02b4/netty-handler-4.1.100.Final.jar:/Users/andrewc/.gradle/caches/modules-2/files-2.1/io.netty/netty-transport-native-epoll/4.1.100.Final/d83003b8eac838e4bc3f7662a22f9f2d879c0fe4/netty-transport-native-epoll-4.1.100.Final-linux-x86_64.jar:/Users/andrewc/.gradle/caches/modules-2/files-2.1/io.netty/netty-transport-native-kqueue/4.1.100.Final/135c3a560a4fb84b0e2084f376610347483e2e8a/netty-transport-native-kqueue-4.1.100.Final-osx-x86_64.jar:/Users/andrewc/.gradle/caches/modules-2/files-2.1/io.netty/netty-transport-native-kqueue/4.1.100.Final/2d75a8e80a75def2b61bac1ea5f66d184f5069f0/netty-transport-native-kqueue-4.1.100.Final-osx-aarch_64.jar:/Users/andrewc/.gradle/caches/modules-2/files-2.1/org.mockito/mockito-junit-jupiter/3.12.4/c42cc385c3a953fb0cdcea39209ea374fbc6824c/mockito-junit-jupiter-3.12.4.jar:/Users/andrewc/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-params/5.7.2/685f832f8c54dd40100f646d61aca88ed9545421/junit-jupiter-params-5.7.2.jar:/Users/andrewc/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-engine/5.7.2/9415680a889f00b8205a094c5c487bc69dc7077d/junit-jupiter-engine-5.7.2.jar:/Users/andrewc/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-api/5.7.2/f4b4079732a9c537983324cfa4e46655f21d2c56/junit-jupiter-api-5.7.2.jar:/Users/andrewc/.gradle/caches/ +Launcher Type: SUN_STANDARD + +[Global flags] + intx CICompilerCount = 4 {product} {ergonomic} + uint ConcGCThreads = 2 {product} {ergonomic} + uint G1ConcRefinementThreads = 9 {product} {ergonomic} + size_t G1HeapRegionSize = 1048576 {product} {ergonomic} + uintx GCDrainStackTargetSize = 64 {product} {ergonomic} + size_t InitialHeapSize = 536870912 {product} {ergonomic} + size_t MarkStackSize = 4194304 {product} {ergonomic} + size_t MaxHeapSize = 536870912 {product} {command line} + size_t MaxNewSize = 321912832 {product} {ergonomic} + size_t MinHeapDeltaBytes = 1048576 {product} {ergonomic} + size_t MinHeapSize = 8388608 {product} {ergonomic} + uintx NonNMethodCodeHeapSize = 5839564 {pd product} {ergonomic} + uintx NonProfiledCodeHeapSize = 122909338 {pd product} {ergonomic} + uintx ProfiledCodeHeapSize = 122909338 {pd product} {ergonomic} + uintx ReservedCodeCacheSize = 251658240 {pd product} {ergonomic} + bool SegmentedCodeCache = true {product} {ergonomic} + size_t SoftMaxHeapSize = 536870912 {manageable} {ergonomic} + bool UseCompressedClassPointers = true {product lp64_product} {ergonomic} + bool UseCompressedOops = true {product lp64_product} {ergonomic} + bool UseG1GC = true {product} {ergonomic} + bool UseNUMA = false {product} {ergonomic} + bool UseNUMAInterleaving = false {product} {ergonomic} + +Logging: +Log output configuration: + #0: stdout all=warning uptime,level,tags + #1: stderr all=off uptime,level,tags + +Environment Variables: +JAVA_HOME=/Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home +PATH=/opt/homebrew/opt/node@16/bin:/usr/local/mysql/bin:/opt/homebrew/opt/ruby/bin:/Users/andrewc/Library/Python/3.8/bin:/opt/homebrew/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/usr/local/MacGPG2/bin:/Users/andrewc/.cargo/bin +SHELL=/bin/zsh +LC_CTYPE=en_CA.UTF-8 + +Signal Handlers: + SIGSEGV: crash_handler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO + SIGBUS: crash_handler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO + SIGFPE: crash_handler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO + SIGPIPE: javaSignalHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO + SIGXFSZ: javaSignalHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO + SIGILL: crash_handler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO + SIGUSR2: SR_handler in libjvm.dylib, mask=00100000000000000000000000000000, flags=SA_RESTART|SA_SIGINFO + SIGHUP: UserHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO + SIGINT: UserHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO + SIGTERM: UserHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO + SIGQUIT: UserHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO + *** Handler was modified! + *** Expected: javaSignalHandler in libjvm.dylib, mask=11100110100111111111111111111111, flags=SA_RESTART|SA_SIGINFO + SIGTRAP: crash_handler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO + + +--------------- S Y S T E M --------------- + +OS: +uname: Darwin 23.2.0 Darwin Kernel Version 23.2.0: Wed Nov 15 21:53:18 PST 2023; root:xnu-10002.61.3~2/RELEASE_ARM64_T6000 arm64 +OS uptime: 7 days 6:34 hours +rlimit (soft/hard): STACK 8176k/65520k , CORE 0k/infinity , NPROC 10666/16000 , NOFILE 10240/infinity , AS infinity/infinity , CPU infinity/infinity , DATA infinity/infinity , FSIZE infinity/infinity , MEMLOCK infinity/infinity , RSS infinity/infinity +load average: 6.70 7.17 7.87 + +CPU: total 10 (initial active 10) 0x61:0x0:0x1b588bb3:0, fp, simd, crc, lse + +Memory: 16k page, physical 67108864k(2424576k free), swap 0k(0k free) + +vm_info: OpenJDK 64-Bit Server VM (17.0.3+6-LTS) for bsd-aarch64 JRE (17.0.3+6-LTS), built on Apr 16 2022 17:14:31 by "jenkins" with clang Apple LLVM 13.0.0 (clang-1300.0.29.30) + +END. diff --git a/java/client/src/main/java/glide/api/RedisClient.java b/java/client/src/main/java/glide/api/RedisClient.java index 5bc1544019..ee49b7803c 100644 --- a/java/client/src/main/java/glide/api/RedisClient.java +++ b/java/client/src/main/java/glide/api/RedisClient.java @@ -16,20 +16,13 @@ public class RedisClient extends BaseClient { public static CompletableFuture CreateClient() { - RedisClientConfiguration config = - RedisClientConfiguration.builder() - .address(NodeAddress.builder().build()) - .useTLS(false) - .build(); - - return CreateClient(config); + return CreateClient(RedisClientConfiguration.builder().build()); } public static CompletableFuture CreateClient(String host, Integer port) { RedisClientConfiguration config = RedisClientConfiguration.builder() .address(NodeAddress.builder().host(host).port(port).build()) - .useTLS(false) .build(); return CreateClient(config); @@ -46,7 +39,7 @@ public static CompletableFuture CreateClient(RedisClientConfigurati CallbackDispatcher callbackDispatcher = new CallbackDispatcher(); ChannelHandler channelHandler = new ChannelHandler(callbackDispatcher, getSocket()); - var connectionManager = new ConnectionManager(); + var connectionManager = new ConnectionManager(channelHandler); var commandManager = new CommandManager(new CompletableFuture<>()); // TODO: send request with configuration to connection Manager as part of a follow-up PR return CreateClient(config, connectionManager, commandManager); @@ -57,11 +50,7 @@ private static CompletableFuture CreateClient( ConnectionManager connectionManager, CommandManager commandManager) { return connectionManager - .connectToRedis( - config.getAddresses().get(0).getHost(), - config.getAddresses().get(0).getPort(), - config.isUseTLS(), - false) + .connectToRedis(config) .thenApplyAsync(ignore -> new RedisClient(connectionManager, commandManager)); } diff --git a/java/client/src/main/java/glide/api/RequestBuilder.java b/java/client/src/main/java/glide/api/RequestBuilder.java deleted file mode 100644 index 385347883a..0000000000 --- a/java/client/src/main/java/glide/api/RequestBuilder.java +++ /dev/null @@ -1,63 +0,0 @@ -package glide.api; - -import connection_request.ConnectionRequestOuterClass.ConnectionRequest; -import connection_request.ConnectionRequestOuterClass.NodeAddress; -import connection_request.ConnectionRequestOuterClass.ReadFrom; -import connection_request.ConnectionRequestOuterClass.TlsMode; -import glide.api.models.configuration.BaseClientConfiguration; -import glide.managers.CallbackManager; -import java.util.List; -import redis_request.RedisRequestOuterClass.Command; -import redis_request.RedisRequestOuterClass.Command.ArgsArray; -import redis_request.RedisRequestOuterClass.RedisRequest; -import redis_request.RedisRequestOuterClass.RequestType; -import redis_request.RedisRequestOuterClass.Routes; -import redis_request.RedisRequestOuterClass.SimpleRoutes; - -public class RequestBuilder { - - /** Build a protobuf connection request.
*/ - public static ConnectionRequest createConnectionRequest( - String host, int port, boolean useSsl, boolean clusterMode) { - // TODO: temporary placeholder until - // https://github.com/orgs/Bit-Quill/projects/4?pane=issue&itemId=48028158 - return ConnectionRequest.newBuilder() - .addAddresses(NodeAddress.newBuilder().setHost(host).setPort(port).build()) - .setTlsMode(useSsl ? TlsMode.SecureTls : TlsMode.NoTls) - .setClusterModeEnabled(clusterMode) - .setReadFrom(ReadFrom.Primary) - .setDatabaseId(0) - .build(); - } - - /** Build a protobuf connection request.
*/ - public static ConnectionRequest createConnectionRequest(BaseClientConfiguration configuration) { - // TODO: temporary placeholder until - // https://github.com/orgs/Bit-Quill/projects/4?pane=issue&itemId=48028158 - return ConnectionRequest.newBuilder().build(); - } - - /** - * Build a protobuf command/transaction request draft. - * - * @return An uncompleted request. {@link CallbackManager} is responsible to complete it by adding - * a callback id. - */ - public static RedisRequest.Builder prepareRequest(RequestType command, List args) { - var commandArgs = ArgsArray.newBuilder(); - for (var arg : args) { - commandArgs.addArgs(arg); - } - - return RedisRequest.newBuilder() - .setSingleCommand( // set command - Command.newBuilder() - .setRequestType(command) // set command name - .setArgsArray(commandArgs.build()) // set arguments - .build()) - .setRoute( // set route - Routes.newBuilder() - .setSimpleRoutes(SimpleRoutes.AllNodes) // set route type - .build()); - } -} diff --git a/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java b/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java index cba445a1bf..41d6321ba0 100644 --- a/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java +++ b/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java @@ -3,6 +3,7 @@ import java.util.List; import lombok.Builder; import lombok.Getter; +import lombok.NonNull; import lombok.Singular; import lombok.experimental.SuperBuilder; @@ -24,7 +25,7 @@ public abstract class BaseClientConfiguration { @Builder.Default private final boolean useTLS = false; /** If not set, `PRIMARY` will be used. */ - @Builder.Default private final ReadFrom readFrom = ReadFrom.PRIMARY; + @NonNull @Builder.Default private final ReadFrom readFrom = ReadFrom.PRIMARY; /** * Credentials for authentication process. If none are set, the client will not authenticate diff --git a/java/client/src/main/java/glide/api/models/configuration/NodeAddress.java b/java/client/src/main/java/glide/api/models/configuration/NodeAddress.java index ac4b657516..96ff06e914 100644 --- a/java/client/src/main/java/glide/api/models/configuration/NodeAddress.java +++ b/java/client/src/main/java/glide/api/models/configuration/NodeAddress.java @@ -9,8 +9,8 @@ @Builder public class NodeAddress { public static String DEFAULT_HOST = "localhost"; - public static Integer PORT = 6379; + public static Integer DEFAULT_PORT = 6379; @NonNull @Builder.Default private final String host = DEFAULT_HOST; - @NonNull @Builder.Default private final Integer port = 6379; + @NonNull @Builder.Default private final Integer port = DEFAULT_PORT; } diff --git a/java/client/src/main/java/glide/ffi/resolvers/RedisValueResolver.java b/java/client/src/main/java/glide/ffi/resolvers/RedisValueResolver.java index 35dc388f98..0ab5f0a4ca 100644 --- a/java/client/src/main/java/glide/ffi/resolvers/RedisValueResolver.java +++ b/java/client/src/main/java/glide/ffi/resolvers/RedisValueResolver.java @@ -3,6 +3,11 @@ import response.ResponseOuterClass.Response; public class RedisValueResolver { + + static { + System.loadLibrary("glide_rs"); + } + /** * Resolve a value received from Redis using given C-style pointer. * diff --git a/java/client/src/main/java/glide/managers/ConnectionManager.java b/java/client/src/main/java/glide/managers/ConnectionManager.java index 47b6d0274d..dd5503a6ba 100644 --- a/java/client/src/main/java/glide/managers/ConnectionManager.java +++ b/java/client/src/main/java/glide/managers/ConnectionManager.java @@ -1,6 +1,7 @@ package glide.managers; import connection_request.ConnectionRequestOuterClass.ConnectionRequest; +import glide.api.models.configuration.BaseClientConfiguration; import glide.connectors.handlers.ChannelHandler; import glide.ffi.resolvers.RedisValueResolver; import glide.models.RequestBuilder; @@ -21,37 +22,156 @@ public class ConnectionManager { /** * Connect to Redis using a ProtoBuf connection request. * - * @param host Server address - * @param port Server port - * @param useTls true if communication with the server or cluster should use Transport Level - * Security - * @param clusterMode true if the client is used for connecting to a Redis Cluster + * @param configuration Connection Request Configuration */ - // TODO support more parameters and/or configuration object - public CompletableFuture connectToRedis( - String host, int port, boolean useTls, boolean clusterMode) { - ConnectionRequest request = - RequestBuilder.createConnectionRequest(host, port, useTls, clusterMode); - return channel.connect(request).thenApply(this::checkGlideRsResponse); + public CompletableFuture connectToRedis(BaseClientConfiguration configuration) { + connection_request.ConnectionRequestOuterClass.ConnectionRequest request = createConnectionRequest(configuration); + return channel.connect(request).thenApplyAsync(this::checkGlideRsResponse); + } + + /** Close the connection and the corresponding channel. */ + /** + * Creates a ConnectionRequest protobuf message based on the type of client Standalone/Cluster. + * + * @param configuration Connection Request Configuration + * @return ConnectionRequest protobuf message + */ + private ConnectionRequest createConnectionRequest(BaseClientConfiguration configuration) { + if (configuration instanceof RedisClusterClientConfiguration) { + return setupConnectionRequestBuilderRedisClusterClient( + (RedisClusterClientConfiguration) configuration) + .build(); + } + + return setupConnectionRequestBuilderRedisClient((RedisClientConfiguration) configuration) + .build(); + } + + /** + * Modifies ConnectionRequestBuilder, so it has appropriate fields for the BaseClientConfiguration + * where the Standalone/Cluster inherit from. + * + * @param configuration + */ + private ConnectionRequest.Builder setupConnectionRequestBuilderBaseConfiguration( + BaseClientConfiguration configuration) { + ConnectionRequest.Builder connectionRequestBuilder = ConnectionRequest.newBuilder(); + if (!configuration.getAddresses().isEmpty()) { + for (NodeAddress nodeAddress : configuration.getAddresses()) { + connectionRequestBuilder.addAddresses( + ConnectionRequestOuterClass.NodeAddress.newBuilder() + .setHost(nodeAddress.getHost()) + .setPort(nodeAddress.getPort()) + .build()); + } + } else { + connectionRequestBuilder.addAddresses( + ConnectionRequestOuterClass.NodeAddress.newBuilder() + .setHost(DEFAULT_HOST) + .setPort(DEFAULT_PORT) + .build()); + } + + connectionRequestBuilder + .setTlsMode( + configuration.isUseTLS() + ? ConnectionRequestOuterClass.TlsMode.SecureTls + : ConnectionRequestOuterClass.TlsMode.NoTls) + .setReadFrom(mapReadFromEnum(configuration.getReadFrom())); + + if (configuration.getCredentials() != null) { + ConnectionRequestOuterClass.AuthenticationInfo.Builder authenticationInfoBuilder = + ConnectionRequestOuterClass.AuthenticationInfo.newBuilder(); + if (configuration.getCredentials().getUsername() != null) { + authenticationInfoBuilder.setUsername(configuration.getCredentials().getUsername()); + } + authenticationInfoBuilder.setPassword(configuration.getCredentials().getPassword()); + + connectionRequestBuilder.setAuthenticationInfo(authenticationInfoBuilder.build()); + } + + if (configuration.getRequestTimeout() != null) { + connectionRequestBuilder.setRequestTimeout(configuration.getRequestTimeout()); + } + + return connectionRequestBuilder; + } + + /** + * Modifies ConnectionRequestBuilder, so it has appropriate fields for the Redis Standalone + * Client. + * + * @param configuration Connection Request Configuration + */ + private ConnectionRequest.Builder setupConnectionRequestBuilderRedisClient( + RedisClientConfiguration configuration) { + ConnectionRequest.Builder connectionRequestBuilder = + setupConnectionRequestBuilderBaseConfiguration(configuration); + connectionRequestBuilder.setClusterModeEnabled(false); + if (configuration.getReconnectStrategy() != null) { + connectionRequestBuilder.setConnectionRetryStrategy( + ConnectionRequestOuterClass.ConnectionRetryStrategy.newBuilder() + .setNumberOfRetries(configuration.getReconnectStrategy().getNumOfRetries()) + .setFactor(configuration.getReconnectStrategy().getFactor()) + .setExponentBase(configuration.getReconnectStrategy().getExponentBase()) + .build()); + } + + if (configuration.getDatabaseId() != null) { + connectionRequestBuilder.setDatabaseId(configuration.getDatabaseId()); + } + + return connectionRequestBuilder; + } + + /** + * Modifies ConnectionRequestBuilder, so it has appropriate fields for the Redis Cluster Client. + * + * @param configuration + */ + private ConnectionRequestOuterClass.ConnectionRequest.Builder + setupConnectionRequestBuilderRedisClusterClient( + RedisClusterClientConfiguration configuration) { + ConnectionRequest.Builder connectionRequestBuilder = + setupConnectionRequestBuilderBaseConfiguration(configuration); + connectionRequestBuilder.setClusterModeEnabled(true); + + return connectionRequestBuilder; + } + + /** + * Look up for java ReadFrom enum to protobuf defined ReadFrom enum. + * + * @param readFrom + * @return Protobuf defined ReadFrom enum + */ + private ConnectionRequestOuterClass.ReadFrom mapReadFromEnum(ReadFrom readFrom) { + if (readFrom == ReadFrom.PREFER_REPLICA) { + return ConnectionRequestOuterClass.ReadFrom.PreferReplica; + } + + return ConnectionRequestOuterClass.ReadFrom.Primary; } /** Check a response received from Glide. */ private Void checkGlideRsResponse(Response response) { + // TODO do we need to check callback value? It could be -1 or 0 if (response.hasRequestError()) { - // TODO unexpected when establishing a connection + // TODO do we need to support different types of exceptions and distinguish them by type? throw new RuntimeException( String.format( "%s: %s", response.getRequestError().getType(), response.getRequestError().getMessage())); - } - if (response.hasClosingError()) { + } else if (response.hasClosingError()) { throw new RuntimeException("Connection closed: " + response.getClosingError()); + } else if (response.hasConstantResponse()) { + return null; + } else if (response.hasRespPointer()) { + throw new RuntimeException("Unexpected data in response"); } - if (response.hasRespPointer()) { - throw new RuntimeException( - "Unexpected response data: " - + RedisValueResolver.valueFromPointer(response.getRespPointer())); - } + // TODO commented out due to #710 https://github.com/aws/babushka/issues/710 + // empty response means a successful connection + // throw new IllegalStateException("A malformed response received: " + response.toString()); return null; } diff --git a/java/client/src/test/java/glide/api/ConnectionManagerTest.java b/java/client/src/test/java/glide/api/ConnectionManagerTest.java new file mode 100644 index 0000000000..44b6d545a1 --- /dev/null +++ b/java/client/src/test/java/glide/api/ConnectionManagerTest.java @@ -0,0 +1,310 @@ +package glide.api; + +import static glide.api.models.configuration.NodeAddress.DEFAULT_HOST; +import static glide.api.models.configuration.NodeAddress.DEFAULT_PORT; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import connection_request.ConnectionRequestOuterClass; +import connection_request.ConnectionRequestOuterClass.AuthenticationInfo; +import connection_request.ConnectionRequestOuterClass.ConnectionRequest; +import connection_request.ConnectionRequestOuterClass.ConnectionRetryStrategy; +import glide.api.models.configuration.BackoffStrategy; +import glide.api.models.configuration.NodeAddress; +import glide.api.models.configuration.ReadFrom; +import glide.api.models.configuration.RedisClientConfiguration; +import glide.api.models.configuration.RedisClusterClientConfiguration; +import glide.api.models.configuration.RedisCredentials; +import glide.connectors.handlers.ChannelHandler; +import glide.managers.ConnectionManager; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.internal.verification.Times; +import response.ResponseOuterClass; +import response.ResponseOuterClass.Response; + +public class ConnectionManagerTest { + ConnectionManager connectionManager; + + ChannelHandler channel; + + private static String HOST = "aws.com"; + private static int PORT = 9999; + + private static String USERNAME = "JohnDoe"; + private static String PASSWORD = "Password1"; + + private static int NUM_OF_RETRIES = 5; + private static int FACTOR = 10; + private static int EXPONENT_BASE = 50; + + private static int DATABASE_ID = 1; + + private static int REQUEST_TIMEOUT = 3; + + @BeforeEach + public void setUp() { + channel = mock(ChannelHandler.class); + connectionManager = new ConnectionManager(channel); + } + + @Test + public void ConnectionRequestProtobufGeneration_DefaultRedisClientConfiguration_returns() + throws ExecutionException, InterruptedException { + // setup + RedisClientConfiguration redisClientConfiguration = RedisClientConfiguration.builder().build(); + ConnectionRequest expectedProtobufConnectionRequest = + ConnectionRequest.newBuilder() + .addAddresses( + ConnectionRequestOuterClass.NodeAddress.newBuilder() + .setHost(DEFAULT_HOST) + .setPort(DEFAULT_PORT) + .build()) + .setTlsMode(ConnectionRequestOuterClass.TlsMode.NoTls) + .setClusterModeEnabled(false) + .setReadFrom(ConnectionRequestOuterClass.ReadFrom.Primary) + .build(); + CompletableFuture completedFuture = new CompletableFuture<>(); + Response response = + Response.newBuilder().setConstantResponse(ResponseOuterClass.ConstantResponse.OK).build(); + completedFuture.complete(response); + + // execute + when(channel.connect(eq(expectedProtobufConnectionRequest))).thenReturn(completedFuture); + CompletableFuture result = connectionManager.connectToRedis(redisClientConfiguration); + + // verify + // no exception + assertNull(result.get()); + verify(channel).connect(eq(expectedProtobufConnectionRequest)); + } + + @Test + public void ConnectionRequestProtobufGeneration_DefaultRedisClusterClientConfiguration_returns() + throws ExecutionException, InterruptedException { + // setup + RedisClusterClientConfiguration redisClusterClientConfiguration = + RedisClusterClientConfiguration.builder().build(); + ConnectionRequest expectedProtobufConnectionRequest = + ConnectionRequest.newBuilder() + .addAddresses( + ConnectionRequestOuterClass.NodeAddress.newBuilder() + .setHost(DEFAULT_HOST) + .setPort(DEFAULT_PORT) + .build()) + .setTlsMode(ConnectionRequestOuterClass.TlsMode.NoTls) + .setClusterModeEnabled(true) + .setReadFrom(ConnectionRequestOuterClass.ReadFrom.Primary) + .build(); + CompletableFuture completedFuture = new CompletableFuture<>(); + Response response = + Response.newBuilder().setConstantResponse(ResponseOuterClass.ConstantResponse.OK).build(); + completedFuture.complete(response); + + // execute + when(channel.connect(eq(expectedProtobufConnectionRequest))).thenReturn(completedFuture); + CompletableFuture result = + connectionManager.connectToRedis(redisClusterClientConfiguration); + + // verify + assertNull(result.get()); + verify(channel).connect(eq(expectedProtobufConnectionRequest)); + } + + @Test + public void ConnectionRequestProtobufGeneration_RedisClientAllFieldsSet_returns() + throws ExecutionException, InterruptedException { + // setup + RedisClientConfiguration redisClientConfiguration = + RedisClientConfiguration.builder() + .address(NodeAddress.builder().host(HOST).port(PORT).build()) + .address(NodeAddress.builder().host(DEFAULT_HOST).port(DEFAULT_PORT).build()) + .useTLS(true) + .readFrom(ReadFrom.PREFER_REPLICA) + .credentials(RedisCredentials.builder().username(USERNAME).password(PASSWORD).build()) + .requestTimeout(REQUEST_TIMEOUT) + .reconnectStrategy( + BackoffStrategy.builder() + .numOfRetries(NUM_OF_RETRIES) + .exponentBase(EXPONENT_BASE) + .factor(FACTOR) + .build()) + .databaseId(DATABASE_ID) + .build(); + ConnectionRequest expectedProtobufConnectionRequest = + ConnectionRequest.newBuilder() + .addAddresses( + ConnectionRequestOuterClass.NodeAddress.newBuilder() + .setHost(HOST) + .setPort(PORT) + .build()) + .addAddresses( + ConnectionRequestOuterClass.NodeAddress.newBuilder() + .setHost(DEFAULT_HOST) + .setPort(DEFAULT_PORT) + .build()) + .setTlsMode(ConnectionRequestOuterClass.TlsMode.SecureTls) + .setReadFrom(ConnectionRequestOuterClass.ReadFrom.PreferReplica) + .setClusterModeEnabled(false) + .setAuthenticationInfo( + AuthenticationInfo.newBuilder().setUsername(USERNAME).setPassword(PASSWORD).build()) + .setRequestTimeout(REQUEST_TIMEOUT) + .setConnectionRetryStrategy( + ConnectionRetryStrategy.newBuilder() + .setNumberOfRetries(NUM_OF_RETRIES) + .setFactor(FACTOR) + .setExponentBase(EXPONENT_BASE) + .build()) + .setDatabaseId(DATABASE_ID) + .build(); + CompletableFuture completedFuture = new CompletableFuture<>(); + Response response = + Response.newBuilder().setConstantResponse(ResponseOuterClass.ConstantResponse.OK).build(); + completedFuture.complete(response); + + // execute + when(channel.connect(eq(expectedProtobufConnectionRequest))).thenReturn(completedFuture); + CompletableFuture result = connectionManager.connectToRedis(redisClientConfiguration); + + // verify + assertNull(result.get()); + verify(channel).connect(eq(expectedProtobufConnectionRequest)); + } + + @Test + public void DoubleConnection_successfullyReturns() + throws ExecutionException, InterruptedException { + // setup + RedisClientConfiguration redisClientConfiguration = RedisClientConfiguration.builder().build(); + CompletableFuture completedFuture = new CompletableFuture<>(); + Response response = Response.newBuilder().build(); + completedFuture.complete(response); + + // execute + when(channel.connect(any())).thenReturn(completedFuture); + CompletableFuture result1 = connectionManager.connectToRedis(redisClientConfiguration); + + // verify + assertNull(result1.get()); + verify(channel).connect(any()); + + // TODO: what is the expected behaviour if we send a different configuration on the second call + + // execute + CompletableFuture result2 = connectionManager.connectToRedis(redisClientConfiguration); + + // verify + assertNull(result2.get()); + verify(channel, new Times(2)).connect(any()); + } + + @Test + public void CloseConnection() throws ExecutionException, InterruptedException { + // setup + RedisClientConfiguration redisClientConfiguration = RedisClientConfiguration.builder().build(); + CompletableFuture completedFuture = new CompletableFuture<>(); + Response response = + Response.newBuilder().setConstantResponse(ResponseOuterClass.ConstantResponse.OK).build(); + completedFuture.complete(response); + + // execute + when(channel.connect(any())).thenReturn(completedFuture); + CompletableFuture resultConnect = + connectionManager.connectToRedis(redisClientConfiguration); + assertNull(resultConnect.get()); + verify(channel).connect(any()); + + CompletableFuture resultClose = connectionManager.closeConnection(); + assertNull(resultClose.get()); + + // verify + verify(channel).close(); + } + + @Test + public void CheckBabushkaResponse_ConstantResponse_returnsSuccessfully() + throws ExecutionException, InterruptedException { + // setup + RedisClientConfiguration redisClientConfiguration = RedisClientConfiguration.builder().build(); + CompletableFuture completedFuture = new CompletableFuture<>(); + Response response = + Response.newBuilder().setConstantResponse(ResponseOuterClass.ConstantResponse.OK).build(); + completedFuture.complete(response); + + // execute + when(channel.connect(any())).thenReturn(completedFuture); + CompletableFuture result = connectionManager.connectToRedis(redisClientConfiguration); + + // verify + assertNull(result.get()); + verify(channel).connect(any()); + } + + @Test + public void CheckBabushkaResponse_RequestError_throwsRuntimeException() { + // setup + RedisClientConfiguration redisClientConfiguration = RedisClientConfiguration.builder().build(); + CompletableFuture completedFuture = new CompletableFuture<>(); + Response response = + Response.newBuilder() + .setRequestError( + ResponseOuterClass.RequestError.newBuilder() + .setType(ResponseOuterClass.RequestErrorType.Timeout) + .setMessage("Timeout Occurred") + .build()) + .build(); + completedFuture.complete(response); + + // execute + when(channel.connect(any())).thenReturn(completedFuture); + CompletableFuture result = connectionManager.connectToRedis(redisClientConfiguration); + + // verify + ExecutionException exception = assertThrows(ExecutionException.class, result::get); + assertTrue(exception.getCause() instanceof RuntimeException); + } + + @Test + public void CheckBabushkaResponse_RespPointer_throwsRuntimeException() + throws ExecutionException, InterruptedException { + // setup + RedisClientConfiguration redisClientConfiguration = RedisClientConfiguration.builder().build(); + CompletableFuture completedFuture = new CompletableFuture<>(); + Response response = Response.newBuilder().setRespPointer(1).build(); + completedFuture.complete(response); + + // execute + when(channel.connect(any())).thenReturn(completedFuture); + CompletableFuture result = connectionManager.connectToRedis(redisClientConfiguration); + + // verify + ExecutionException exception = assertThrows(ExecutionException.class, result::get); + assertTrue(exception.getCause() instanceof RuntimeException); + } + + @Test + public void CheckBabushkaResponse_ClosingError_throwsRuntimeException() + throws ExecutionException, InterruptedException { + // setup + RedisClientConfiguration redisClientConfiguration = RedisClientConfiguration.builder().build(); + CompletableFuture completedFuture = new CompletableFuture<>(); + Response response = Response.newBuilder().setClosingError("Closing Error Occurred").build(); + completedFuture.complete(response); + + // execute + when(channel.connect(any())).thenReturn(completedFuture); + CompletableFuture result = connectionManager.connectToRedis(redisClientConfiguration); + + // verify + ExecutionException exception = assertThrows(ExecutionException.class, result::get); + assertTrue(exception.getCause() instanceof RuntimeException); + } +} diff --git a/java/src/lib.rs b/java/src/lib.rs index 31372c46b5..0a0a19c43b 100644 --- a/java/src/lib.rs +++ b/java/src/lib.rs @@ -100,4 +100,4 @@ fn throw_java_exception(mut env: JNIEnv, message: String) { ); } }; -} +} \ No newline at end of file From de3c4f3e772e01a4c8c12c3e31b4d1088a03e798 Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Fri, 29 Dec 2023 15:44:14 -0800 Subject: [PATCH 05/23] Remove unwanted file Signed-off-by: Andrew Carbonetto --- java/client/hs_err_pid14086.log | 1438 ------------------------------- 1 file changed, 1438 deletions(-) delete mode 100644 java/client/hs_err_pid14086.log diff --git a/java/client/hs_err_pid14086.log b/java/client/hs_err_pid14086.log deleted file mode 100644 index 599f42ae92..0000000000 --- a/java/client/hs_err_pid14086.log +++ /dev/null @@ -1,1438 +0,0 @@ -# -# A fatal error has been detected by the Java Runtime Environment: -# -# SIGSEGV (0xb) at pc=0x000000012557619c, pid=14086, tid=41219 -# -# JRE version: OpenJDK Runtime Environment Corretto-17.0.3.6.1 (17.0.3+6) (build 17.0.3+6-LTS) -# Java VM: OpenJDK 64-Bit Server VM Corretto-17.0.3.6.1 (17.0.3+6-LTS, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, bsd-aarch64) -# Problematic frame: -# C [libglide_rs.dylib+0xce19c] Java_glide_ffi_resolvers_RedisValueResolver_valueFromPointer+0x20 -# -# No core dump will be written. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again -# -# If you would like to submit a bug report, please visit: -# https://github.com/corretto/corretto-17/issues/ -# The crash happened outside the Java Virtual Machine in native code. -# See problematic frame for where to report the bug. -# - ---------------- S U M M A R Y ------------ - -Command Line: -Djava.library.path=/Users/andrewc/git/bq/babushka/java/client/../target/release:/Users/andrewc/git/bq/babushka/java/client/../target/debug -Dorg.gradle.internal.worker.tmpdir=/Users/andrewc/git/bq/babushka/java/client/build/tmp/test/work -Dorg.gradle.native=false -Xmx512m -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en -Duser.variant -ea worker.org.gradle.process.internal.worker.GradleWorkerMain 'Gradle Test Executor 12' - -Host: "MacBookPro18,2" arm64, 10 cores, 64G, Darwin 23.2.0, macOS 14.2 (23C64) -Time: Fri Dec 29 15:15:09 2023 PST elapsed time: 0.542144 seconds (0d 0h 0m 0s) - ---------------- T H R E A D --------------- - -Current thread (0x00000001369a0400): JavaThread "ForkJoinPool.commonPool-worker-1" daemon [_thread_in_native, id=41219, stack(0x000000016f8f0000,0x000000016faf3000)] - -Stack: [0x000000016f8f0000,0x000000016faf3000], sp=0x000000016faf2390, free space=2056k -Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) -C [libglide_rs.dylib+0xce19c] Java_glide_ffi_resolvers_RedisValueResolver_valueFromPointer+0x20 -j glide.ffi.resolvers.RedisValueResolver.valueFromPointer(J)Ljava/lang/Object;+0 -j glide.managers.ConnectionManager.checkGlideRsResponse(Lresponse/ResponseOuterClass$Response;)Ljava/lang/Void;+93 -j glide.managers.ConnectionManager$$Lambda$373+0x0000000800e43db8.apply(Ljava/lang/Object;)Ljava/lang/Object;+8 -j java.util.concurrent.CompletableFuture$UniApply.tryFire(I)Ljava/util/concurrent/CompletableFuture;+106 java.base@17.0.3 -j java.util.concurrent.CompletableFuture$Completion.exec()Z+2 java.base@17.0.3 -j java.util.concurrent.ForkJoinTask.doExec()I+10 java.base@17.0.3 -j java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Ljava/util/concurrent/ForkJoinTask;Ljava/util/concurrent/ForkJoinPool$WorkQueue;)V+13 java.base@17.0.3 -j java.util.concurrent.ForkJoinPool.scan(Ljava/util/concurrent/ForkJoinPool$WorkQueue;II)I+193 java.base@17.0.3 -j java.util.concurrent.ForkJoinPool.runWorker(Ljava/util/concurrent/ForkJoinPool$WorkQueue;)V+53 java.base@17.0.3 -j java.util.concurrent.ForkJoinWorkerThread.run()V+31 java.base@17.0.3 -v ~StubRoutines::call_stub -V [libjvm.dylib+0x46bf5c] JavaCalls::call_helper(JavaValue*, methodHandle const&, JavaCallArguments*, JavaThread*)+0x390 -V [libjvm.dylib+0x46afc8] JavaCalls::call_virtual(JavaValue*, Klass*, Symbol*, Symbol*, JavaCallArguments*, JavaThread*)+0xf8 -V [libjvm.dylib+0x46b090] JavaCalls::call_virtual(JavaValue*, Handle, Klass*, Symbol*, Symbol*, JavaThread*)+0x64 -V [libjvm.dylib+0x5203d4] thread_entry(JavaThread*, JavaThread*)+0xc4 -V [libjvm.dylib+0x99f624] JavaThread::thread_main_inner()+0x138 -V [libjvm.dylib+0x99dd00] Thread::call_run()+0x128 -V [libjvm.dylib+0x7bc108] thread_native_entry(Thread*)+0x158 -C [libsystem_pthread.dylib+0x7034] _pthread_start+0x88 - -Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) -j glide.ffi.resolvers.RedisValueResolver.valueFromPointer(J)Ljava/lang/Object;+0 -j glide.managers.ConnectionManager.checkGlideRsResponse(Lresponse/ResponseOuterClass$Response;)Ljava/lang/Void;+93 -j glide.managers.ConnectionManager$$Lambda$373+0x0000000800e43db8.apply(Ljava/lang/Object;)Ljava/lang/Object;+8 -j java.util.concurrent.CompletableFuture$UniApply.tryFire(I)Ljava/util/concurrent/CompletableFuture;+106 java.base@17.0.3 -j java.util.concurrent.CompletableFuture$Completion.exec()Z+2 java.base@17.0.3 -j java.util.concurrent.ForkJoinTask.doExec()I+10 java.base@17.0.3 -j java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Ljava/util/concurrent/ForkJoinTask;Ljava/util/concurrent/ForkJoinPool$WorkQueue;)V+13 java.base@17.0.3 -j java.util.concurrent.ForkJoinPool.scan(Ljava/util/concurrent/ForkJoinPool$WorkQueue;II)I+193 java.base@17.0.3 -j java.util.concurrent.ForkJoinPool.runWorker(Ljava/util/concurrent/ForkJoinPool$WorkQueue;)V+53 java.base@17.0.3 -j java.util.concurrent.ForkJoinWorkerThread.run()V+31 java.base@17.0.3 -v ~StubRoutines::call_stub - -siginfo: si_signo: 11 (SIGSEGV), si_code: 2 (SEGV_ACCERR), si_addr: 0x0000000000000001 - -Register to memory mapping: - - x0=0x00000001369a06a8 points into unknown readable memory: 0x00000001067528c8 | c8 28 75 06 01 00 00 00 - x1=0x000000016faf2548 is pointing into the stack for thread: 0x00000001369a0400 - x2=0x0000000000000001 is an unknown value - x3=0x0 is NULL - x4=0x0000000000000001 is an unknown value - x5=0x0 is NULL - x6=0x00000000000000d6 is an unknown value - x7=0x00000001369a0400 is a thread - x8=0x0000000000000004 is an unknown value - x9=0x00000001369a0738 points into unknown readable memory: 0x6a4c283e00000004 | 04 00 00 00 3e 28 4c 6a -x10=0x000000012557617c: Java_glide_ffi_resolvers_RedisValueResolver_valueFromPointer+0 in /Users/andrewc/git/bq/babushka/java/target/release/libglide_rs.dylib at 0x00000001254a8000 -x11=0x0000000000000004 is an unknown value -x12={method} {0x0000000124397c98} 'valueFromPointer' '(J)Ljava/lang/Object;' in 'glide/ffi/resolvers/RedisValueResolver' -x13={method} {0x0000000124397c98} 'valueFromPointer' '(J)Ljava/lang/Object;' in 'glide/ffi/resolvers/RedisValueResolver' -x14=0x00000000b841d8c5 is an unknown value -x15=0x00000000000000c5 is an unknown value -x16=0x000000018977edb4: pthread_jit_write_protect_np+0 in /usr/lib/system/libsystem_pthread.dylib at 0x0000000189777000 -x17=0x00000007fdd82be8 is an oop: java.lang.Class -{0x00000007fdd82be8} - klass: 'java/lang/Class' - - ---- fields (total size 14 words): - - private volatile transient 'classRedefinedCount' 'I' @12 0 - - private volatile transient 'cachedConstructor' 'Ljava/lang/reflect/Constructor;' @40 NULL (0) - - private transient 'name' 'Ljava/lang/String;' @44 "glide.ffi.resolvers.RedisValueResolver"{0x00000007fdd82c68} (ffbb058d) - - private transient 'module' 'Ljava/lang/Module;' @48 a 'java/lang/Module'{0x00000007ffe571e8} (fffcae3d) - - private final 'classLoader' 'Ljava/lang/ClassLoader;' @52 a 'jdk/internal/loader/ClassLoaders$AppClassLoader'{0x00000007ffe56a60} (fffcad4c) - - private transient 'classData' 'Ljava/lang/Object;' @56 NULL (0) - - private transient 'packageName' 'Ljava/lang/String;' @60 "glide.ffi.resolvers"{0x00000007fdd825e0} (ffbb04bc) - - private final 'componentType' 'Ljava/lang/Class;' @64 NULL (0) - - private volatile transient 'reflectionData' 'Ljava/lang/ref/SoftReference;' @68 NULL (0) - - private volatile transient 'genericInfo' 'Lsun/reflect/generics/repository/ClassRepository;' @72 NULL (0) - - private volatile transient 'enumConstants' '[Ljava/lang/Object;' @76 NULL (0) - - private volatile transient 'enumConstantDirectory' 'Ljava/util/Map;' @80 NULL (0) - - private volatile transient 'annotationData' 'Ljava/lang/Class$AnnotationData;' @84 NULL (0) - - private volatile transient 'annotationType' 'Lsun/reflect/annotation/AnnotationType;' @88 NULL (0) - - transient 'classValueMap' 'Ljava/lang/ClassValue$ClassValueMap;' @92 NULL (0) - - signature: Lglide/ffi/resolvers/RedisValueResolver; - - fake entry for mirror: 'glide/ffi/resolvers/RedisValueResolver' - - fake entry for array: NULL - - fake entry for oop_size: 14 - - fake entry for static_oop_field_count: 0 -x18=0x0 is NULL -x19=0x0000000000000001 is an unknown value -x20=0x000000016faf24d0 is pointing into the stack for thread: 0x00000001369a0400 -x21=0x00000001067a0458: _ZN19TemplateInterpreter13_active_tableE+0 in /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/server/libjvm.dylib at 0x0000000105b38000 -x22=0x0 is NULL -x23=4290446033 is a compressed pointer to object: java.util.concurrent.ConcurrentHashMap$Node -{0x00000007fdd81688} - klass: 'java/util/concurrent/ConcurrentHashMap$Node' - - ---- fields (total size 4 words): - - final 'hash' 'I' @12 1288636755 (4ccf0953) - - final 'key' 'Ljava/lang/Object;' @16 a 'java/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry'{0x00000007fdd81668} (ffbb02cd) - - volatile 'val' 'Ljava/lang/Object;' @20 a 'java/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry'{0x00000007fdd81668} (ffbb02cd) - - volatile 'next' 'Ljava/util/concurrent/ConcurrentHashMap$Node;' @24 NULL (0) -x24=0x000000016faf2558 is pointing into the stack for thread: 0x00000001369a0400 -x25=0x0000000000000001 is an unknown value -x26=0x0000000124397d98 is pointing into metadata -x27=0x0 is NULL -x28=0x00000001369a0400 is a thread - - -Registers: - x0=0x00000001369a06a8 x1=0x000000016faf2548 x2=0x0000000000000001 x3=0x0000000000000000 - x4=0x0000000000000001 x5=0x0000000000000000 x6=0x00000000000000d6 x7=0x00000001369a0400 - x8=0x0000000000000004 x9=0x00000001369a0738 x10=0x000000012557617c x11=0x0000000000000004 -x12=0x0000000124397c98 x13=0x0000000124397c98 x14=0x00000000b841d8c5 x15=0x00000000000000c5 -x16=0x000000018977edb4 x17=0x00000007fdd82be8 x18=0x0000000000000000 x19=0x0000000000000001 -x20=0x000000016faf24d0 x21=0x00000001067a0458 x22=0x0000000000000000 x23=0x00000000ffbb02d1 -x24=0x000000016faf2558 x25=0x0000000000000001 x26=0x0000000124397d98 x27=0x0000000000000000 -x28=0x00000001369a0400 fp=0x000000016faf24c0 lr=0x000000010e5c98ac sp=0x000000016faf2390 -pc=0x000000012557619c cpsr=0x0000000000001000 -Top of Stack: (sp=0x000000016faf2390) -0x000000016faf2390: 00000001066fa380 0000000000000000 -0x000000016faf23a0: 0000000000000001 0000000000000000 -0x000000016faf23b0: 0000000000000000 0000000000000000 -0x000000016faf23c0: 0000000000000000 1e174ec9f05c0021 -0x000000016faf23d0: 0000000000000000 0000000000000000 -0x000000016faf23e0: 0000000000000000 0000000000000000 -0x000000016faf23f0: 0000000000000000 000000010e5de380 -0x000000016faf2400: 0000000000000179 00000001062c66b8 -0x000000016faf2410: 00000001369a0400 0000000000000000 -0x000000016faf2420: 0000000124397d98 0000000000000001 -0x000000016faf2430: 000000016faf2558 00000000ffbb02d1 -0x000000016faf2440: 0000000000000000 0000000124397c98 -0x000000016faf2450: 0000000000000001 00000001369a0400 -0x000000016faf2460: 000000016faf24b0 a658000105f9fbf8 -0x000000016faf2470: 0000000000000000 0000000124397c98 -0x000000016faf2480: 00000001369a0400 0000000000000000 -0x000000016faf2490: 000000016faf2558 00000000ffbb02d1 -0x000000016faf24a0: 0000000000000000 00000001067a0458 -0x000000016faf24b0: 000000016faf24d0 000000010e5c773c -0x000000016faf24c0: 000000016faf2530 000000010e5c98ac -0x000000016faf24d0: 000000010e5c96cc 0000000124397c98 -0x000000016faf24e0: 000000016faf24e0 0000000000000000 -0x000000016faf24f0: 000000016faf2558 0000000124397d98 -0x000000016faf2500: 00000007fdd82be8 0000000000000000 -0x000000016faf2510: 0000000000000000 0000000124397c98 -0x000000016faf2520: 0000000000000000 000000016faf2510 -0x000000016faf2530: 000000016faf25c0 000000010e5c5d80 -0x000000016faf2540: 0000000000000000 00000007fdd82be8 -0x000000016faf2550: 0000000000000001 0000000000000000 -0x000000016faf2560: 00000007fdd81720 00000007fdd81720 -0x000000016faf2570: 000000016faf2570 00000001206c037d -0x000000016faf2580: 000000016faf25d8 0000000124308000 - -Instructions: (pc=0x000000012557619c) -0x000000012557609c: 97ff2d64 91038260 9402242c 1400002d -0x00000001255760ac: aa0003f4 a9408ac1 aa1303e0 940110ca -0x00000001255760bc: 14000004 aa0003f4 910c43e0 97feef65 -0x00000001255760cc: aa1403e0 940693ae 94063ad2 aa0003f4 -0x00000001255760dc: f1000739 540000c0 91010375 aa1b03e0 -0x00000001255760ec: 97ffbd44 aa1503fb 17fffffa a94307e0 -0x00000001255760fc: 97fd74a9 71000f1f 540000c0 71003b1f -0x000000012557610c: 54000120 910a03e0 97fcde14 14000006 -0x000000012557611c: b9400fe8 36000088 910a03e8 b27d0100 -0x000000012557612c: 97fcdfec 52800048 f94013e9 39000128 -0x000000012557613c: f9400fe0 97fda6d8 52800048 39000388 -0x000000012557614c: f9400be0 97fda5e1 91040260 97fda60f -0x000000012557615c: 52800048 3902c668 aa1403e0 94069388 -0x000000012557616c: 94063aac 94063aab 94063aaa 94063aa9 -0x000000012557617c: d10503ff a90f6ffc a9105ff8 a91157f6 -0x000000012557618c: a9124ff4 a9137bfd 9104c3fd aa0203f3 -0x000000012557619c: ad400440 ad0007e0 ad410440 ad0107e0 -0x00000001255761ac: f90027e0 394003e8 f00013c2 91298042 -0x00000001255761bc: d2800014 90000e49 91343129 1000008a -0x00000001255761cc: 3868692b 8b0b094a d61f0140 f94007e8 -0x00000001255761dc: 528000a9 390143e9 f9002fe8 d0000ea2 -0x00000001255761ec: 9134cc42 b0000f64 910d1084 9101c3e0 -0x00000001255761fc: 910123e1 910143e6 52800223 52800085 -0x000000012557620c: 97fe7327 3941c3e8 71003d1f 54000aa0 -0x000000012557621c: ad4387e0 ad3c07a0 3dc027e0 3c9a03a0 -0x000000012557622c: f94053e8 f81b03a8 f0000f40 91074c00 -0x000000012557623c: f00013c3 91200063 f00013c4 9127a084 -0x000000012557624c: d10203a2 52800561 94063a39 140000c1 -0x000000012557625c: 3cc083e0 3d8017e0 f9400fe8 f90033e8 -0x000000012557626c: 9101c3e0 910123e1 910143e2 97fe7b85 -0x000000012557627c: 3941c3e8 71003d1f 54000b21 f9403ff4 -0x000000012557628c: 1400004d a940dbf5 f9400fe2 910143e0 - - -Stack slot to memory mapping: -stack at sp + 0 slots: 0x00000001066fa380: _ZTV11OopRecorder+0x10 in /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/server/libjvm.dylib at 0x0000000105b38000 -stack at sp + 1 slots: 0x0 is NULL -stack at sp + 2 slots: 0x0000000000000001 is an unknown value -stack at sp + 3 slots: 0x0 is NULL -stack at sp + 4 slots: 0x0 is NULL -stack at sp + 5 slots: 0x0 is NULL -stack at sp + 6 slots: 0x0 is NULL -stack at sp + 7 slots: 0x1e174ec9f05c0021 is an unknown value - - ---------------- P R O C E S S --------------- - -Threads class SMR info: -_java_thread_list=0x0000600000de7520, length=17, elements={ -0x000000013580a200, 0x0000000124816a00, 0x0000000124819200, 0x0000000134809800, -0x0000000124819800, 0x000000012481c000, 0x000000012481c600, 0x000000012481cc00, -0x0000000123010200, 0x000000013485ae00, 0x000000013485b400, 0x0000000135019e00, -0x000000013486d800, 0x00000001348a7c00, 0x0000000135009600, 0x000000012080ae00, -0x00000001369a0400 -} - -Java Threads: ( => current thread ) - 0x000000013580a200 JavaThread "Test worker" [_thread_blocked, id=8451, stack(0x000000016b864000,0x000000016ba67000)] - 0x0000000124816a00 JavaThread "Reference Handler" daemon [_thread_blocked, id=19715, stack(0x000000016c6b8000,0x000000016c8bb000)] - 0x0000000124819200 JavaThread "Finalizer" daemon [_thread_blocked, id=22019, stack(0x000000016c8c4000,0x000000016cac7000)] - 0x0000000134809800 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=30467, stack(0x000000016cbe8000,0x000000016cdeb000)] - 0x0000000124819800 JavaThread "Service Thread" daemon [_thread_blocked, id=23555, stack(0x000000016cdf4000,0x000000016cff7000)] - 0x000000012481c000 JavaThread "Monitor Deflation Thread" daemon [_thread_blocked, id=24067, stack(0x000000016d000000,0x000000016d203000)] - 0x000000012481c600 JavaThread "C2 CompilerThread0" daemon [_thread_blocked, id=30211, stack(0x000000016d20c000,0x000000016d40f000)] - 0x000000012481cc00 JavaThread "C1 CompilerThread0" daemon [_thread_blocked, id=24579, stack(0x000000016d418000,0x000000016d61b000)] - 0x0000000123010200 JavaThread "Sweeper thread" daemon [_thread_blocked, id=29443, stack(0x000000016d624000,0x000000016d827000)] - 0x000000013485ae00 JavaThread "Notification Thread" daemon [_thread_blocked, id=24835, stack(0x000000016d830000,0x000000016da33000)] - 0x000000013485b400 JavaThread "Common-Cleaner" daemon [_thread_blocked, id=25859, stack(0x000000016dc48000,0x000000016de4b000)] - 0x0000000135019e00 JavaThread "/127.0.0.1:63926 to /127.0.0.1:63925 workers" [_thread_blocked, id=28675, stack(0x000000016de54000,0x000000016e057000)] - 0x000000013486d800 JavaThread "/127.0.0.1:63926 to /127.0.0.1:63925 workers Thread 2" [_thread_blocked, id=26371, stack(0x000000016e060000,0x000000016e263000)] - 0x00000001348a7c00 JavaThread "/127.0.0.1:63926 to /127.0.0.1:63925 workers Thread 3" [_thread_in_native, id=26883, stack(0x000000016e26c000,0x000000016e46f000)] - 0x0000000135009600 JavaThread "C2 CompilerThread1" daemon [_thread_blocked, id=28419, stack(0x000000016e478000,0x000000016e67b000)] - 0x000000012080ae00 JavaThread "C2 CompilerThread2" daemon [_thread_blocked, id=34051, stack(0x000000016f6e4000,0x000000016f8e7000)] -=>0x00000001369a0400 JavaThread "ForkJoinPool.commonPool-worker-1" daemon [_thread_in_native, id=41219, stack(0x000000016f8f0000,0x000000016faf3000)] - -Other Threads: - 0x0000000134606af0 VMThread "VM Thread" [stack: 0x000000016c4ac000,0x000000016c6af000] [id=19203] - 0x0000000136209d60 WatcherThread [stack: 0x000000016da3c000,0x000000016dc3f000] [id=25347] - 0x00000001361061e0 GCTaskThread "GC Thread#0" [stack: 0x000000016ba70000,0x000000016bc73000] [id=12291] - 0x0000000136213d20 GCTaskThread "GC Thread#1" [stack: 0x000000016e684000,0x000000016e887000] [id=27907] - 0x00000001362141d0 GCTaskThread "GC Thread#2" [stack: 0x000000016e890000,0x000000016ea93000] [id=27395] - 0x0000000136214650 GCTaskThread "GC Thread#3" [stack: 0x000000016ea9c000,0x000000016ec9f000] [id=43267] - 0x0000000136214ad0 GCTaskThread "GC Thread#4" [stack: 0x000000016eca8000,0x000000016eeab000] [id=33283] - 0x0000000136214f50 GCTaskThread "GC Thread#5" [stack: 0x000000016eeb4000,0x000000016f0b7000] [id=42755] - 0x0000000134718e80 GCTaskThread "GC Thread#6" [stack: 0x000000016f0c0000,0x000000016f2c3000] [id=42243] - 0x0000000134719130 GCTaskThread "GC Thread#7" [stack: 0x000000016f2cc000,0x000000016f4cf000] [id=41731] - 0x00000001347195b0 GCTaskThread "GC Thread#8" [stack: 0x000000016f4d8000,0x000000016f6db000] [id=33795] - 0x0000000136106890 ConcurrentGCThread "G1 Main Marker" [stack: 0x000000016bc7c000,0x000000016be7f000] [id=12803] - 0x0000000136107110 ConcurrentGCThread "G1 Conc#0" [stack: 0x000000016be88000,0x000000016c08b000] [id=21507] - 0x0000000136109240 ConcurrentGCThread "G1 Refine#0" [stack: 0x000000016c094000,0x000000016c297000] [id=17155] - 0x0000000136109ae0 ConcurrentGCThread "G1 Service" [stack: 0x000000016c2a0000,0x000000016c4a3000] [id=17667] - -Threads with active compile tasks: - -VM state: not at safepoint (normal execution) - -VM Mutex/Monitor currently owned by a thread: None - -Heap address: 0x00000007e0000000, size: 512 MB, Compressed Oops mode: Zero based, Oop shift amount: 3 - -CDS archive(s) mapped at: [0x0000000800000000-0x0000000800bd4000-0x0000000800bd4000), size 12402688, SharedBaseAddress: 0x0000000800000000, ArchiveRelocationMode: 0. -Compressed class space mapped at: 0x0000000800c00000-0x0000000840c00000, reserved size: 1073741824 -Narrow klass base: 0x0000000800000000, Narrow klass shift: 0, Narrow klass range: 0x100000000 - -GC Precious Log: - CPUs: 10 total, 10 available - Memory: 65536M - Large Page Support: Disabled - NUMA Support: Disabled - Compressed Oops: Enabled (Zero based) - Heap Region Size: 1M - Heap Min Capacity: 8M - Heap Initial Capacity: 512M - Heap Max Capacity: 512M - Pre-touch: Disabled - Parallel Workers: 9 - Concurrent Workers: 2 - Concurrent Refinement Workers: 9 - Periodic GC: Disabled - -Heap: - garbage-first heap total 524288K, used 34274K [0x00000007e0000000, 0x0000000800000000) - region size 1024K, 33 young (33792K), 4 survivors (4096K) - Metaspace used 13769K, committed 14016K, reserved 1064960K - class space used 2154K, committed 2304K, reserved 1048576K - -Heap Regions: E=young(eden), S=young(survivor), O=old, HS=humongous(starts), HC=humongous(continues), CS=collection set, F=free, OA=open archive, CA=closed archive, TAMS=top-at-mark-start (previous, next) -| 0|0x00000007e0000000, 0x00000007e0080a00, 0x00000007e0100000| 50%| O| |TAMS 0x00000007e0000000, 0x00000007e0000000| Untracked -| 1|0x00000007e0100000, 0x00000007e0100000, 0x00000007e0200000| 0%| F| |TAMS 0x00000007e0100000, 0x00000007e0100000| Untracked -| 2|0x00000007e0200000, 0x00000007e0200000, 0x00000007e0300000| 0%| F| |TAMS 0x00000007e0200000, 0x00000007e0200000| Untracked -| 3|0x00000007e0300000, 0x00000007e0300000, 0x00000007e0400000| 0%| F| |TAMS 0x00000007e0300000, 0x00000007e0300000| Untracked -| 4|0x00000007e0400000, 0x00000007e0400000, 0x00000007e0500000| 0%| F| |TAMS 0x00000007e0400000, 0x00000007e0400000| Untracked -| 5|0x00000007e0500000, 0x00000007e0500000, 0x00000007e0600000| 0%| F| |TAMS 0x00000007e0500000, 0x00000007e0500000| Untracked -| 6|0x00000007e0600000, 0x00000007e0600000, 0x00000007e0700000| 0%| F| |TAMS 0x00000007e0600000, 0x00000007e0600000| Untracked -| 7|0x00000007e0700000, 0x00000007e0700000, 0x00000007e0800000| 0%| F| |TAMS 0x00000007e0700000, 0x00000007e0700000| Untracked -| 8|0x00000007e0800000, 0x00000007e0800000, 0x00000007e0900000| 0%| F| |TAMS 0x00000007e0800000, 0x00000007e0800000| Untracked -| 9|0x00000007e0900000, 0x00000007e0900000, 0x00000007e0a00000| 0%| F| |TAMS 0x00000007e0900000, 0x00000007e0900000| Untracked -| 10|0x00000007e0a00000, 0x00000007e0a00000, 0x00000007e0b00000| 0%| F| |TAMS 0x00000007e0a00000, 0x00000007e0a00000| Untracked -| 11|0x00000007e0b00000, 0x00000007e0b00000, 0x00000007e0c00000| 0%| F| |TAMS 0x00000007e0b00000, 0x00000007e0b00000| Untracked -| 12|0x00000007e0c00000, 0x00000007e0c00000, 0x00000007e0d00000| 0%| F| |TAMS 0x00000007e0c00000, 0x00000007e0c00000| Untracked -| 13|0x00000007e0d00000, 0x00000007e0d00000, 0x00000007e0e00000| 0%| F| |TAMS 0x00000007e0d00000, 0x00000007e0d00000| Untracked -| 14|0x00000007e0e00000, 0x00000007e0e00000, 0x00000007e0f00000| 0%| F| |TAMS 0x00000007e0e00000, 0x00000007e0e00000| Untracked -| 15|0x00000007e0f00000, 0x00000007e0f00000, 0x00000007e1000000| 0%| F| |TAMS 0x00000007e0f00000, 0x00000007e0f00000| Untracked -| 16|0x00000007e1000000, 0x00000007e1000000, 0x00000007e1100000| 0%| F| |TAMS 0x00000007e1000000, 0x00000007e1000000| Untracked -| 17|0x00000007e1100000, 0x00000007e1100000, 0x00000007e1200000| 0%| F| |TAMS 0x00000007e1100000, 0x00000007e1100000| Untracked -| 18|0x00000007e1200000, 0x00000007e1200000, 0x00000007e1300000| 0%| F| |TAMS 0x00000007e1200000, 0x00000007e1200000| Untracked -| 19|0x00000007e1300000, 0x00000007e1300000, 0x00000007e1400000| 0%| F| |TAMS 0x00000007e1300000, 0x00000007e1300000| Untracked -| 20|0x00000007e1400000, 0x00000007e1400000, 0x00000007e1500000| 0%| F| |TAMS 0x00000007e1400000, 0x00000007e1400000| Untracked -| 21|0x00000007e1500000, 0x00000007e1500000, 0x00000007e1600000| 0%| F| |TAMS 0x00000007e1500000, 0x00000007e1500000| Untracked -| 22|0x00000007e1600000, 0x00000007e1600000, 0x00000007e1700000| 0%| F| |TAMS 0x00000007e1600000, 0x00000007e1600000| Untracked -| 23|0x00000007e1700000, 0x00000007e1700000, 0x00000007e1800000| 0%| F| |TAMS 0x00000007e1700000, 0x00000007e1700000| Untracked -| 24|0x00000007e1800000, 0x00000007e1800000, 0x00000007e1900000| 0%| F| |TAMS 0x00000007e1800000, 0x00000007e1800000| Untracked -| 25|0x00000007e1900000, 0x00000007e1900000, 0x00000007e1a00000| 0%| F| |TAMS 0x00000007e1900000, 0x00000007e1900000| Untracked -| 26|0x00000007e1a00000, 0x00000007e1a00000, 0x00000007e1b00000| 0%| F| |TAMS 0x00000007e1a00000, 0x00000007e1a00000| Untracked -| 27|0x00000007e1b00000, 0x00000007e1b00000, 0x00000007e1c00000| 0%| F| |TAMS 0x00000007e1b00000, 0x00000007e1b00000| Untracked -| 28|0x00000007e1c00000, 0x00000007e1c00000, 0x00000007e1d00000| 0%| F| |TAMS 0x00000007e1c00000, 0x00000007e1c00000| Untracked -| 29|0x00000007e1d00000, 0x00000007e1d00000, 0x00000007e1e00000| 0%| F| |TAMS 0x00000007e1d00000, 0x00000007e1d00000| Untracked -| 30|0x00000007e1e00000, 0x00000007e1e00000, 0x00000007e1f00000| 0%| F| |TAMS 0x00000007e1e00000, 0x00000007e1e00000| Untracked -| 31|0x00000007e1f00000, 0x00000007e1f00000, 0x00000007e2000000| 0%| F| |TAMS 0x00000007e1f00000, 0x00000007e1f00000| Untracked -| 32|0x00000007e2000000, 0x00000007e2000000, 0x00000007e2100000| 0%| F| |TAMS 0x00000007e2000000, 0x00000007e2000000| Untracked -| 33|0x00000007e2100000, 0x00000007e2100000, 0x00000007e2200000| 0%| F| |TAMS 0x00000007e2100000, 0x00000007e2100000| Untracked -| 34|0x00000007e2200000, 0x00000007e2200000, 0x00000007e2300000| 0%| F| |TAMS 0x00000007e2200000, 0x00000007e2200000| Untracked -| 35|0x00000007e2300000, 0x00000007e2300000, 0x00000007e2400000| 0%| F| |TAMS 0x00000007e2300000, 0x00000007e2300000| Untracked -| 36|0x00000007e2400000, 0x00000007e2400000, 0x00000007e2500000| 0%| F| |TAMS 0x00000007e2400000, 0x00000007e2400000| Untracked -| 37|0x00000007e2500000, 0x00000007e2500000, 0x00000007e2600000| 0%| F| |TAMS 0x00000007e2500000, 0x00000007e2500000| Untracked -| 38|0x00000007e2600000, 0x00000007e2600000, 0x00000007e2700000| 0%| F| |TAMS 0x00000007e2600000, 0x00000007e2600000| Untracked -| 39|0x00000007e2700000, 0x00000007e2700000, 0x00000007e2800000| 0%| F| |TAMS 0x00000007e2700000, 0x00000007e2700000| Untracked -| 40|0x00000007e2800000, 0x00000007e2800000, 0x00000007e2900000| 0%| F| |TAMS 0x00000007e2800000, 0x00000007e2800000| Untracked -| 41|0x00000007e2900000, 0x00000007e2900000, 0x00000007e2a00000| 0%| F| |TAMS 0x00000007e2900000, 0x00000007e2900000| Untracked -| 42|0x00000007e2a00000, 0x00000007e2a00000, 0x00000007e2b00000| 0%| F| |TAMS 0x00000007e2a00000, 0x00000007e2a00000| Untracked -| 43|0x00000007e2b00000, 0x00000007e2b00000, 0x00000007e2c00000| 0%| F| |TAMS 0x00000007e2b00000, 0x00000007e2b00000| Untracked -| 44|0x00000007e2c00000, 0x00000007e2c00000, 0x00000007e2d00000| 0%| F| |TAMS 0x00000007e2c00000, 0x00000007e2c00000| Untracked -| 45|0x00000007e2d00000, 0x00000007e2d00000, 0x00000007e2e00000| 0%| F| |TAMS 0x00000007e2d00000, 0x00000007e2d00000| Untracked -| 46|0x00000007e2e00000, 0x00000007e2e00000, 0x00000007e2f00000| 0%| F| |TAMS 0x00000007e2e00000, 0x00000007e2e00000| Untracked -| 47|0x00000007e2f00000, 0x00000007e2f00000, 0x00000007e3000000| 0%| F| |TAMS 0x00000007e2f00000, 0x00000007e2f00000| Untracked -| 48|0x00000007e3000000, 0x00000007e3000000, 0x00000007e3100000| 0%| F| |TAMS 0x00000007e3000000, 0x00000007e3000000| Untracked -| 49|0x00000007e3100000, 0x00000007e3100000, 0x00000007e3200000| 0%| F| |TAMS 0x00000007e3100000, 0x00000007e3100000| Untracked -| 50|0x00000007e3200000, 0x00000007e3200000, 0x00000007e3300000| 0%| F| |TAMS 0x00000007e3200000, 0x00000007e3200000| Untracked -| 51|0x00000007e3300000, 0x00000007e3300000, 0x00000007e3400000| 0%| F| |TAMS 0x00000007e3300000, 0x00000007e3300000| Untracked -| 52|0x00000007e3400000, 0x00000007e3400000, 0x00000007e3500000| 0%| F| |TAMS 0x00000007e3400000, 0x00000007e3400000| Untracked -| 53|0x00000007e3500000, 0x00000007e3500000, 0x00000007e3600000| 0%| F| |TAMS 0x00000007e3500000, 0x00000007e3500000| Untracked -| 54|0x00000007e3600000, 0x00000007e3600000, 0x00000007e3700000| 0%| F| |TAMS 0x00000007e3600000, 0x00000007e3600000| Untracked -| 55|0x00000007e3700000, 0x00000007e3700000, 0x00000007e3800000| 0%| F| |TAMS 0x00000007e3700000, 0x00000007e3700000| Untracked -| 56|0x00000007e3800000, 0x00000007e3800000, 0x00000007e3900000| 0%| F| |TAMS 0x00000007e3800000, 0x00000007e3800000| Untracked -| 57|0x00000007e3900000, 0x00000007e3900000, 0x00000007e3a00000| 0%| F| |TAMS 0x00000007e3900000, 0x00000007e3900000| Untracked -| 58|0x00000007e3a00000, 0x00000007e3a00000, 0x00000007e3b00000| 0%| F| |TAMS 0x00000007e3a00000, 0x00000007e3a00000| Untracked -| 59|0x00000007e3b00000, 0x00000007e3b00000, 0x00000007e3c00000| 0%| F| |TAMS 0x00000007e3b00000, 0x00000007e3b00000| Untracked -| 60|0x00000007e3c00000, 0x00000007e3c00000, 0x00000007e3d00000| 0%| F| |TAMS 0x00000007e3c00000, 0x00000007e3c00000| Untracked -| 61|0x00000007e3d00000, 0x00000007e3d00000, 0x00000007e3e00000| 0%| F| |TAMS 0x00000007e3d00000, 0x00000007e3d00000| Untracked -| 62|0x00000007e3e00000, 0x00000007e3e00000, 0x00000007e3f00000| 0%| F| |TAMS 0x00000007e3e00000, 0x00000007e3e00000| Untracked -| 63|0x00000007e3f00000, 0x00000007e3f00000, 0x00000007e4000000| 0%| F| |TAMS 0x00000007e3f00000, 0x00000007e3f00000| Untracked -| 64|0x00000007e4000000, 0x00000007e4000000, 0x00000007e4100000| 0%| F| |TAMS 0x00000007e4000000, 0x00000007e4000000| Untracked -| 65|0x00000007e4100000, 0x00000007e4100000, 0x00000007e4200000| 0%| F| |TAMS 0x00000007e4100000, 0x00000007e4100000| Untracked -| 66|0x00000007e4200000, 0x00000007e4200000, 0x00000007e4300000| 0%| F| |TAMS 0x00000007e4200000, 0x00000007e4200000| Untracked -| 67|0x00000007e4300000, 0x00000007e4300000, 0x00000007e4400000| 0%| F| |TAMS 0x00000007e4300000, 0x00000007e4300000| Untracked -| 68|0x00000007e4400000, 0x00000007e4400000, 0x00000007e4500000| 0%| F| |TAMS 0x00000007e4400000, 0x00000007e4400000| Untracked -| 69|0x00000007e4500000, 0x00000007e4500000, 0x00000007e4600000| 0%| F| |TAMS 0x00000007e4500000, 0x00000007e4500000| Untracked -| 70|0x00000007e4600000, 0x00000007e4600000, 0x00000007e4700000| 0%| F| |TAMS 0x00000007e4600000, 0x00000007e4600000| Untracked -| 71|0x00000007e4700000, 0x00000007e4700000, 0x00000007e4800000| 0%| F| |TAMS 0x00000007e4700000, 0x00000007e4700000| Untracked -| 72|0x00000007e4800000, 0x00000007e4800000, 0x00000007e4900000| 0%| F| |TAMS 0x00000007e4800000, 0x00000007e4800000| Untracked -| 73|0x00000007e4900000, 0x00000007e4900000, 0x00000007e4a00000| 0%| F| |TAMS 0x00000007e4900000, 0x00000007e4900000| Untracked -| 74|0x00000007e4a00000, 0x00000007e4a00000, 0x00000007e4b00000| 0%| F| |TAMS 0x00000007e4a00000, 0x00000007e4a00000| Untracked -| 75|0x00000007e4b00000, 0x00000007e4b00000, 0x00000007e4c00000| 0%| F| |TAMS 0x00000007e4b00000, 0x00000007e4b00000| Untracked -| 76|0x00000007e4c00000, 0x00000007e4c00000, 0x00000007e4d00000| 0%| F| |TAMS 0x00000007e4c00000, 0x00000007e4c00000| Untracked -| 77|0x00000007e4d00000, 0x00000007e4d00000, 0x00000007e4e00000| 0%| F| |TAMS 0x00000007e4d00000, 0x00000007e4d00000| Untracked -| 78|0x00000007e4e00000, 0x00000007e4e00000, 0x00000007e4f00000| 0%| F| |TAMS 0x00000007e4e00000, 0x00000007e4e00000| Untracked -| 79|0x00000007e4f00000, 0x00000007e4f00000, 0x00000007e5000000| 0%| F| |TAMS 0x00000007e4f00000, 0x00000007e4f00000| Untracked -| 80|0x00000007e5000000, 0x00000007e5000000, 0x00000007e5100000| 0%| F| |TAMS 0x00000007e5000000, 0x00000007e5000000| Untracked -| 81|0x00000007e5100000, 0x00000007e5100000, 0x00000007e5200000| 0%| F| |TAMS 0x00000007e5100000, 0x00000007e5100000| Untracked -| 82|0x00000007e5200000, 0x00000007e5200000, 0x00000007e5300000| 0%| F| |TAMS 0x00000007e5200000, 0x00000007e5200000| Untracked -| 83|0x00000007e5300000, 0x00000007e5300000, 0x00000007e5400000| 0%| F| |TAMS 0x00000007e5300000, 0x00000007e5300000| Untracked -| 84|0x00000007e5400000, 0x00000007e5400000, 0x00000007e5500000| 0%| F| |TAMS 0x00000007e5400000, 0x00000007e5400000| Untracked -| 85|0x00000007e5500000, 0x00000007e5500000, 0x00000007e5600000| 0%| F| |TAMS 0x00000007e5500000, 0x00000007e5500000| Untracked -| 86|0x00000007e5600000, 0x00000007e5600000, 0x00000007e5700000| 0%| F| |TAMS 0x00000007e5600000, 0x00000007e5600000| Untracked -| 87|0x00000007e5700000, 0x00000007e5700000, 0x00000007e5800000| 0%| F| |TAMS 0x00000007e5700000, 0x00000007e5700000| Untracked -| 88|0x00000007e5800000, 0x00000007e5800000, 0x00000007e5900000| 0%| F| |TAMS 0x00000007e5800000, 0x00000007e5800000| Untracked -| 89|0x00000007e5900000, 0x00000007e5900000, 0x00000007e5a00000| 0%| F| |TAMS 0x00000007e5900000, 0x00000007e5900000| Untracked -| 90|0x00000007e5a00000, 0x00000007e5a00000, 0x00000007e5b00000| 0%| F| |TAMS 0x00000007e5a00000, 0x00000007e5a00000| Untracked -| 91|0x00000007e5b00000, 0x00000007e5b00000, 0x00000007e5c00000| 0%| F| |TAMS 0x00000007e5b00000, 0x00000007e5b00000| Untracked -| 92|0x00000007e5c00000, 0x00000007e5c00000, 0x00000007e5d00000| 0%| F| |TAMS 0x00000007e5c00000, 0x00000007e5c00000| Untracked -| 93|0x00000007e5d00000, 0x00000007e5d00000, 0x00000007e5e00000| 0%| F| |TAMS 0x00000007e5d00000, 0x00000007e5d00000| Untracked -| 94|0x00000007e5e00000, 0x00000007e5e00000, 0x00000007e5f00000| 0%| F| |TAMS 0x00000007e5e00000, 0x00000007e5e00000| Untracked -| 95|0x00000007e5f00000, 0x00000007e5f00000, 0x00000007e6000000| 0%| F| |TAMS 0x00000007e5f00000, 0x00000007e5f00000| Untracked -| 96|0x00000007e6000000, 0x00000007e6000000, 0x00000007e6100000| 0%| F| |TAMS 0x00000007e6000000, 0x00000007e6000000| Untracked -| 97|0x00000007e6100000, 0x00000007e6100000, 0x00000007e6200000| 0%| F| |TAMS 0x00000007e6100000, 0x00000007e6100000| Untracked -| 98|0x00000007e6200000, 0x00000007e6200000, 0x00000007e6300000| 0%| F| |TAMS 0x00000007e6200000, 0x00000007e6200000| Untracked -| 99|0x00000007e6300000, 0x00000007e6300000, 0x00000007e6400000| 0%| F| |TAMS 0x00000007e6300000, 0x00000007e6300000| Untracked -| 100|0x00000007e6400000, 0x00000007e6400000, 0x00000007e6500000| 0%| F| |TAMS 0x00000007e6400000, 0x00000007e6400000| Untracked -| 101|0x00000007e6500000, 0x00000007e6500000, 0x00000007e6600000| 0%| F| |TAMS 0x00000007e6500000, 0x00000007e6500000| Untracked -| 102|0x00000007e6600000, 0x00000007e6600000, 0x00000007e6700000| 0%| F| |TAMS 0x00000007e6600000, 0x00000007e6600000| Untracked -| 103|0x00000007e6700000, 0x00000007e6700000, 0x00000007e6800000| 0%| F| |TAMS 0x00000007e6700000, 0x00000007e6700000| Untracked -| 104|0x00000007e6800000, 0x00000007e6800000, 0x00000007e6900000| 0%| F| |TAMS 0x00000007e6800000, 0x00000007e6800000| Untracked -| 105|0x00000007e6900000, 0x00000007e6900000, 0x00000007e6a00000| 0%| F| |TAMS 0x00000007e6900000, 0x00000007e6900000| Untracked -| 106|0x00000007e6a00000, 0x00000007e6a00000, 0x00000007e6b00000| 0%| F| |TAMS 0x00000007e6a00000, 0x00000007e6a00000| Untracked -| 107|0x00000007e6b00000, 0x00000007e6b00000, 0x00000007e6c00000| 0%| F| |TAMS 0x00000007e6b00000, 0x00000007e6b00000| Untracked -| 108|0x00000007e6c00000, 0x00000007e6c00000, 0x00000007e6d00000| 0%| F| |TAMS 0x00000007e6c00000, 0x00000007e6c00000| Untracked -| 109|0x00000007e6d00000, 0x00000007e6d00000, 0x00000007e6e00000| 0%| F| |TAMS 0x00000007e6d00000, 0x00000007e6d00000| Untracked -| 110|0x00000007e6e00000, 0x00000007e6e00000, 0x00000007e6f00000| 0%| F| |TAMS 0x00000007e6e00000, 0x00000007e6e00000| Untracked -| 111|0x00000007e6f00000, 0x00000007e6f00000, 0x00000007e7000000| 0%| F| |TAMS 0x00000007e6f00000, 0x00000007e6f00000| Untracked -| 112|0x00000007e7000000, 0x00000007e7000000, 0x00000007e7100000| 0%| F| |TAMS 0x00000007e7000000, 0x00000007e7000000| Untracked -| 113|0x00000007e7100000, 0x00000007e7100000, 0x00000007e7200000| 0%| F| |TAMS 0x00000007e7100000, 0x00000007e7100000| Untracked -| 114|0x00000007e7200000, 0x00000007e7200000, 0x00000007e7300000| 0%| F| |TAMS 0x00000007e7200000, 0x00000007e7200000| Untracked -| 115|0x00000007e7300000, 0x00000007e7300000, 0x00000007e7400000| 0%| F| |TAMS 0x00000007e7300000, 0x00000007e7300000| Untracked -| 116|0x00000007e7400000, 0x00000007e7400000, 0x00000007e7500000| 0%| F| |TAMS 0x00000007e7400000, 0x00000007e7400000| Untracked -| 117|0x00000007e7500000, 0x00000007e7500000, 0x00000007e7600000| 0%| F| |TAMS 0x00000007e7500000, 0x00000007e7500000| Untracked -| 118|0x00000007e7600000, 0x00000007e7600000, 0x00000007e7700000| 0%| F| |TAMS 0x00000007e7600000, 0x00000007e7600000| Untracked -| 119|0x00000007e7700000, 0x00000007e7700000, 0x00000007e7800000| 0%| F| |TAMS 0x00000007e7700000, 0x00000007e7700000| Untracked -| 120|0x00000007e7800000, 0x00000007e7800000, 0x00000007e7900000| 0%| F| |TAMS 0x00000007e7800000, 0x00000007e7800000| Untracked -| 121|0x00000007e7900000, 0x00000007e7900000, 0x00000007e7a00000| 0%| F| |TAMS 0x00000007e7900000, 0x00000007e7900000| Untracked -| 122|0x00000007e7a00000, 0x00000007e7a00000, 0x00000007e7b00000| 0%| F| |TAMS 0x00000007e7a00000, 0x00000007e7a00000| Untracked -| 123|0x00000007e7b00000, 0x00000007e7b00000, 0x00000007e7c00000| 0%| F| |TAMS 0x00000007e7b00000, 0x00000007e7b00000| Untracked -| 124|0x00000007e7c00000, 0x00000007e7c00000, 0x00000007e7d00000| 0%| F| |TAMS 0x00000007e7c00000, 0x00000007e7c00000| Untracked -| 125|0x00000007e7d00000, 0x00000007e7d00000, 0x00000007e7e00000| 0%| F| |TAMS 0x00000007e7d00000, 0x00000007e7d00000| Untracked -| 126|0x00000007e7e00000, 0x00000007e7e00000, 0x00000007e7f00000| 0%| F| |TAMS 0x00000007e7e00000, 0x00000007e7e00000| Untracked -| 127|0x00000007e7f00000, 0x00000007e7f00000, 0x00000007e8000000| 0%| F| |TAMS 0x00000007e7f00000, 0x00000007e7f00000| Untracked -| 128|0x00000007e8000000, 0x00000007e8000000, 0x00000007e8100000| 0%| F| |TAMS 0x00000007e8000000, 0x00000007e8000000| Untracked -| 129|0x00000007e8100000, 0x00000007e8100000, 0x00000007e8200000| 0%| F| |TAMS 0x00000007e8100000, 0x00000007e8100000| Untracked -| 130|0x00000007e8200000, 0x00000007e8200000, 0x00000007e8300000| 0%| F| |TAMS 0x00000007e8200000, 0x00000007e8200000| Untracked -| 131|0x00000007e8300000, 0x00000007e8300000, 0x00000007e8400000| 0%| F| |TAMS 0x00000007e8300000, 0x00000007e8300000| Untracked -| 132|0x00000007e8400000, 0x00000007e8400000, 0x00000007e8500000| 0%| F| |TAMS 0x00000007e8400000, 0x00000007e8400000| Untracked -| 133|0x00000007e8500000, 0x00000007e8500000, 0x00000007e8600000| 0%| F| |TAMS 0x00000007e8500000, 0x00000007e8500000| Untracked -| 134|0x00000007e8600000, 0x00000007e8600000, 0x00000007e8700000| 0%| F| |TAMS 0x00000007e8600000, 0x00000007e8600000| Untracked -| 135|0x00000007e8700000, 0x00000007e8700000, 0x00000007e8800000| 0%| F| |TAMS 0x00000007e8700000, 0x00000007e8700000| Untracked -| 136|0x00000007e8800000, 0x00000007e8800000, 0x00000007e8900000| 0%| F| |TAMS 0x00000007e8800000, 0x00000007e8800000| Untracked -| 137|0x00000007e8900000, 0x00000007e8900000, 0x00000007e8a00000| 0%| F| |TAMS 0x00000007e8900000, 0x00000007e8900000| Untracked -| 138|0x00000007e8a00000, 0x00000007e8a00000, 0x00000007e8b00000| 0%| F| |TAMS 0x00000007e8a00000, 0x00000007e8a00000| Untracked -| 139|0x00000007e8b00000, 0x00000007e8b00000, 0x00000007e8c00000| 0%| F| |TAMS 0x00000007e8b00000, 0x00000007e8b00000| Untracked -| 140|0x00000007e8c00000, 0x00000007e8c00000, 0x00000007e8d00000| 0%| F| |TAMS 0x00000007e8c00000, 0x00000007e8c00000| Untracked -| 141|0x00000007e8d00000, 0x00000007e8d00000, 0x00000007e8e00000| 0%| F| |TAMS 0x00000007e8d00000, 0x00000007e8d00000| Untracked -| 142|0x00000007e8e00000, 0x00000007e8e00000, 0x00000007e8f00000| 0%| F| |TAMS 0x00000007e8e00000, 0x00000007e8e00000| Untracked -| 143|0x00000007e8f00000, 0x00000007e8f00000, 0x00000007e9000000| 0%| F| |TAMS 0x00000007e8f00000, 0x00000007e8f00000| Untracked -| 144|0x00000007e9000000, 0x00000007e9000000, 0x00000007e9100000| 0%| F| |TAMS 0x00000007e9000000, 0x00000007e9000000| Untracked -| 145|0x00000007e9100000, 0x00000007e9100000, 0x00000007e9200000| 0%| F| |TAMS 0x00000007e9100000, 0x00000007e9100000| Untracked -| 146|0x00000007e9200000, 0x00000007e9200000, 0x00000007e9300000| 0%| F| |TAMS 0x00000007e9200000, 0x00000007e9200000| Untracked -| 147|0x00000007e9300000, 0x00000007e9300000, 0x00000007e9400000| 0%| F| |TAMS 0x00000007e9300000, 0x00000007e9300000| Untracked -| 148|0x00000007e9400000, 0x00000007e9400000, 0x00000007e9500000| 0%| F| |TAMS 0x00000007e9400000, 0x00000007e9400000| Untracked -| 149|0x00000007e9500000, 0x00000007e9500000, 0x00000007e9600000| 0%| F| |TAMS 0x00000007e9500000, 0x00000007e9500000| Untracked -| 150|0x00000007e9600000, 0x00000007e9600000, 0x00000007e9700000| 0%| F| |TAMS 0x00000007e9600000, 0x00000007e9600000| Untracked -| 151|0x00000007e9700000, 0x00000007e9700000, 0x00000007e9800000| 0%| F| |TAMS 0x00000007e9700000, 0x00000007e9700000| Untracked -| 152|0x00000007e9800000, 0x00000007e9800000, 0x00000007e9900000| 0%| F| |TAMS 0x00000007e9800000, 0x00000007e9800000| Untracked -| 153|0x00000007e9900000, 0x00000007e9900000, 0x00000007e9a00000| 0%| F| |TAMS 0x00000007e9900000, 0x00000007e9900000| Untracked -| 154|0x00000007e9a00000, 0x00000007e9a00000, 0x00000007e9b00000| 0%| F| |TAMS 0x00000007e9a00000, 0x00000007e9a00000| Untracked -| 155|0x00000007e9b00000, 0x00000007e9b00000, 0x00000007e9c00000| 0%| F| |TAMS 0x00000007e9b00000, 0x00000007e9b00000| Untracked -| 156|0x00000007e9c00000, 0x00000007e9c00000, 0x00000007e9d00000| 0%| F| |TAMS 0x00000007e9c00000, 0x00000007e9c00000| Untracked -| 157|0x00000007e9d00000, 0x00000007e9d00000, 0x00000007e9e00000| 0%| F| |TAMS 0x00000007e9d00000, 0x00000007e9d00000| Untracked -| 158|0x00000007e9e00000, 0x00000007e9e00000, 0x00000007e9f00000| 0%| F| |TAMS 0x00000007e9e00000, 0x00000007e9e00000| Untracked -| 159|0x00000007e9f00000, 0x00000007e9f00000, 0x00000007ea000000| 0%| F| |TAMS 0x00000007e9f00000, 0x00000007e9f00000| Untracked -| 160|0x00000007ea000000, 0x00000007ea000000, 0x00000007ea100000| 0%| F| |TAMS 0x00000007ea000000, 0x00000007ea000000| Untracked -| 161|0x00000007ea100000, 0x00000007ea100000, 0x00000007ea200000| 0%| F| |TAMS 0x00000007ea100000, 0x00000007ea100000| Untracked -| 162|0x00000007ea200000, 0x00000007ea200000, 0x00000007ea300000| 0%| F| |TAMS 0x00000007ea200000, 0x00000007ea200000| Untracked -| 163|0x00000007ea300000, 0x00000007ea300000, 0x00000007ea400000| 0%| F| |TAMS 0x00000007ea300000, 0x00000007ea300000| Untracked -| 164|0x00000007ea400000, 0x00000007ea400000, 0x00000007ea500000| 0%| F| |TAMS 0x00000007ea400000, 0x00000007ea400000| Untracked -| 165|0x00000007ea500000, 0x00000007ea500000, 0x00000007ea600000| 0%| F| |TAMS 0x00000007ea500000, 0x00000007ea500000| Untracked -| 166|0x00000007ea600000, 0x00000007ea600000, 0x00000007ea700000| 0%| F| |TAMS 0x00000007ea600000, 0x00000007ea600000| Untracked -| 167|0x00000007ea700000, 0x00000007ea700000, 0x00000007ea800000| 0%| F| |TAMS 0x00000007ea700000, 0x00000007ea700000| Untracked -| 168|0x00000007ea800000, 0x00000007ea800000, 0x00000007ea900000| 0%| F| |TAMS 0x00000007ea800000, 0x00000007ea800000| Untracked -| 169|0x00000007ea900000, 0x00000007ea900000, 0x00000007eaa00000| 0%| F| |TAMS 0x00000007ea900000, 0x00000007ea900000| Untracked -| 170|0x00000007eaa00000, 0x00000007eaa00000, 0x00000007eab00000| 0%| F| |TAMS 0x00000007eaa00000, 0x00000007eaa00000| Untracked -| 171|0x00000007eab00000, 0x00000007eab00000, 0x00000007eac00000| 0%| F| |TAMS 0x00000007eab00000, 0x00000007eab00000| Untracked -| 172|0x00000007eac00000, 0x00000007eac00000, 0x00000007ead00000| 0%| F| |TAMS 0x00000007eac00000, 0x00000007eac00000| Untracked -| 173|0x00000007ead00000, 0x00000007ead00000, 0x00000007eae00000| 0%| F| |TAMS 0x00000007ead00000, 0x00000007ead00000| Untracked -| 174|0x00000007eae00000, 0x00000007eae00000, 0x00000007eaf00000| 0%| F| |TAMS 0x00000007eae00000, 0x00000007eae00000| Untracked -| 175|0x00000007eaf00000, 0x00000007eaf00000, 0x00000007eb000000| 0%| F| |TAMS 0x00000007eaf00000, 0x00000007eaf00000| Untracked -| 176|0x00000007eb000000, 0x00000007eb000000, 0x00000007eb100000| 0%| F| |TAMS 0x00000007eb000000, 0x00000007eb000000| Untracked -| 177|0x00000007eb100000, 0x00000007eb100000, 0x00000007eb200000| 0%| F| |TAMS 0x00000007eb100000, 0x00000007eb100000| Untracked -| 178|0x00000007eb200000, 0x00000007eb200000, 0x00000007eb300000| 0%| F| |TAMS 0x00000007eb200000, 0x00000007eb200000| Untracked -| 179|0x00000007eb300000, 0x00000007eb300000, 0x00000007eb400000| 0%| F| |TAMS 0x00000007eb300000, 0x00000007eb300000| Untracked -| 180|0x00000007eb400000, 0x00000007eb400000, 0x00000007eb500000| 0%| F| |TAMS 0x00000007eb400000, 0x00000007eb400000| Untracked -| 181|0x00000007eb500000, 0x00000007eb500000, 0x00000007eb600000| 0%| F| |TAMS 0x00000007eb500000, 0x00000007eb500000| Untracked -| 182|0x00000007eb600000, 0x00000007eb600000, 0x00000007eb700000| 0%| F| |TAMS 0x00000007eb600000, 0x00000007eb600000| Untracked -| 183|0x00000007eb700000, 0x00000007eb700000, 0x00000007eb800000| 0%| F| |TAMS 0x00000007eb700000, 0x00000007eb700000| Untracked -| 184|0x00000007eb800000, 0x00000007eb800000, 0x00000007eb900000| 0%| F| |TAMS 0x00000007eb800000, 0x00000007eb800000| Untracked -| 185|0x00000007eb900000, 0x00000007eb900000, 0x00000007eba00000| 0%| F| |TAMS 0x00000007eb900000, 0x00000007eb900000| Untracked -| 186|0x00000007eba00000, 0x00000007eba00000, 0x00000007ebb00000| 0%| F| |TAMS 0x00000007eba00000, 0x00000007eba00000| Untracked -| 187|0x00000007ebb00000, 0x00000007ebb00000, 0x00000007ebc00000| 0%| F| |TAMS 0x00000007ebb00000, 0x00000007ebb00000| Untracked -| 188|0x00000007ebc00000, 0x00000007ebc00000, 0x00000007ebd00000| 0%| F| |TAMS 0x00000007ebc00000, 0x00000007ebc00000| Untracked -| 189|0x00000007ebd00000, 0x00000007ebd00000, 0x00000007ebe00000| 0%| F| |TAMS 0x00000007ebd00000, 0x00000007ebd00000| Untracked -| 190|0x00000007ebe00000, 0x00000007ebe00000, 0x00000007ebf00000| 0%| F| |TAMS 0x00000007ebe00000, 0x00000007ebe00000| Untracked -| 191|0x00000007ebf00000, 0x00000007ebf00000, 0x00000007ec000000| 0%| F| |TAMS 0x00000007ebf00000, 0x00000007ebf00000| Untracked -| 192|0x00000007ec000000, 0x00000007ec000000, 0x00000007ec100000| 0%| F| |TAMS 0x00000007ec000000, 0x00000007ec000000| Untracked -| 193|0x00000007ec100000, 0x00000007ec100000, 0x00000007ec200000| 0%| F| |TAMS 0x00000007ec100000, 0x00000007ec100000| Untracked -| 194|0x00000007ec200000, 0x00000007ec200000, 0x00000007ec300000| 0%| F| |TAMS 0x00000007ec200000, 0x00000007ec200000| Untracked -| 195|0x00000007ec300000, 0x00000007ec300000, 0x00000007ec400000| 0%| F| |TAMS 0x00000007ec300000, 0x00000007ec300000| Untracked -| 196|0x00000007ec400000, 0x00000007ec400000, 0x00000007ec500000| 0%| F| |TAMS 0x00000007ec400000, 0x00000007ec400000| Untracked -| 197|0x00000007ec500000, 0x00000007ec500000, 0x00000007ec600000| 0%| F| |TAMS 0x00000007ec500000, 0x00000007ec500000| Untracked -| 198|0x00000007ec600000, 0x00000007ec600000, 0x00000007ec700000| 0%| F| |TAMS 0x00000007ec600000, 0x00000007ec600000| Untracked -| 199|0x00000007ec700000, 0x00000007ec700000, 0x00000007ec800000| 0%| F| |TAMS 0x00000007ec700000, 0x00000007ec700000| Untracked -| 200|0x00000007ec800000, 0x00000007ec800000, 0x00000007ec900000| 0%| F| |TAMS 0x00000007ec800000, 0x00000007ec800000| Untracked -| 201|0x00000007ec900000, 0x00000007ec900000, 0x00000007eca00000| 0%| F| |TAMS 0x00000007ec900000, 0x00000007ec900000| Untracked -| 202|0x00000007eca00000, 0x00000007eca00000, 0x00000007ecb00000| 0%| F| |TAMS 0x00000007eca00000, 0x00000007eca00000| Untracked -| 203|0x00000007ecb00000, 0x00000007ecb00000, 0x00000007ecc00000| 0%| F| |TAMS 0x00000007ecb00000, 0x00000007ecb00000| Untracked -| 204|0x00000007ecc00000, 0x00000007ecc00000, 0x00000007ecd00000| 0%| F| |TAMS 0x00000007ecc00000, 0x00000007ecc00000| Untracked -| 205|0x00000007ecd00000, 0x00000007ecd00000, 0x00000007ece00000| 0%| F| |TAMS 0x00000007ecd00000, 0x00000007ecd00000| Untracked -| 206|0x00000007ece00000, 0x00000007ece00000, 0x00000007ecf00000| 0%| F| |TAMS 0x00000007ece00000, 0x00000007ece00000| Untracked -| 207|0x00000007ecf00000, 0x00000007ecf00000, 0x00000007ed000000| 0%| F| |TAMS 0x00000007ecf00000, 0x00000007ecf00000| Untracked -| 208|0x00000007ed000000, 0x00000007ed000000, 0x00000007ed100000| 0%| F| |TAMS 0x00000007ed000000, 0x00000007ed000000| Untracked -| 209|0x00000007ed100000, 0x00000007ed100000, 0x00000007ed200000| 0%| F| |TAMS 0x00000007ed100000, 0x00000007ed100000| Untracked -| 210|0x00000007ed200000, 0x00000007ed200000, 0x00000007ed300000| 0%| F| |TAMS 0x00000007ed200000, 0x00000007ed200000| Untracked -| 211|0x00000007ed300000, 0x00000007ed300000, 0x00000007ed400000| 0%| F| |TAMS 0x00000007ed300000, 0x00000007ed300000| Untracked -| 212|0x00000007ed400000, 0x00000007ed400000, 0x00000007ed500000| 0%| F| |TAMS 0x00000007ed400000, 0x00000007ed400000| Untracked -| 213|0x00000007ed500000, 0x00000007ed500000, 0x00000007ed600000| 0%| F| |TAMS 0x00000007ed500000, 0x00000007ed500000| Untracked -| 214|0x00000007ed600000, 0x00000007ed600000, 0x00000007ed700000| 0%| F| |TAMS 0x00000007ed600000, 0x00000007ed600000| Untracked -| 215|0x00000007ed700000, 0x00000007ed700000, 0x00000007ed800000| 0%| F| |TAMS 0x00000007ed700000, 0x00000007ed700000| Untracked -| 216|0x00000007ed800000, 0x00000007ed800000, 0x00000007ed900000| 0%| F| |TAMS 0x00000007ed800000, 0x00000007ed800000| Untracked -| 217|0x00000007ed900000, 0x00000007ed900000, 0x00000007eda00000| 0%| F| |TAMS 0x00000007ed900000, 0x00000007ed900000| Untracked -| 218|0x00000007eda00000, 0x00000007eda00000, 0x00000007edb00000| 0%| F| |TAMS 0x00000007eda00000, 0x00000007eda00000| Untracked -| 219|0x00000007edb00000, 0x00000007edb00000, 0x00000007edc00000| 0%| F| |TAMS 0x00000007edb00000, 0x00000007edb00000| Untracked -| 220|0x00000007edc00000, 0x00000007edc00000, 0x00000007edd00000| 0%| F| |TAMS 0x00000007edc00000, 0x00000007edc00000| Untracked -| 221|0x00000007edd00000, 0x00000007edd00000, 0x00000007ede00000| 0%| F| |TAMS 0x00000007edd00000, 0x00000007edd00000| Untracked -| 222|0x00000007ede00000, 0x00000007ede00000, 0x00000007edf00000| 0%| F| |TAMS 0x00000007ede00000, 0x00000007ede00000| Untracked -| 223|0x00000007edf00000, 0x00000007edf00000, 0x00000007ee000000| 0%| F| |TAMS 0x00000007edf00000, 0x00000007edf00000| Untracked -| 224|0x00000007ee000000, 0x00000007ee000000, 0x00000007ee100000| 0%| F| |TAMS 0x00000007ee000000, 0x00000007ee000000| Untracked -| 225|0x00000007ee100000, 0x00000007ee100000, 0x00000007ee200000| 0%| F| |TAMS 0x00000007ee100000, 0x00000007ee100000| Untracked -| 226|0x00000007ee200000, 0x00000007ee200000, 0x00000007ee300000| 0%| F| |TAMS 0x00000007ee200000, 0x00000007ee200000| Untracked -| 227|0x00000007ee300000, 0x00000007ee300000, 0x00000007ee400000| 0%| F| |TAMS 0x00000007ee300000, 0x00000007ee300000| Untracked -| 228|0x00000007ee400000, 0x00000007ee400000, 0x00000007ee500000| 0%| F| |TAMS 0x00000007ee400000, 0x00000007ee400000| Untracked -| 229|0x00000007ee500000, 0x00000007ee500000, 0x00000007ee600000| 0%| F| |TAMS 0x00000007ee500000, 0x00000007ee500000| Untracked -| 230|0x00000007ee600000, 0x00000007ee600000, 0x00000007ee700000| 0%| F| |TAMS 0x00000007ee600000, 0x00000007ee600000| Untracked -| 231|0x00000007ee700000, 0x00000007ee700000, 0x00000007ee800000| 0%| F| |TAMS 0x00000007ee700000, 0x00000007ee700000| Untracked -| 232|0x00000007ee800000, 0x00000007ee800000, 0x00000007ee900000| 0%| F| |TAMS 0x00000007ee800000, 0x00000007ee800000| Untracked -| 233|0x00000007ee900000, 0x00000007ee900000, 0x00000007eea00000| 0%| F| |TAMS 0x00000007ee900000, 0x00000007ee900000| Untracked -| 234|0x00000007eea00000, 0x00000007eea00000, 0x00000007eeb00000| 0%| F| |TAMS 0x00000007eea00000, 0x00000007eea00000| Untracked -| 235|0x00000007eeb00000, 0x00000007eeb00000, 0x00000007eec00000| 0%| F| |TAMS 0x00000007eeb00000, 0x00000007eeb00000| Untracked -| 236|0x00000007eec00000, 0x00000007eec00000, 0x00000007eed00000| 0%| F| |TAMS 0x00000007eec00000, 0x00000007eec00000| Untracked -| 237|0x00000007eed00000, 0x00000007eed00000, 0x00000007eee00000| 0%| F| |TAMS 0x00000007eed00000, 0x00000007eed00000| Untracked -| 238|0x00000007eee00000, 0x00000007eee00000, 0x00000007eef00000| 0%| F| |TAMS 0x00000007eee00000, 0x00000007eee00000| Untracked -| 239|0x00000007eef00000, 0x00000007eef00000, 0x00000007ef000000| 0%| F| |TAMS 0x00000007eef00000, 0x00000007eef00000| Untracked -| 240|0x00000007ef000000, 0x00000007ef000000, 0x00000007ef100000| 0%| F| |TAMS 0x00000007ef000000, 0x00000007ef000000| Untracked -| 241|0x00000007ef100000, 0x00000007ef100000, 0x00000007ef200000| 0%| F| |TAMS 0x00000007ef100000, 0x00000007ef100000| Untracked -| 242|0x00000007ef200000, 0x00000007ef200000, 0x00000007ef300000| 0%| F| |TAMS 0x00000007ef200000, 0x00000007ef200000| Untracked -| 243|0x00000007ef300000, 0x00000007ef300000, 0x00000007ef400000| 0%| F| |TAMS 0x00000007ef300000, 0x00000007ef300000| Untracked -| 244|0x00000007ef400000, 0x00000007ef400000, 0x00000007ef500000| 0%| F| |TAMS 0x00000007ef400000, 0x00000007ef400000| Untracked -| 245|0x00000007ef500000, 0x00000007ef500000, 0x00000007ef600000| 0%| F| |TAMS 0x00000007ef500000, 0x00000007ef500000| Untracked -| 246|0x00000007ef600000, 0x00000007ef600000, 0x00000007ef700000| 0%| F| |TAMS 0x00000007ef600000, 0x00000007ef600000| Untracked -| 247|0x00000007ef700000, 0x00000007ef700000, 0x00000007ef800000| 0%| F| |TAMS 0x00000007ef700000, 0x00000007ef700000| Untracked -| 248|0x00000007ef800000, 0x00000007ef800000, 0x00000007ef900000| 0%| F| |TAMS 0x00000007ef800000, 0x00000007ef800000| Untracked -| 249|0x00000007ef900000, 0x00000007ef900000, 0x00000007efa00000| 0%| F| |TAMS 0x00000007ef900000, 0x00000007ef900000| Untracked -| 250|0x00000007efa00000, 0x00000007efa00000, 0x00000007efb00000| 0%| F| |TAMS 0x00000007efa00000, 0x00000007efa00000| Untracked -| 251|0x00000007efb00000, 0x00000007efb00000, 0x00000007efc00000| 0%| F| |TAMS 0x00000007efb00000, 0x00000007efb00000| Untracked -| 252|0x00000007efc00000, 0x00000007efc00000, 0x00000007efd00000| 0%| F| |TAMS 0x00000007efc00000, 0x00000007efc00000| Untracked -| 253|0x00000007efd00000, 0x00000007efd00000, 0x00000007efe00000| 0%| F| |TAMS 0x00000007efd00000, 0x00000007efd00000| Untracked -| 254|0x00000007efe00000, 0x00000007efe00000, 0x00000007eff00000| 0%| F| |TAMS 0x00000007efe00000, 0x00000007efe00000| Untracked -| 255|0x00000007eff00000, 0x00000007eff00000, 0x00000007f0000000| 0%| F| |TAMS 0x00000007eff00000, 0x00000007eff00000| Untracked -| 256|0x00000007f0000000, 0x00000007f0000000, 0x00000007f0100000| 0%| F| |TAMS 0x00000007f0000000, 0x00000007f0000000| Untracked -| 257|0x00000007f0100000, 0x00000007f0100000, 0x00000007f0200000| 0%| F| |TAMS 0x00000007f0100000, 0x00000007f0100000| Untracked -| 258|0x00000007f0200000, 0x00000007f0200000, 0x00000007f0300000| 0%| F| |TAMS 0x00000007f0200000, 0x00000007f0200000| Untracked -| 259|0x00000007f0300000, 0x00000007f0300000, 0x00000007f0400000| 0%| F| |TAMS 0x00000007f0300000, 0x00000007f0300000| Untracked -| 260|0x00000007f0400000, 0x00000007f0400000, 0x00000007f0500000| 0%| F| |TAMS 0x00000007f0400000, 0x00000007f0400000| Untracked -| 261|0x00000007f0500000, 0x00000007f0500000, 0x00000007f0600000| 0%| F| |TAMS 0x00000007f0500000, 0x00000007f0500000| Untracked -| 262|0x00000007f0600000, 0x00000007f0600000, 0x00000007f0700000| 0%| F| |TAMS 0x00000007f0600000, 0x00000007f0600000| Untracked -| 263|0x00000007f0700000, 0x00000007f0700000, 0x00000007f0800000| 0%| F| |TAMS 0x00000007f0700000, 0x00000007f0700000| Untracked -| 264|0x00000007f0800000, 0x00000007f0800000, 0x00000007f0900000| 0%| F| |TAMS 0x00000007f0800000, 0x00000007f0800000| Untracked -| 265|0x00000007f0900000, 0x00000007f0900000, 0x00000007f0a00000| 0%| F| |TAMS 0x00000007f0900000, 0x00000007f0900000| Untracked -| 266|0x00000007f0a00000, 0x00000007f0a00000, 0x00000007f0b00000| 0%| F| |TAMS 0x00000007f0a00000, 0x00000007f0a00000| Untracked -| 267|0x00000007f0b00000, 0x00000007f0b00000, 0x00000007f0c00000| 0%| F| |TAMS 0x00000007f0b00000, 0x00000007f0b00000| Untracked -| 268|0x00000007f0c00000, 0x00000007f0c00000, 0x00000007f0d00000| 0%| F| |TAMS 0x00000007f0c00000, 0x00000007f0c00000| Untracked -| 269|0x00000007f0d00000, 0x00000007f0d00000, 0x00000007f0e00000| 0%| F| |TAMS 0x00000007f0d00000, 0x00000007f0d00000| Untracked -| 270|0x00000007f0e00000, 0x00000007f0e00000, 0x00000007f0f00000| 0%| F| |TAMS 0x00000007f0e00000, 0x00000007f0e00000| Untracked -| 271|0x00000007f0f00000, 0x00000007f0f00000, 0x00000007f1000000| 0%| F| |TAMS 0x00000007f0f00000, 0x00000007f0f00000| Untracked -| 272|0x00000007f1000000, 0x00000007f1000000, 0x00000007f1100000| 0%| F| |TAMS 0x00000007f1000000, 0x00000007f1000000| Untracked -| 273|0x00000007f1100000, 0x00000007f1100000, 0x00000007f1200000| 0%| F| |TAMS 0x00000007f1100000, 0x00000007f1100000| Untracked -| 274|0x00000007f1200000, 0x00000007f1200000, 0x00000007f1300000| 0%| F| |TAMS 0x00000007f1200000, 0x00000007f1200000| Untracked -| 275|0x00000007f1300000, 0x00000007f1300000, 0x00000007f1400000| 0%| F| |TAMS 0x00000007f1300000, 0x00000007f1300000| Untracked -| 276|0x00000007f1400000, 0x00000007f1400000, 0x00000007f1500000| 0%| F| |TAMS 0x00000007f1400000, 0x00000007f1400000| Untracked -| 277|0x00000007f1500000, 0x00000007f1500000, 0x00000007f1600000| 0%| F| |TAMS 0x00000007f1500000, 0x00000007f1500000| Untracked -| 278|0x00000007f1600000, 0x00000007f1600000, 0x00000007f1700000| 0%| F| |TAMS 0x00000007f1600000, 0x00000007f1600000| Untracked -| 279|0x00000007f1700000, 0x00000007f1700000, 0x00000007f1800000| 0%| F| |TAMS 0x00000007f1700000, 0x00000007f1700000| Untracked -| 280|0x00000007f1800000, 0x00000007f1800000, 0x00000007f1900000| 0%| F| |TAMS 0x00000007f1800000, 0x00000007f1800000| Untracked -| 281|0x00000007f1900000, 0x00000007f1900000, 0x00000007f1a00000| 0%| F| |TAMS 0x00000007f1900000, 0x00000007f1900000| Untracked -| 282|0x00000007f1a00000, 0x00000007f1a00000, 0x00000007f1b00000| 0%| F| |TAMS 0x00000007f1a00000, 0x00000007f1a00000| Untracked -| 283|0x00000007f1b00000, 0x00000007f1b00000, 0x00000007f1c00000| 0%| F| |TAMS 0x00000007f1b00000, 0x00000007f1b00000| Untracked -| 284|0x00000007f1c00000, 0x00000007f1c00000, 0x00000007f1d00000| 0%| F| |TAMS 0x00000007f1c00000, 0x00000007f1c00000| Untracked -| 285|0x00000007f1d00000, 0x00000007f1d00000, 0x00000007f1e00000| 0%| F| |TAMS 0x00000007f1d00000, 0x00000007f1d00000| Untracked -| 286|0x00000007f1e00000, 0x00000007f1e00000, 0x00000007f1f00000| 0%| F| |TAMS 0x00000007f1e00000, 0x00000007f1e00000| Untracked -| 287|0x00000007f1f00000, 0x00000007f1f00000, 0x00000007f2000000| 0%| F| |TAMS 0x00000007f1f00000, 0x00000007f1f00000| Untracked -| 288|0x00000007f2000000, 0x00000007f2000000, 0x00000007f2100000| 0%| F| |TAMS 0x00000007f2000000, 0x00000007f2000000| Untracked -| 289|0x00000007f2100000, 0x00000007f2100000, 0x00000007f2200000| 0%| F| |TAMS 0x00000007f2100000, 0x00000007f2100000| Untracked -| 290|0x00000007f2200000, 0x00000007f2200000, 0x00000007f2300000| 0%| F| |TAMS 0x00000007f2200000, 0x00000007f2200000| Untracked -| 291|0x00000007f2300000, 0x00000007f2300000, 0x00000007f2400000| 0%| F| |TAMS 0x00000007f2300000, 0x00000007f2300000| Untracked -| 292|0x00000007f2400000, 0x00000007f2400000, 0x00000007f2500000| 0%| F| |TAMS 0x00000007f2400000, 0x00000007f2400000| Untracked -| 293|0x00000007f2500000, 0x00000007f2500000, 0x00000007f2600000| 0%| F| |TAMS 0x00000007f2500000, 0x00000007f2500000| Untracked -| 294|0x00000007f2600000, 0x00000007f2600000, 0x00000007f2700000| 0%| F| |TAMS 0x00000007f2600000, 0x00000007f2600000| Untracked -| 295|0x00000007f2700000, 0x00000007f2700000, 0x00000007f2800000| 0%| F| |TAMS 0x00000007f2700000, 0x00000007f2700000| Untracked -| 296|0x00000007f2800000, 0x00000007f2800000, 0x00000007f2900000| 0%| F| |TAMS 0x00000007f2800000, 0x00000007f2800000| Untracked -| 297|0x00000007f2900000, 0x00000007f2900000, 0x00000007f2a00000| 0%| F| |TAMS 0x00000007f2900000, 0x00000007f2900000| Untracked -| 298|0x00000007f2a00000, 0x00000007f2a00000, 0x00000007f2b00000| 0%| F| |TAMS 0x00000007f2a00000, 0x00000007f2a00000| Untracked -| 299|0x00000007f2b00000, 0x00000007f2b00000, 0x00000007f2c00000| 0%| F| |TAMS 0x00000007f2b00000, 0x00000007f2b00000| Untracked -| 300|0x00000007f2c00000, 0x00000007f2c00000, 0x00000007f2d00000| 0%| F| |TAMS 0x00000007f2c00000, 0x00000007f2c00000| Untracked -| 301|0x00000007f2d00000, 0x00000007f2d00000, 0x00000007f2e00000| 0%| F| |TAMS 0x00000007f2d00000, 0x00000007f2d00000| Untracked -| 302|0x00000007f2e00000, 0x00000007f2e00000, 0x00000007f2f00000| 0%| F| |TAMS 0x00000007f2e00000, 0x00000007f2e00000| Untracked -| 303|0x00000007f2f00000, 0x00000007f2f00000, 0x00000007f3000000| 0%| F| |TAMS 0x00000007f2f00000, 0x00000007f2f00000| Untracked -| 304|0x00000007f3000000, 0x00000007f3000000, 0x00000007f3100000| 0%| F| |TAMS 0x00000007f3000000, 0x00000007f3000000| Untracked -| 305|0x00000007f3100000, 0x00000007f3100000, 0x00000007f3200000| 0%| F| |TAMS 0x00000007f3100000, 0x00000007f3100000| Untracked -| 306|0x00000007f3200000, 0x00000007f3200000, 0x00000007f3300000| 0%| F| |TAMS 0x00000007f3200000, 0x00000007f3200000| Untracked -| 307|0x00000007f3300000, 0x00000007f3300000, 0x00000007f3400000| 0%| F| |TAMS 0x00000007f3300000, 0x00000007f3300000| Untracked -| 308|0x00000007f3400000, 0x00000007f3400000, 0x00000007f3500000| 0%| F| |TAMS 0x00000007f3400000, 0x00000007f3400000| Untracked -| 309|0x00000007f3500000, 0x00000007f3500000, 0x00000007f3600000| 0%| F| |TAMS 0x00000007f3500000, 0x00000007f3500000| Untracked -| 310|0x00000007f3600000, 0x00000007f3600000, 0x00000007f3700000| 0%| F| |TAMS 0x00000007f3600000, 0x00000007f3600000| Untracked -| 311|0x00000007f3700000, 0x00000007f3700000, 0x00000007f3800000| 0%| F| |TAMS 0x00000007f3700000, 0x00000007f3700000| Untracked -| 312|0x00000007f3800000, 0x00000007f3800000, 0x00000007f3900000| 0%| F| |TAMS 0x00000007f3800000, 0x00000007f3800000| Untracked -| 313|0x00000007f3900000, 0x00000007f3900000, 0x00000007f3a00000| 0%| F| |TAMS 0x00000007f3900000, 0x00000007f3900000| Untracked -| 314|0x00000007f3a00000, 0x00000007f3a00000, 0x00000007f3b00000| 0%| F| |TAMS 0x00000007f3a00000, 0x00000007f3a00000| Untracked -| 315|0x00000007f3b00000, 0x00000007f3b00000, 0x00000007f3c00000| 0%| F| |TAMS 0x00000007f3b00000, 0x00000007f3b00000| Untracked -| 316|0x00000007f3c00000, 0x00000007f3c00000, 0x00000007f3d00000| 0%| F| |TAMS 0x00000007f3c00000, 0x00000007f3c00000| Untracked -| 317|0x00000007f3d00000, 0x00000007f3d00000, 0x00000007f3e00000| 0%| F| |TAMS 0x00000007f3d00000, 0x00000007f3d00000| Untracked -| 318|0x00000007f3e00000, 0x00000007f3e00000, 0x00000007f3f00000| 0%| F| |TAMS 0x00000007f3e00000, 0x00000007f3e00000| Untracked -| 319|0x00000007f3f00000, 0x00000007f3f00000, 0x00000007f4000000| 0%| F| |TAMS 0x00000007f3f00000, 0x00000007f3f00000| Untracked -| 320|0x00000007f4000000, 0x00000007f4000000, 0x00000007f4100000| 0%| F| |TAMS 0x00000007f4000000, 0x00000007f4000000| Untracked -| 321|0x00000007f4100000, 0x00000007f4100000, 0x00000007f4200000| 0%| F| |TAMS 0x00000007f4100000, 0x00000007f4100000| Untracked -| 322|0x00000007f4200000, 0x00000007f4200000, 0x00000007f4300000| 0%| F| |TAMS 0x00000007f4200000, 0x00000007f4200000| Untracked -| 323|0x00000007f4300000, 0x00000007f4300000, 0x00000007f4400000| 0%| F| |TAMS 0x00000007f4300000, 0x00000007f4300000| Untracked -| 324|0x00000007f4400000, 0x00000007f4400000, 0x00000007f4500000| 0%| F| |TAMS 0x00000007f4400000, 0x00000007f4400000| Untracked -| 325|0x00000007f4500000, 0x00000007f4500000, 0x00000007f4600000| 0%| F| |TAMS 0x00000007f4500000, 0x00000007f4500000| Untracked -| 326|0x00000007f4600000, 0x00000007f4600000, 0x00000007f4700000| 0%| F| |TAMS 0x00000007f4600000, 0x00000007f4600000| Untracked -| 327|0x00000007f4700000, 0x00000007f4700000, 0x00000007f4800000| 0%| F| |TAMS 0x00000007f4700000, 0x00000007f4700000| Untracked -| 328|0x00000007f4800000, 0x00000007f4800000, 0x00000007f4900000| 0%| F| |TAMS 0x00000007f4800000, 0x00000007f4800000| Untracked -| 329|0x00000007f4900000, 0x00000007f4900000, 0x00000007f4a00000| 0%| F| |TAMS 0x00000007f4900000, 0x00000007f4900000| Untracked -| 330|0x00000007f4a00000, 0x00000007f4a00000, 0x00000007f4b00000| 0%| F| |TAMS 0x00000007f4a00000, 0x00000007f4a00000| Untracked -| 331|0x00000007f4b00000, 0x00000007f4b00000, 0x00000007f4c00000| 0%| F| |TAMS 0x00000007f4b00000, 0x00000007f4b00000| Untracked -| 332|0x00000007f4c00000, 0x00000007f4c00000, 0x00000007f4d00000| 0%| F| |TAMS 0x00000007f4c00000, 0x00000007f4c00000| Untracked -| 333|0x00000007f4d00000, 0x00000007f4d00000, 0x00000007f4e00000| 0%| F| |TAMS 0x00000007f4d00000, 0x00000007f4d00000| Untracked -| 334|0x00000007f4e00000, 0x00000007f4e00000, 0x00000007f4f00000| 0%| F| |TAMS 0x00000007f4e00000, 0x00000007f4e00000| Untracked -| 335|0x00000007f4f00000, 0x00000007f4f00000, 0x00000007f5000000| 0%| F| |TAMS 0x00000007f4f00000, 0x00000007f4f00000| Untracked -| 336|0x00000007f5000000, 0x00000007f5000000, 0x00000007f5100000| 0%| F| |TAMS 0x00000007f5000000, 0x00000007f5000000| Untracked -| 337|0x00000007f5100000, 0x00000007f5100000, 0x00000007f5200000| 0%| F| |TAMS 0x00000007f5100000, 0x00000007f5100000| Untracked -| 338|0x00000007f5200000, 0x00000007f5200000, 0x00000007f5300000| 0%| F| |TAMS 0x00000007f5200000, 0x00000007f5200000| Untracked -| 339|0x00000007f5300000, 0x00000007f5300000, 0x00000007f5400000| 0%| F| |TAMS 0x00000007f5300000, 0x00000007f5300000| Untracked -| 340|0x00000007f5400000, 0x00000007f5400000, 0x00000007f5500000| 0%| F| |TAMS 0x00000007f5400000, 0x00000007f5400000| Untracked -| 341|0x00000007f5500000, 0x00000007f5500000, 0x00000007f5600000| 0%| F| |TAMS 0x00000007f5500000, 0x00000007f5500000| Untracked -| 342|0x00000007f5600000, 0x00000007f5600000, 0x00000007f5700000| 0%| F| |TAMS 0x00000007f5600000, 0x00000007f5600000| Untracked -| 343|0x00000007f5700000, 0x00000007f5700000, 0x00000007f5800000| 0%| F| |TAMS 0x00000007f5700000, 0x00000007f5700000| Untracked -| 344|0x00000007f5800000, 0x00000007f5800000, 0x00000007f5900000| 0%| F| |TAMS 0x00000007f5800000, 0x00000007f5800000| Untracked -| 345|0x00000007f5900000, 0x00000007f5900000, 0x00000007f5a00000| 0%| F| |TAMS 0x00000007f5900000, 0x00000007f5900000| Untracked -| 346|0x00000007f5a00000, 0x00000007f5a00000, 0x00000007f5b00000| 0%| F| |TAMS 0x00000007f5a00000, 0x00000007f5a00000| Untracked -| 347|0x00000007f5b00000, 0x00000007f5b00000, 0x00000007f5c00000| 0%| F| |TAMS 0x00000007f5b00000, 0x00000007f5b00000| Untracked -| 348|0x00000007f5c00000, 0x00000007f5c00000, 0x00000007f5d00000| 0%| F| |TAMS 0x00000007f5c00000, 0x00000007f5c00000| Untracked -| 349|0x00000007f5d00000, 0x00000007f5d00000, 0x00000007f5e00000| 0%| F| |TAMS 0x00000007f5d00000, 0x00000007f5d00000| Untracked -| 350|0x00000007f5e00000, 0x00000007f5e00000, 0x00000007f5f00000| 0%| F| |TAMS 0x00000007f5e00000, 0x00000007f5e00000| Untracked -| 351|0x00000007f5f00000, 0x00000007f5f00000, 0x00000007f6000000| 0%| F| |TAMS 0x00000007f5f00000, 0x00000007f5f00000| Untracked -| 352|0x00000007f6000000, 0x00000007f6000000, 0x00000007f6100000| 0%| F| |TAMS 0x00000007f6000000, 0x00000007f6000000| Untracked -| 353|0x00000007f6100000, 0x00000007f6100000, 0x00000007f6200000| 0%| F| |TAMS 0x00000007f6100000, 0x00000007f6100000| Untracked -| 354|0x00000007f6200000, 0x00000007f6200000, 0x00000007f6300000| 0%| F| |TAMS 0x00000007f6200000, 0x00000007f6200000| Untracked -| 355|0x00000007f6300000, 0x00000007f6300000, 0x00000007f6400000| 0%| F| |TAMS 0x00000007f6300000, 0x00000007f6300000| Untracked -| 356|0x00000007f6400000, 0x00000007f6400000, 0x00000007f6500000| 0%| F| |TAMS 0x00000007f6400000, 0x00000007f6400000| Untracked -| 357|0x00000007f6500000, 0x00000007f6500000, 0x00000007f6600000| 0%| F| |TAMS 0x00000007f6500000, 0x00000007f6500000| Untracked -| 358|0x00000007f6600000, 0x00000007f6600000, 0x00000007f6700000| 0%| F| |TAMS 0x00000007f6600000, 0x00000007f6600000| Untracked -| 359|0x00000007f6700000, 0x00000007f6700000, 0x00000007f6800000| 0%| F| |TAMS 0x00000007f6700000, 0x00000007f6700000| Untracked -| 360|0x00000007f6800000, 0x00000007f6800000, 0x00000007f6900000| 0%| F| |TAMS 0x00000007f6800000, 0x00000007f6800000| Untracked -| 361|0x00000007f6900000, 0x00000007f6900000, 0x00000007f6a00000| 0%| F| |TAMS 0x00000007f6900000, 0x00000007f6900000| Untracked -| 362|0x00000007f6a00000, 0x00000007f6a00000, 0x00000007f6b00000| 0%| F| |TAMS 0x00000007f6a00000, 0x00000007f6a00000| Untracked -| 363|0x00000007f6b00000, 0x00000007f6b00000, 0x00000007f6c00000| 0%| F| |TAMS 0x00000007f6b00000, 0x00000007f6b00000| Untracked -| 364|0x00000007f6c00000, 0x00000007f6c00000, 0x00000007f6d00000| 0%| F| |TAMS 0x00000007f6c00000, 0x00000007f6c00000| Untracked -| 365|0x00000007f6d00000, 0x00000007f6d00000, 0x00000007f6e00000| 0%| F| |TAMS 0x00000007f6d00000, 0x00000007f6d00000| Untracked -| 366|0x00000007f6e00000, 0x00000007f6e00000, 0x00000007f6f00000| 0%| F| |TAMS 0x00000007f6e00000, 0x00000007f6e00000| Untracked -| 367|0x00000007f6f00000, 0x00000007f6f00000, 0x00000007f7000000| 0%| F| |TAMS 0x00000007f6f00000, 0x00000007f6f00000| Untracked -| 368|0x00000007f7000000, 0x00000007f7000000, 0x00000007f7100000| 0%| F| |TAMS 0x00000007f7000000, 0x00000007f7000000| Untracked -| 369|0x00000007f7100000, 0x00000007f7100000, 0x00000007f7200000| 0%| F| |TAMS 0x00000007f7100000, 0x00000007f7100000| Untracked -| 370|0x00000007f7200000, 0x00000007f7200000, 0x00000007f7300000| 0%| F| |TAMS 0x00000007f7200000, 0x00000007f7200000| Untracked -| 371|0x00000007f7300000, 0x00000007f7300000, 0x00000007f7400000| 0%| F| |TAMS 0x00000007f7300000, 0x00000007f7300000| Untracked -| 372|0x00000007f7400000, 0x00000007f7400000, 0x00000007f7500000| 0%| F| |TAMS 0x00000007f7400000, 0x00000007f7400000| Untracked -| 373|0x00000007f7500000, 0x00000007f7500000, 0x00000007f7600000| 0%| F| |TAMS 0x00000007f7500000, 0x00000007f7500000| Untracked -| 374|0x00000007f7600000, 0x00000007f7600000, 0x00000007f7700000| 0%| F| |TAMS 0x00000007f7600000, 0x00000007f7600000| Untracked -| 375|0x00000007f7700000, 0x00000007f7700000, 0x00000007f7800000| 0%| F| |TAMS 0x00000007f7700000, 0x00000007f7700000| Untracked -| 376|0x00000007f7800000, 0x00000007f7800000, 0x00000007f7900000| 0%| F| |TAMS 0x00000007f7800000, 0x00000007f7800000| Untracked -| 377|0x00000007f7900000, 0x00000007f7900000, 0x00000007f7a00000| 0%| F| |TAMS 0x00000007f7900000, 0x00000007f7900000| Untracked -| 378|0x00000007f7a00000, 0x00000007f7a00000, 0x00000007f7b00000| 0%| F| |TAMS 0x00000007f7a00000, 0x00000007f7a00000| Untracked -| 379|0x00000007f7b00000, 0x00000007f7b00000, 0x00000007f7c00000| 0%| F| |TAMS 0x00000007f7b00000, 0x00000007f7b00000| Untracked -| 380|0x00000007f7c00000, 0x00000007f7c00000, 0x00000007f7d00000| 0%| F| |TAMS 0x00000007f7c00000, 0x00000007f7c00000| Untracked -| 381|0x00000007f7d00000, 0x00000007f7d00000, 0x00000007f7e00000| 0%| F| |TAMS 0x00000007f7d00000, 0x00000007f7d00000| Untracked -| 382|0x00000007f7e00000, 0x00000007f7e00000, 0x00000007f7f00000| 0%| F| |TAMS 0x00000007f7e00000, 0x00000007f7e00000| Untracked -| 383|0x00000007f7f00000, 0x00000007f7f00000, 0x00000007f8000000| 0%| F| |TAMS 0x00000007f7f00000, 0x00000007f7f00000| Untracked -| 384|0x00000007f8000000, 0x00000007f8000000, 0x00000007f8100000| 0%| F| |TAMS 0x00000007f8000000, 0x00000007f8000000| Untracked -| 385|0x00000007f8100000, 0x00000007f8100000, 0x00000007f8200000| 0%| F| |TAMS 0x00000007f8100000, 0x00000007f8100000| Untracked -| 386|0x00000007f8200000, 0x00000007f8200000, 0x00000007f8300000| 0%| F| |TAMS 0x00000007f8200000, 0x00000007f8200000| Untracked -| 387|0x00000007f8300000, 0x00000007f8300000, 0x00000007f8400000| 0%| F| |TAMS 0x00000007f8300000, 0x00000007f8300000| Untracked -| 388|0x00000007f8400000, 0x00000007f8400000, 0x00000007f8500000| 0%| F| |TAMS 0x00000007f8400000, 0x00000007f8400000| Untracked -| 389|0x00000007f8500000, 0x00000007f8500000, 0x00000007f8600000| 0%| F| |TAMS 0x00000007f8500000, 0x00000007f8500000| Untracked -| 390|0x00000007f8600000, 0x00000007f8600000, 0x00000007f8700000| 0%| F| |TAMS 0x00000007f8600000, 0x00000007f8600000| Untracked -| 391|0x00000007f8700000, 0x00000007f8700000, 0x00000007f8800000| 0%| F| |TAMS 0x00000007f8700000, 0x00000007f8700000| Untracked -| 392|0x00000007f8800000, 0x00000007f8800000, 0x00000007f8900000| 0%| F| |TAMS 0x00000007f8800000, 0x00000007f8800000| Untracked -| 393|0x00000007f8900000, 0x00000007f8900000, 0x00000007f8a00000| 0%| F| |TAMS 0x00000007f8900000, 0x00000007f8900000| Untracked -| 394|0x00000007f8a00000, 0x00000007f8a00000, 0x00000007f8b00000| 0%| F| |TAMS 0x00000007f8a00000, 0x00000007f8a00000| Untracked -| 395|0x00000007f8b00000, 0x00000007f8b00000, 0x00000007f8c00000| 0%| F| |TAMS 0x00000007f8b00000, 0x00000007f8b00000| Untracked -| 396|0x00000007f8c00000, 0x00000007f8c00000, 0x00000007f8d00000| 0%| F| |TAMS 0x00000007f8c00000, 0x00000007f8c00000| Untracked -| 397|0x00000007f8d00000, 0x00000007f8d00000, 0x00000007f8e00000| 0%| F| |TAMS 0x00000007f8d00000, 0x00000007f8d00000| Untracked -| 398|0x00000007f8e00000, 0x00000007f8e00000, 0x00000007f8f00000| 0%| F| |TAMS 0x00000007f8e00000, 0x00000007f8e00000| Untracked -| 399|0x00000007f8f00000, 0x00000007f8f00000, 0x00000007f9000000| 0%| F| |TAMS 0x00000007f8f00000, 0x00000007f8f00000| Untracked -| 400|0x00000007f9000000, 0x00000007f9000000, 0x00000007f9100000| 0%| F| |TAMS 0x00000007f9000000, 0x00000007f9000000| Untracked -| 401|0x00000007f9100000, 0x00000007f9100000, 0x00000007f9200000| 0%| F| |TAMS 0x00000007f9100000, 0x00000007f9100000| Untracked -| 402|0x00000007f9200000, 0x00000007f9200000, 0x00000007f9300000| 0%| F| |TAMS 0x00000007f9200000, 0x00000007f9200000| Untracked -| 403|0x00000007f9300000, 0x00000007f9300000, 0x00000007f9400000| 0%| F| |TAMS 0x00000007f9300000, 0x00000007f9300000| Untracked -| 404|0x00000007f9400000, 0x00000007f9400000, 0x00000007f9500000| 0%| F| |TAMS 0x00000007f9400000, 0x00000007f9400000| Untracked -| 405|0x00000007f9500000, 0x00000007f9500000, 0x00000007f9600000| 0%| F| |TAMS 0x00000007f9500000, 0x00000007f9500000| Untracked -| 406|0x00000007f9600000, 0x00000007f9600000, 0x00000007f9700000| 0%| F| |TAMS 0x00000007f9600000, 0x00000007f9600000| Untracked -| 407|0x00000007f9700000, 0x00000007f9700000, 0x00000007f9800000| 0%| F| |TAMS 0x00000007f9700000, 0x00000007f9700000| Untracked -| 408|0x00000007f9800000, 0x00000007f9800000, 0x00000007f9900000| 0%| F| |TAMS 0x00000007f9800000, 0x00000007f9800000| Untracked -| 409|0x00000007f9900000, 0x00000007f9900000, 0x00000007f9a00000| 0%| F| |TAMS 0x00000007f9900000, 0x00000007f9900000| Untracked -| 410|0x00000007f9a00000, 0x00000007f9a00000, 0x00000007f9b00000| 0%| F| |TAMS 0x00000007f9a00000, 0x00000007f9a00000| Untracked -| 411|0x00000007f9b00000, 0x00000007f9b00000, 0x00000007f9c00000| 0%| F| |TAMS 0x00000007f9b00000, 0x00000007f9b00000| Untracked -| 412|0x00000007f9c00000, 0x00000007f9c00000, 0x00000007f9d00000| 0%| F| |TAMS 0x00000007f9c00000, 0x00000007f9c00000| Untracked -| 413|0x00000007f9d00000, 0x00000007f9d00000, 0x00000007f9e00000| 0%| F| |TAMS 0x00000007f9d00000, 0x00000007f9d00000| Untracked -| 414|0x00000007f9e00000, 0x00000007f9e00000, 0x00000007f9f00000| 0%| F| |TAMS 0x00000007f9e00000, 0x00000007f9e00000| Untracked -| 415|0x00000007f9f00000, 0x00000007f9f00000, 0x00000007fa000000| 0%| F| |TAMS 0x00000007f9f00000, 0x00000007f9f00000| Untracked -| 416|0x00000007fa000000, 0x00000007fa000000, 0x00000007fa100000| 0%| F| |TAMS 0x00000007fa000000, 0x00000007fa000000| Untracked -| 417|0x00000007fa100000, 0x00000007fa100000, 0x00000007fa200000| 0%| F| |TAMS 0x00000007fa100000, 0x00000007fa100000| Untracked -| 418|0x00000007fa200000, 0x00000007fa200000, 0x00000007fa300000| 0%| F| |TAMS 0x00000007fa200000, 0x00000007fa200000| Untracked -| 419|0x00000007fa300000, 0x00000007fa300000, 0x00000007fa400000| 0%| F| |TAMS 0x00000007fa300000, 0x00000007fa300000| Untracked -| 420|0x00000007fa400000, 0x00000007fa400000, 0x00000007fa500000| 0%| F| |TAMS 0x00000007fa400000, 0x00000007fa400000| Untracked -| 421|0x00000007fa500000, 0x00000007fa500000, 0x00000007fa600000| 0%| F| |TAMS 0x00000007fa500000, 0x00000007fa500000| Untracked -| 422|0x00000007fa600000, 0x00000007fa600000, 0x00000007fa700000| 0%| F| |TAMS 0x00000007fa600000, 0x00000007fa600000| Untracked -| 423|0x00000007fa700000, 0x00000007fa700000, 0x00000007fa800000| 0%| F| |TAMS 0x00000007fa700000, 0x00000007fa700000| Untracked -| 424|0x00000007fa800000, 0x00000007fa800000, 0x00000007fa900000| 0%| F| |TAMS 0x00000007fa800000, 0x00000007fa800000| Untracked -| 425|0x00000007fa900000, 0x00000007fa900000, 0x00000007faa00000| 0%| F| |TAMS 0x00000007fa900000, 0x00000007fa900000| Untracked -| 426|0x00000007faa00000, 0x00000007faa00000, 0x00000007fab00000| 0%| F| |TAMS 0x00000007faa00000, 0x00000007faa00000| Untracked -| 427|0x00000007fab00000, 0x00000007fab00000, 0x00000007fac00000| 0%| F| |TAMS 0x00000007fab00000, 0x00000007fab00000| Untracked -| 428|0x00000007fac00000, 0x00000007fac00000, 0x00000007fad00000| 0%| F| |TAMS 0x00000007fac00000, 0x00000007fac00000| Untracked -| 429|0x00000007fad00000, 0x00000007fad00000, 0x00000007fae00000| 0%| F| |TAMS 0x00000007fad00000, 0x00000007fad00000| Untracked -| 430|0x00000007fae00000, 0x00000007fae00000, 0x00000007faf00000| 0%| F| |TAMS 0x00000007fae00000, 0x00000007fae00000| Untracked -| 431|0x00000007faf00000, 0x00000007faf00000, 0x00000007fb000000| 0%| F| |TAMS 0x00000007faf00000, 0x00000007faf00000| Untracked -| 432|0x00000007fb000000, 0x00000007fb000000, 0x00000007fb100000| 0%| F| |TAMS 0x00000007fb000000, 0x00000007fb000000| Untracked -| 433|0x00000007fb100000, 0x00000007fb100000, 0x00000007fb200000| 0%| F| |TAMS 0x00000007fb100000, 0x00000007fb100000| Untracked -| 434|0x00000007fb200000, 0x00000007fb200000, 0x00000007fb300000| 0%| F| |TAMS 0x00000007fb200000, 0x00000007fb200000| Untracked -| 435|0x00000007fb300000, 0x00000007fb300000, 0x00000007fb400000| 0%| F| |TAMS 0x00000007fb300000, 0x00000007fb300000| Untracked -| 436|0x00000007fb400000, 0x00000007fb400000, 0x00000007fb500000| 0%| F| |TAMS 0x00000007fb400000, 0x00000007fb400000| Untracked -| 437|0x00000007fb500000, 0x00000007fb500000, 0x00000007fb600000| 0%| F| |TAMS 0x00000007fb500000, 0x00000007fb500000| Untracked -| 438|0x00000007fb600000, 0x00000007fb600000, 0x00000007fb700000| 0%| F| |TAMS 0x00000007fb600000, 0x00000007fb600000| Untracked -| 439|0x00000007fb700000, 0x00000007fb700000, 0x00000007fb800000| 0%| F| |TAMS 0x00000007fb700000, 0x00000007fb700000| Untracked -| 440|0x00000007fb800000, 0x00000007fb800000, 0x00000007fb900000| 0%| F| |TAMS 0x00000007fb800000, 0x00000007fb800000| Untracked -| 441|0x00000007fb900000, 0x00000007fb900000, 0x00000007fba00000| 0%| F| |TAMS 0x00000007fb900000, 0x00000007fb900000| Untracked -| 442|0x00000007fba00000, 0x00000007fba00000, 0x00000007fbb00000| 0%| F| |TAMS 0x00000007fba00000, 0x00000007fba00000| Untracked -| 443|0x00000007fbb00000, 0x00000007fbb00000, 0x00000007fbc00000| 0%| F| |TAMS 0x00000007fbb00000, 0x00000007fbb00000| Untracked -| 444|0x00000007fbc00000, 0x00000007fbc00000, 0x00000007fbd00000| 0%| F| |TAMS 0x00000007fbc00000, 0x00000007fbc00000| Untracked -| 445|0x00000007fbd00000, 0x00000007fbd00000, 0x00000007fbe00000| 0%| F| |TAMS 0x00000007fbd00000, 0x00000007fbd00000| Untracked -| 446|0x00000007fbe00000, 0x00000007fbe00000, 0x00000007fbf00000| 0%| F| |TAMS 0x00000007fbe00000, 0x00000007fbe00000| Untracked -| 447|0x00000007fbf00000, 0x00000007fbf00000, 0x00000007fc000000| 0%| F| |TAMS 0x00000007fbf00000, 0x00000007fbf00000| Untracked -| 448|0x00000007fc000000, 0x00000007fc000000, 0x00000007fc100000| 0%| F| |TAMS 0x00000007fc000000, 0x00000007fc000000| Untracked -| 449|0x00000007fc100000, 0x00000007fc100000, 0x00000007fc200000| 0%| F| |TAMS 0x00000007fc100000, 0x00000007fc100000| Untracked -| 450|0x00000007fc200000, 0x00000007fc200000, 0x00000007fc300000| 0%| F| |TAMS 0x00000007fc200000, 0x00000007fc200000| Untracked -| 451|0x00000007fc300000, 0x00000007fc300000, 0x00000007fc400000| 0%| F| |TAMS 0x00000007fc300000, 0x00000007fc300000| Untracked -| 452|0x00000007fc400000, 0x00000007fc400000, 0x00000007fc500000| 0%| F| |TAMS 0x00000007fc400000, 0x00000007fc400000| Untracked -| 453|0x00000007fc500000, 0x00000007fc500000, 0x00000007fc600000| 0%| F| |TAMS 0x00000007fc500000, 0x00000007fc500000| Untracked -| 454|0x00000007fc600000, 0x00000007fc600000, 0x00000007fc700000| 0%| F| |TAMS 0x00000007fc600000, 0x00000007fc600000| Untracked -| 455|0x00000007fc700000, 0x00000007fc700000, 0x00000007fc800000| 0%| F| |TAMS 0x00000007fc700000, 0x00000007fc700000| Untracked -| 456|0x00000007fc800000, 0x00000007fc800000, 0x00000007fc900000| 0%| F| |TAMS 0x00000007fc800000, 0x00000007fc800000| Untracked -| 457|0x00000007fc900000, 0x00000007fc900000, 0x00000007fca00000| 0%| F| |TAMS 0x00000007fc900000, 0x00000007fc900000| Untracked -| 458|0x00000007fca00000, 0x00000007fca00000, 0x00000007fcb00000| 0%| F| |TAMS 0x00000007fca00000, 0x00000007fca00000| Untracked -| 459|0x00000007fcb00000, 0x00000007fcb00000, 0x00000007fcc00000| 0%| F| |TAMS 0x00000007fcb00000, 0x00000007fcb00000| Untracked -| 460|0x00000007fcc00000, 0x00000007fcc00000, 0x00000007fcd00000| 0%| F| |TAMS 0x00000007fcc00000, 0x00000007fcc00000| Untracked -| 461|0x00000007fcd00000, 0x00000007fcd00000, 0x00000007fce00000| 0%| F| |TAMS 0x00000007fcd00000, 0x00000007fcd00000| Untracked -| 462|0x00000007fce00000, 0x00000007fce00000, 0x00000007fcf00000| 0%| F| |TAMS 0x00000007fce00000, 0x00000007fce00000| Untracked -| 463|0x00000007fcf00000, 0x00000007fcf00000, 0x00000007fd000000| 0%| F| |TAMS 0x00000007fcf00000, 0x00000007fcf00000| Untracked -| 464|0x00000007fd000000, 0x00000007fd000000, 0x00000007fd100000| 0%| F| |TAMS 0x00000007fd000000, 0x00000007fd000000| Untracked -| 465|0x00000007fd100000, 0x00000007fd100000, 0x00000007fd200000| 0%| F| |TAMS 0x00000007fd100000, 0x00000007fd100000| Untracked -| 466|0x00000007fd200000, 0x00000007fd200000, 0x00000007fd300000| 0%| F| |TAMS 0x00000007fd200000, 0x00000007fd200000| Untracked -| 467|0x00000007fd300000, 0x00000007fd300000, 0x00000007fd400000| 0%| F| |TAMS 0x00000007fd300000, 0x00000007fd300000| Untracked -| 468|0x00000007fd400000, 0x00000007fd400000, 0x00000007fd500000| 0%| F| |TAMS 0x00000007fd400000, 0x00000007fd400000| Untracked -| 469|0x00000007fd500000, 0x00000007fd500000, 0x00000007fd600000| 0%| F| |TAMS 0x00000007fd500000, 0x00000007fd500000| Untracked -| 470|0x00000007fd600000, 0x00000007fd600000, 0x00000007fd700000| 0%| F| |TAMS 0x00000007fd600000, 0x00000007fd600000| Untracked -| 471|0x00000007fd700000, 0x00000007fd700000, 0x00000007fd800000| 0%| F| |TAMS 0x00000007fd700000, 0x00000007fd700000| Untracked -| 472|0x00000007fd800000, 0x00000007fd800000, 0x00000007fd900000| 0%| F| |TAMS 0x00000007fd800000, 0x00000007fd800000| Untracked -| 473|0x00000007fd900000, 0x00000007fd900000, 0x00000007fda00000| 0%| F| |TAMS 0x00000007fd900000, 0x00000007fd900000| Untracked -| 474|0x00000007fda00000, 0x00000007fda00000, 0x00000007fdb00000| 0%| F| |TAMS 0x00000007fda00000, 0x00000007fda00000| Untracked -| 475|0x00000007fdb00000, 0x00000007fdb00000, 0x00000007fdc00000| 0%| F| |TAMS 0x00000007fdb00000, 0x00000007fdb00000| Untracked -| 476|0x00000007fdc00000, 0x00000007fdc00000, 0x00000007fdd00000| 0%| F| |TAMS 0x00000007fdc00000, 0x00000007fdc00000| Untracked -| 477|0x00000007fdd00000, 0x00000007fde00000, 0x00000007fde00000|100%| E| |TAMS 0x00000007fdd00000, 0x00000007fdd00000| Complete -| 478|0x00000007fde00000, 0x00000007fdf00000, 0x00000007fdf00000|100%| E|CS|TAMS 0x00000007fde00000, 0x00000007fde00000| Complete -| 479|0x00000007fdf00000, 0x00000007fe000000, 0x00000007fe000000|100%| E|CS|TAMS 0x00000007fdf00000, 0x00000007fdf00000| Complete -| 480|0x00000007fe000000, 0x00000007fe100000, 0x00000007fe100000|100%| E|CS|TAMS 0x00000007fe000000, 0x00000007fe000000| Complete -| 481|0x00000007fe100000, 0x00000007fe200000, 0x00000007fe200000|100%| S|CS|TAMS 0x00000007fe100000, 0x00000007fe100000| Complete -| 482|0x00000007fe200000, 0x00000007fe300000, 0x00000007fe300000|100%| S|CS|TAMS 0x00000007fe200000, 0x00000007fe200000| Complete -| 483|0x00000007fe300000, 0x00000007fe400000, 0x00000007fe400000|100%| S|CS|TAMS 0x00000007fe300000, 0x00000007fe300000| Complete -| 484|0x00000007fe400000, 0x00000007fe500000, 0x00000007fe500000|100%| S|CS|TAMS 0x00000007fe400000, 0x00000007fe400000| Complete -| 485|0x00000007fe500000, 0x00000007fe600000, 0x00000007fe600000|100%| E|CS|TAMS 0x00000007fe500000, 0x00000007fe500000| Complete -| 486|0x00000007fe600000, 0x00000007fe700000, 0x00000007fe700000|100%| E|CS|TAMS 0x00000007fe600000, 0x00000007fe600000| Complete -| 487|0x00000007fe700000, 0x00000007fe800000, 0x00000007fe800000|100%| E|CS|TAMS 0x00000007fe700000, 0x00000007fe700000| Complete -| 488|0x00000007fe800000, 0x00000007fe900000, 0x00000007fe900000|100%| E|CS|TAMS 0x00000007fe800000, 0x00000007fe800000| Complete -| 489|0x00000007fe900000, 0x00000007fea00000, 0x00000007fea00000|100%| E|CS|TAMS 0x00000007fe900000, 0x00000007fe900000| Complete -| 490|0x00000007fea00000, 0x00000007feb00000, 0x00000007feb00000|100%| E|CS|TAMS 0x00000007fea00000, 0x00000007fea00000| Complete -| 491|0x00000007feb00000, 0x00000007fec00000, 0x00000007fec00000|100%| E|CS|TAMS 0x00000007feb00000, 0x00000007feb00000| Complete -| 492|0x00000007fec00000, 0x00000007fed00000, 0x00000007fed00000|100%| E|CS|TAMS 0x00000007fec00000, 0x00000007fec00000| Complete -| 493|0x00000007fed00000, 0x00000007fee00000, 0x00000007fee00000|100%| E|CS|TAMS 0x00000007fed00000, 0x00000007fed00000| Complete -| 494|0x00000007fee00000, 0x00000007fef00000, 0x00000007fef00000|100%| E|CS|TAMS 0x00000007fee00000, 0x00000007fee00000| Complete -| 495|0x00000007fef00000, 0x00000007ff000000, 0x00000007ff000000|100%| E|CS|TAMS 0x00000007fef00000, 0x00000007fef00000| Complete -| 496|0x00000007ff000000, 0x00000007ff100000, 0x00000007ff100000|100%| E|CS|TAMS 0x00000007ff000000, 0x00000007ff000000| Complete -| 497|0x00000007ff100000, 0x00000007ff200000, 0x00000007ff200000|100%| E|CS|TAMS 0x00000007ff100000, 0x00000007ff100000| Complete -| 498|0x00000007ff200000, 0x00000007ff300000, 0x00000007ff300000|100%| E|CS|TAMS 0x00000007ff200000, 0x00000007ff200000| Complete -| 499|0x00000007ff300000, 0x00000007ff400000, 0x00000007ff400000|100%| E|CS|TAMS 0x00000007ff300000, 0x00000007ff300000| Complete -| 500|0x00000007ff400000, 0x00000007ff500000, 0x00000007ff500000|100%| E|CS|TAMS 0x00000007ff400000, 0x00000007ff400000| Complete -| 501|0x00000007ff500000, 0x00000007ff600000, 0x00000007ff600000|100%| E|CS|TAMS 0x00000007ff500000, 0x00000007ff500000| Complete -| 502|0x00000007ff600000, 0x00000007ff700000, 0x00000007ff700000|100%| E|CS|TAMS 0x00000007ff600000, 0x00000007ff600000| Complete -| 503|0x00000007ff700000, 0x00000007ff800000, 0x00000007ff800000|100%| E|CS|TAMS 0x00000007ff700000, 0x00000007ff700000| Complete -| 504|0x00000007ff800000, 0x00000007ff900000, 0x00000007ff900000|100%| E|CS|TAMS 0x00000007ff800000, 0x00000007ff800000| Complete -| 505|0x00000007ff900000, 0x00000007ffa00000, 0x00000007ffa00000|100%| E|CS|TAMS 0x00000007ff900000, 0x00000007ff900000| Complete -| 506|0x00000007ffa00000, 0x00000007ffb00000, 0x00000007ffb00000|100%| E|CS|TAMS 0x00000007ffa00000, 0x00000007ffa00000| Complete -| 507|0x00000007ffb00000, 0x00000007ffc00000, 0x00000007ffc00000|100%| E|CS|TAMS 0x00000007ffb00000, 0x00000007ffb00000| Complete -| 508|0x00000007ffc00000, 0x00000007ffd00000, 0x00000007ffd00000|100%| E|CS|TAMS 0x00000007ffc00000, 0x00000007ffc00000| Complete -| 509|0x00000007ffd00000, 0x00000007ffe00000, 0x00000007ffe00000|100%| E|CS|TAMS 0x00000007ffd00000, 0x00000007ffd00000| Complete -| 510|0x00000007ffe00000, 0x00000007ffe78000, 0x00000007fff00000| 46%|OA| |TAMS 0x00000007ffe00000, 0x00000007ffe00000| Untracked -| 511|0x00000007fff00000, 0x00000007fff80000, 0x0000000800000000| 50%|CA| |TAMS 0x00000007fff00000, 0x00000007fff00000| Untracked - -Card table byte_map: [0x0000000104b34000,0x0000000104c34000] _byte_map_base: 0x0000000100c34000 - -Marking Bits (Prev, Next): (CMBitMap*) 0x000000013681c810, (CMBitMap*) 0x000000013681c850 - Prev Bits: [0x0000000104d34000, 0x0000000105534000) - Next Bits: [0x000000011d5c0000, 0x000000011ddc0000) - -Polling page: 0x000000010463c000 - -Metaspace: - -Usage: - Non-class: 11.34 MB used. - Class: 2.10 MB used. - Both: 13.45 MB used. - -Virtual space: - Non-class space: 16.00 MB reserved, 11.44 MB ( 71%) committed, 2 nodes. - Class space: 1.00 GB reserved, 2.25 MB ( <1%) committed, 1 nodes. - Both: 1.02 GB reserved, 13.69 MB ( 1%) committed. - -Chunk freelists: - Non-Class: 400.00 KB - Class: 1.72 MB - Both: 2.11 MB - -MaxMetaspaceSize: unlimited -CompressedClassSpaceSize: 1.00 GB -Initial GC threshold: 21.00 MB -Current GC threshold: 21.00 MB -CDS: on -MetaspaceReclaimPolicy: balanced - - commit_granule_bytes: 65536. - - commit_granule_words: 8192. - - virtual_space_node_default_size: 1048576. - - enlarge_chunks_in_place: 1. - - new_chunks_are_fully_committed: 0. - - uncommit_free_chunks: 1. - - use_allocation_guard: 0. - - handle_deallocations: 1. - - -Internal statistics: - -num_allocs_failed_limit: 0. -num_arena_births: 190. -num_arena_deaths: 0. -num_vsnodes_births: 3. -num_vsnodes_deaths: 0. -num_space_committed: 219. -num_space_uncommitted: 0. -num_chunks_returned_to_freelist: 0. -num_chunks_taken_from_freelist: 660. -num_chunk_merges: 0. -num_chunk_splits: 425. -num_chunks_enlarged: 309. -num_purges: 0. -num_inconsistent_stats: 0. - -CodeHeap 'non-profiled nmethods': size=120032Kb used=701Kb max_used=701Kb free=119331Kb - bounds [0x0000000116088000, 0x00000001162f8000, 0x000000011d5c0000] -CodeHeap 'profiled nmethods': size=120016Kb used=3675Kb max_used=3675Kb free=116340Kb - bounds [0x000000010eb54000, 0x000000010eef4000, 0x0000000116088000] -CodeHeap 'non-nmethods': size=5712Kb used=1167Kb max_used=1232Kb free=4545Kb - bounds [0x000000010e5c0000, 0x000000010e830000, 0x000000010eb54000] - total_blobs=2254 nmethods=1785 adapters=384 - compilation: enabled - stopped_count=0, restarted_count=0 - full_count=0 - -Compilation events (20 events): -Event: 0.520 Thread 0x000000012481cc00 nmethod 1819 0x000000010eee7c90 code [0x000000010eee7e40, 0x000000010eee7fd8] -Event: 0.524 Thread 0x000000012080ae00 nmethod 1706 0x000000011612ff10 code [0x0000000116130600, 0x0000000116133f50] -Event: 0.525 Thread 0x000000012080ae00 1820 4 java.util.Arrays::copyOf (19 bytes) -Event: 0.526 Thread 0x000000012080ae00 nmethod 1820 0x0000000116136010 code [0x00000001161361c0, 0x0000000116136410] -Event: 0.528 Thread 0x000000012481cc00 1823 3 jdk.internal.misc.VM::isModuleSystemInited (13 bytes) -Event: 0.528 Thread 0x000000012481cc00 nmethod 1823 0x000000010eee8090 code [0x000000010eee8240, 0x000000010eee8428] -Event: 0.528 Thread 0x000000012481cc00 1822 3 java.util.Collections$UnmodifiableCollection$1::hasNext (10 bytes) -Event: 0.528 Thread 0x000000012481cc00 nmethod 1822 0x000000010eee8510 code [0x000000010eee86c0, 0x000000010eee8918] -Event: 0.528 Thread 0x000000012481cc00 1824 3 java.lang.ModuleLayer::boot (4 bytes) -Event: 0.528 Thread 0x000000012481cc00 nmethod 1824 0x000000010eee8a10 code [0x000000010eee8bc0, 0x000000010eee8ce8] -Event: 0.528 Thread 0x000000012080ae00 1825 4 sun.net.www.ParseUtil::firstEncodeIndex (86 bytes) -Event: 0.530 Thread 0x000000012080ae00 nmethod 1825 0x0000000116136510 code [0x00000001161366c0, 0x0000000116136950] -Event: 0.530 Thread 0x000000012481cc00 1826 3 java.lang.StackTraceElement:: (10 bytes) -Event: 0.530 Thread 0x000000012481cc00 nmethod 1826 0x000000010eee8d90 code [0x000000010eee8f40, 0x000000010eee90e8] -Event: 0.530 Thread 0x000000012481cc00 1827 s! 3 java.lang.StackTraceElement::computeFormat (71 bytes) -Event: 0.530 Thread 0x000000012481cc00 nmethod 1827 0x000000010eee9190 code [0x000000010eee9400, 0x000000010eee9d88] -Event: 0.530 Thread 0x000000012481cc00 1828 3 java.lang.StackTraceElement::isHashedInJavaBase (31 bytes) -Event: 0.530 Thread 0x000000012481cc00 nmethod 1828 0x000000010eeea090 code [0x000000010eeea2c0, 0x000000010eeea848] -Event: 0.531 Thread 0x000000012481cc00 1829 3 java.util.AbstractCollection::isEmpty (13 bytes) -Event: 0.531 Thread 0x000000012481cc00 nmethod 1829 0x000000010eeeaa10 code [0x000000010eeeabc0, 0x000000010eeeae18] - -GC Heap History (2 events): -Event: 0.323 GC heap before -{Heap before GC invocations=0 (full 0): - garbage-first heap total 524288K, used 26592K [0x00000007e0000000, 0x0000000800000000) - region size 1024K, 25 young (25600K), 0 survivors (0K) - Metaspace used 7348K, committed 7616K, reserved 1056768K - class space used 1042K, committed 1152K, reserved 1048576K -} -Event: 0.325 GC heap after -{Heap after GC invocations=1 (full 0): - garbage-first heap total 524288K, used 5602K [0x00000007e0000000, 0x0000000800000000) - region size 1024K, 4 young (4096K), 4 survivors (4096K) - Metaspace used 7348K, committed 7616K, reserved 1056768K - class space used 1042K, committed 1152K, reserved 1048576K -} - -Deoptimization events (20 events): -Event: 0.480 Thread 0x000000013580a200 DEOPT PACKING pc=0x00000001160f883c sp=0x000000016ba5de70 -Event: 0.480 Thread 0x000000013580a200 DEOPT UNPACKING pc=0x000000010e5fed1c sp=0x000000016ba5ddb0 mode 2 -Event: 0.481 Thread 0x000000013580a200 Uncommon trap: trap_request=0xffffff45 fr.pc=0x000000011611d930 relative=0x0000000000000f30 -Event: 0.481 Thread 0x000000013580a200 Uncommon trap: reason=unstable_if action=reinterpret pc=0x000000011611d930 method=sun.net.www.ParseUtil.firstEncodeIndex(Ljava/lang/String;)I @ 51 c2 -Event: 0.481 Thread 0x000000013580a200 DEOPT PACKING pc=0x000000011611d930 sp=0x000000016ba61050 -Event: 0.481 Thread 0x000000013580a200 DEOPT UNPACKING pc=0x000000010e5fed1c sp=0x000000016ba60ea0 mode 2 -Event: 0.481 Thread 0x000000013580a200 Uncommon trap: trap_request=0xffffff45 fr.pc=0x00000001160e0810 relative=0x00000000000000d0 -Event: 0.481 Thread 0x000000013580a200 Uncommon trap: reason=unstable_if action=reinterpret pc=0x00000001160e0810 method=sun.net.www.ParseUtil.firstEncodeIndex(Ljava/lang/String;)I @ 51 c2 -Event: 0.481 Thread 0x000000013580a200 DEOPT PACKING pc=0x00000001160e0810 sp=0x000000016ba60ec0 -Event: 0.481 Thread 0x000000013580a200 DEOPT UNPACKING pc=0x000000010e5fed1c sp=0x000000016ba60e40 mode 2 -Event: 0.491 Thread 0x000000013580a200 DEOPT PACKING pc=0x000000010eeb8f84 sp=0x000000016ba60f10 -Event: 0.491 Thread 0x000000013580a200 DEOPT UNPACKING pc=0x000000010e5feb7c sp=0x000000016ba60c30 mode 0 -Event: 0.500 Thread 0x000000013580a200 DEOPT PACKING pc=0x000000010eeb8f84 sp=0x000000016ba60ca0 -Event: 0.500 Thread 0x000000013580a200 DEOPT UNPACKING pc=0x000000010e5feb7c sp=0x000000016ba609c0 mode 0 -Event: 0.506 Thread 0x000000013580a200 DEOPT PACKING pc=0x000000010eeb8f84 sp=0x000000016ba60c90 -Event: 0.506 Thread 0x000000013580a200 DEOPT UNPACKING pc=0x000000010e5feb7c sp=0x000000016ba609b0 mode 0 -Event: 0.519 Thread 0x000000013580a200 DEOPT PACKING pc=0x000000010eeb8f84 sp=0x000000016ba61bd0 -Event: 0.519 Thread 0x000000013580a200 DEOPT UNPACKING pc=0x000000010e5feb7c sp=0x000000016ba618f0 mode 0 -Event: 0.528 Thread 0x000000013580a200 DEOPT PACKING pc=0x000000010eeb8f84 sp=0x000000016ba5eaa0 -Event: 0.528 Thread 0x000000013580a200 DEOPT UNPACKING pc=0x000000010e5feb7c sp=0x000000016ba5e7c0 mode 0 - -Classes unloaded (0 events): -No events - -Classes redefined (0 events): -No events - -Internal exceptions (20 events): -Event: 0.286 Thread 0x000000013580a200 Exception
(0x00000007fe846568) -thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] -Event: 0.289 Thread 0x000000013580a200 Exception (0x00000007fe899f88) -thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] -Event: 0.289 Thread 0x000000013580a200 Exception (0x00000007fe89db58) -thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 833] -Event: 0.290 Thread 0x000000013580a200 Exception (0x00000007fe8b4f40) -thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] -Event: 0.292 Thread 0x000000013580a200 Exception (0x00000007fe71a0b8) -thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] -Event: 0.292 Thread 0x000000013580a200 Exception (0x00000007fe71da38) -thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] -Event: 0.293 Thread 0x000000013580a200 Exception (0x00000007fe72d1f0) -thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] -Event: 0.301 Thread 0x000000013580a200 Exception (0x00000007fe631380) -thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] -Event: 0.303 Thread 0x000000013580a200 Exception (0x00000007fe66cc58) -thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] -Event: 0.316 Thread 0x000000013580a200 Exception (0x00000007fe542858) -thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] -Event: 0.318 Thread 0x000000013580a200 Exception (0x00000007fe57af18) -thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] -Event: 0.318 Thread 0x000000013580a200 Exception (0x00000007fe57fad0) -thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] -Event: 0.319 Thread 0x000000013580a200 Exception (0x00000007fe58b530) -thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] -Event: 0.319 Thread 0x000000013580a200 Exception (0x00000007fe58f328) -thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 833] -Event: 0.322 Thread 0x000000013580a200 Exception (0x00000007fe5e46b8) -thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 833] -Event: 0.431 Thread 0x000000013580a200 Exception (0x00000007fee7a410) -thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] -Event: 0.432 Thread 0x000000013580a200 Exception (0x00000007fee84300) -thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 833] -Event: 0.432 Thread 0x000000013580a200 Exception (0x00000007fee87a70) -thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] -Event: 0.432 Thread 0x000000013580a200 Exception (0x00000007fee8dea8) -thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 766] -Event: 0.452 Thread 0x000000013580a200 Exception (0x00000007feb660a8) -thrown [src/hotspot/share/classfile/systemDictionary.cpp, line 256] - -VM Operations (20 events): -Event: 0.185 Executing VM operation: ICBufferFull -Event: 0.185 Executing VM operation: ICBufferFull done -Event: 0.215 Executing VM operation: HandshakeAllThreads -Event: 0.215 Executing VM operation: HandshakeAllThreads done -Event: 0.226 Executing VM operation: HandshakeAllThreads -Event: 0.226 Executing VM operation: HandshakeAllThreads done -Event: 0.237 Executing VM operation: HandshakeAllThreads -Event: 0.237 Executing VM operation: HandshakeAllThreads done -Event: 0.300 Executing VM operation: ICBufferFull -Event: 0.301 Executing VM operation: ICBufferFull done -Event: 0.320 Executing VM operation: HandshakeAllThreads -Event: 0.320 Executing VM operation: HandshakeAllThreads done -Event: 0.323 Executing VM operation: G1CollectForAllocation -Event: 0.325 Executing VM operation: G1CollectForAllocation done -Event: 0.403 Executing VM operation: ICBufferFull -Event: 0.403 Executing VM operation: ICBufferFull done -Event: 0.462 Executing VM operation: ICBufferFull -Event: 0.462 Executing VM operation: ICBufferFull done -Event: 0.512 Executing VM operation: ICBufferFull -Event: 0.512 Executing VM operation: ICBufferFull done - -Events (20 events): -Event: 0.522 loading class java/util/concurrent/CompletableFuture$AltResult done -Event: 0.522 loading class java/util/concurrent/CompletableFuture$Completion -Event: 0.522 loading class java/util/concurrent/CompletableFuture$AsynchronousCompletionTask -Event: 0.522 loading class java/util/concurrent/CompletableFuture$AsynchronousCompletionTask done -Event: 0.522 loading class java/util/concurrent/CompletableFuture$Completion done -Event: 0.527 loading class sun/misc/SharedSecrets -Event: 0.527 loading class sun/misc/SharedSecrets done -Event: 0.528 loading class java/lang/StackTraceElement$HashedModules -Event: 0.528 loading class java/lang/StackTraceElement$HashedModules done -Event: 0.538 loading class java/util/concurrent/CompletableFuture$UniApply -Event: 0.538 loading class java/util/concurrent/CompletableFuture$UniCompletion -Event: 0.538 loading class java/util/concurrent/CompletableFuture$UniCompletion done -Event: 0.538 loading class java/util/concurrent/CompletableFuture$UniApply done -Event: 0.538 Thread 0x00000001369a0400 Thread added: 0x00000001369a0400 -Event: 0.538 Protecting memory [0x000000016f8f0000,0x000000016f8fc000] with protection modes 0 -Event: 0.539 Loading shared library /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libglide_rs.dylib failed, dlopen(/Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libglide_rs.dylib, 0x0001): tried: -Event: 0.539 Loading shared library /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libglide_rs.jnilib failed, dlopen(/Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libglide_rs.jnilib, 0x0001): tried -Event: 0.539 loading class java/util/concurrent/CompletableFuture$Signaller -Event: 0.539 loading class java/util/concurrent/CompletableFuture$Signaller done -Event: 0.541 Loaded shared library /Users/andrewc/git/bq/babushka/java/target/release/libglide_rs.dylib - - -Dynamic libraries: -0x0000000104aa4000 /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libjli.dylib -0x0000000195f50000 /usr/lib/libz.1.dylib -0x000000019600d000 /usr/lib/libSystem.B.dylib -0x0000000196007000 /usr/lib/system/libcache.dylib -0x0000000195fc2000 /usr/lib/system/libcommonCrypto.dylib -0x0000000195fee000 /usr/lib/system/libcompiler_rt.dylib -0x0000000195fe4000 /usr/lib/system/libcopyfile.dylib -0x00000001894f3000 /usr/lib/system/libcorecrypto.dylib -0x00000001895c9000 /usr/lib/system/libdispatch.dylib -0x0000000189784000 /usr/lib/system/libdyld.dylib -0x0000000195ffd000 /usr/lib/system/libkeymgr.dylib -0x0000000195f9a000 /usr/lib/system/libmacho.dylib -0x0000000195533000 /usr/lib/system/libquarantine.dylib -0x0000000195ffa000 /usr/lib/system/libremovefile.dylib -0x000000018ee4e000 /usr/lib/system/libsystem_asl.dylib -0x000000018948c000 /usr/lib/system/libsystem_blocks.dylib -0x0000000189613000 /usr/lib/system/libsystem_c.dylib -0x0000000195ff2000 /usr/lib/system/libsystem_collections.dylib -0x000000019480e000 /usr/lib/system/libsystem_configuration.dylib -0x000000019388e000 /usr/lib/system/libsystem_containermanager.dylib -0x0000000195c39000 /usr/lib/system/libsystem_coreservices.dylib -0x000000018cb22000 /usr/lib/system/libsystem_darwin.dylib -0x000000022aafa000 /usr/lib/system/libsystem_darwindirectory.dylib -0x0000000195ffe000 /usr/lib/system/libsystem_dnssd.dylib -0x0000000189610000 /usr/lib/system/libsystem_featureflags.dylib -0x00000001897b1000 /usr/lib/system/libsystem_info.dylib -0x0000000195f5f000 /usr/lib/system/libsystem_m.dylib -0x0000000189592000 /usr/lib/system/libsystem_malloc.dylib -0x000000018edbe000 /usr/lib/system/libsystem_networkextension.dylib -0x000000018cf95000 /usr/lib/system/libsystem_notify.dylib -0x0000000194813000 /usr/lib/system/libsystem_sandbox.dylib -0x0000000195ff7000 /usr/lib/system/libsystem_secinit.dylib -0x000000018973c000 /usr/lib/system/libsystem_kernel.dylib -0x00000001897aa000 /usr/lib/system/libsystem_platform.dylib -0x0000000189777000 /usr/lib/system/libsystem_pthread.dylib -0x0000000190823000 /usr/lib/system/libsystem_symptoms.dylib -0x00000001894d8000 /usr/lib/system/libsystem_trace.dylib -0x0000000195fd0000 /usr/lib/system/libunwind.dylib -0x0000000189491000 /usr/lib/system/libxpc.dylib -0x0000000189720000 /usr/lib/libc++abi.dylib -0x00000001893a8000 /usr/lib/libobjc.A.dylib -0x0000000195fdc000 /usr/lib/liboah.dylib -0x0000000189692000 /usr/lib/libc++.1.dylib -0x00000001a3479000 /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa -0x000000018cffd000 /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit -0x0000000190031000 /System/Library/Frameworks/CoreData.framework/Versions/A/CoreData -0x000000018a909000 /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation -0x000000018e318000 /System/Library/PrivateFrameworks/UIFoundation.framework/Versions/A/UIFoundation -0x000000020020e000 /System/Library/PrivateFrameworks/CollectionViewCore.framework/Versions/A/CollectionViewCore -0x000000019d1b1000 /System/Library/PrivateFrameworks/RemoteViewServices.framework/Versions/A/RemoteViewServices -0x00000001940b0000 /System/Library/PrivateFrameworks/XCTTargetBootstrap.framework/Versions/A/XCTTargetBootstrap -0x00000001985f6000 /System/Library/PrivateFrameworks/InternationalSupport.framework/Versions/A/InternationalSupport -0x000000019867e000 /System/Library/PrivateFrameworks/UserActivity.framework/Versions/A/UserActivity -0x00000002224d6000 /System/Library/PrivateFrameworks/WindowManagement.framework/Versions/A/WindowManagement -0x000000018a593000 /System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration -0x0000000197a98000 /usr/lib/libspindump.dylib -0x000000018e4cd000 /System/Library/Frameworks/UniformTypeIdentifiers.framework/Versions/A/UniformTypeIdentifiers -0x0000000192007000 /usr/lib/libapp_launch_measurement.dylib -0x0000000191419000 /System/Library/PrivateFrameworks/CoreAnalytics.framework/Versions/A/CoreAnalytics -0x000000019200e000 /System/Library/PrivateFrameworks/CoreAutoLayout.framework/Versions/A/CoreAutoLayout -0x00000001938da000 /System/Library/Frameworks/Metal.framework/Versions/A/Metal -0x0000000194820000 /usr/lib/liblangid.dylib -0x00000001940b6000 /System/Library/PrivateFrameworks/CoreSVG.framework/Versions/A/CoreSVG -0x000000018ee87000 /System/Library/PrivateFrameworks/SkyLight.framework/Versions/A/SkyLight -0x000000018f31d000 /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics -0x000000019d8f9000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate -0x00000001978f6000 /System/Library/PrivateFrameworks/IconServices.framework/Versions/A/IconServices -0x00000001938b8000 /System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface -0x0000000191448000 /usr/lib/libDiagnosticMessagesClient.dylib -0x00000001a0fe7000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices -0x0000000194098000 /System/Library/PrivateFrameworks/DFRFoundation.framework/Versions/A/DFRFoundation -0x000000018c869000 /usr/lib/libicucore.A.dylib -0x000000019965b000 /System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox -0x0000000198603000 /System/Library/PrivateFrameworks/DataDetectorsCore.framework/Versions/A/DataDetectorsCore -0x00000001b1851000 /System/Library/PrivateFrameworks/TextInput.framework/Versions/A/TextInput -0x000000018edda000 /usr/lib/libMobileGestalt.dylib -0x0000000193dd8000 /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/HIToolbox -0x000000019191a000 /System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore -0x000000018c4a7000 /System/Library/Frameworks/Security.framework/Versions/A/Security -0x000000019d1f1000 /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/SpeechRecognition.framework/Versions/A/SpeechRecognition -0x0000000191d35000 /System/Library/PrivateFrameworks/CoreUI.framework/Versions/A/CoreUI -0x000000018bdb4000 /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio -0x000000019152c000 /System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration -0x0000000197eee000 /System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/A/MultitouchSupport -0x000000018edd8000 /usr/lib/libenergytrace.dylib -0x00000001a744d000 /System/Library/PrivateFrameworks/RenderBox.framework/Versions/A/RenderBox -0x000000018ceb3000 /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit -0x000000019d5f5000 /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices -0x0000000191f93000 /System/Library/PrivateFrameworks/PerformanceAnalysis.framework/Versions/A/PerformanceAnalysis -0x00000001f1e60000 /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL -0x0000000192058000 /usr/lib/libxml2.2.dylib -0x000000019544d000 /System/Library/PrivateFrameworks/MobileKeyBag.framework/Versions/A/MobileKeyBag -0x000000019d572000 /System/Library/Frameworks/Accessibility.framework/Versions/A/Accessibility -0x000000018f9fa000 /System/Library/Frameworks/ColorSync.framework/Versions/A/ColorSync -0x00000001897de000 /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation -0x000000019440b000 /System/Library/Frameworks/CoreImage.framework/Versions/A/CoreImage -0x000000018bbbf000 /System/Library/Frameworks/CoreText.framework/Versions/A/CoreText -0x00000001f6662000 /System/Library/Frameworks/CoreTransferable.framework/Versions/A/CoreTransferable -0x00000001f6b44000 /System/Library/Frameworks/DeveloperToolsSupport.framework/Versions/A/DeveloperToolsSupport -0x00000001940f1000 /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO -0x00000001faa91000 /System/Library/Frameworks/Symbols.framework/Versions/A/Symbols -0x0000000196013000 /System/Library/PrivateFrameworks/SoftLinking.framework/Versions/A/SoftLinking -0x000000019902d000 /usr/lib/swift/libswiftCore.dylib -0x00000001ae582000 /usr/lib/swift/libswiftCoreFoundation.dylib -0x00000001ac213000 /usr/lib/swift/libswiftCoreGraphics.dylib -0x00000001ae5ce000 /usr/lib/swift/libswiftCoreImage.dylib -0x00000001ac21a000 /usr/lib/swift/libswiftDarwin.dylib -0x000000019ec68000 /usr/lib/swift/libswiftDispatch.dylib -0x00000001ae5cf000 /usr/lib/swift/libswiftIOKit.dylib -0x00000001b9f8b000 /usr/lib/swift/libswiftMetal.dylib -0x00000001c690d000 /usr/lib/swift/libswiftOSLog.dylib -0x00000001a1453000 /usr/lib/swift/libswiftObjectiveC.dylib -0x00000001bdbab000 /usr/lib/swift/libswiftQuartzCore.dylib -0x00000001c1bfe000 /usr/lib/swift/libswiftUniformTypeIdentifiers.dylib -0x00000001ae598000 /usr/lib/swift/libswiftXPC.dylib -0x000000022a7ce000 /usr/lib/swift/libswift_Concurrency.dylib -0x00000001a1457000 /usr/lib/swift/libswiftos.dylib -0x00000001b17b5000 /usr/lib/swift/libswiftsimd.dylib -0x00000001961c0000 /usr/lib/libcompression.dylib -0x0000000198550000 /System/Library/PrivateFrameworks/TextureIO.framework/Versions/A/TextureIO -0x00000001975a9000 /usr/lib/libate.dylib -0x000000019745c000 /usr/lib/liblzma.5.dylib -0x000000019600f000 /usr/lib/libfakelink.dylib -0x000000018e9ea000 /System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork -0x0000000196063000 /usr/lib/libarchive.2.dylib -0x000000019b4dc000 /System/Library/Frameworks/Combine.framework/Versions/A/Combine -0x0000000200222000 /System/Library/PrivateFrameworks/CollectionsInternal.framework/Versions/A/CollectionsInternal -0x000000021596a000 /System/Library/PrivateFrameworks/ReflectionInternal.framework/Versions/A/ReflectionInternal -0x0000000215f17000 /System/Library/PrivateFrameworks/RuntimeInternal.framework/Versions/A/RuntimeInternal -0x000000022a917000 /usr/lib/swift/libswift_StringProcessing.dylib -0x000000018ce32000 /System/Library/PrivateFrameworks/CoreServicesInternal.framework/Versions/A/CoreServicesInternal -0x000000019555a000 /usr/lib/libbsm.0.dylib -0x0000000195fa2000 /usr/lib/system/libkxld.dylib -0x0000000191fcf000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/FSEvents -0x000000018cb2d000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore -0x0000000191491000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Metadata -0x0000000195c3f000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/OSServices -0x00000001960ec000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SearchKit.framework/Versions/A/SearchKit -0x00000001907a5000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE -0x0000000189cb6000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/LaunchServices -0x0000000197405000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/DictionaryServices -0x0000000191fdc000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SharedFileList.framework/Versions/A/SharedFileList -0x000000019618b000 /usr/lib/libapple_nghttp2.dylib -0x0000000190427000 /usr/lib/libsqlite3.dylib -0x000000019082c000 /System/Library/Frameworks/Network.framework/Versions/A/Network -0x0000000229265000 /usr/lib/libCoreEntitlements.dylib -0x0000000210ce3000 /System/Library/PrivateFrameworks/MessageSecurity.framework/Versions/A/MessageSecurity -0x000000019040d000 /System/Library/PrivateFrameworks/ProtocolBuffer.framework/Versions/A/ProtocolBuffer -0x0000000195b68000 /System/Library/PrivateFrameworks/AppleFSCompression.framework/Versions/A/AppleFSCompression -0x0000000195542000 /usr/lib/libcoretls.dylib -0x0000000197475000 /usr/lib/libcoretls_cfhelpers.dylib -0x00000001961ba000 /usr/lib/libpam.2.dylib -0x00000001974e6000 /usr/lib/libxar.1.dylib -0x00000001978cd000 /usr/lib/libheimdal-asn1.dylib -0x000000018e9e9000 /usr/lib/libnetwork.dylib -0x0000000196014000 /usr/lib/libpcap.A.dylib -0x0000000190819000 /usr/lib/libdns_services.dylib -0x000000019481b000 /System/Library/PrivateFrameworks/AppleSystemInfo.framework/Versions/A/AppleSystemInfo -0x0000000195243000 /System/Library/PrivateFrameworks/IOMobileFramebuffer.framework/Versions/A/IOMobileFramebuffer -0x000000022a86b000 /usr/lib/swift/libswift_RegexParser.dylib -0x0000000195c2c000 /usr/lib/libbz2.1.0.dylib -0x0000000195536000 /usr/lib/libCheckFix.dylib -0x000000018ee66000 /System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC -0x0000000194822000 /System/Library/PrivateFrameworks/CoreNLP.framework/Versions/A/CoreNLP -0x000000019144a000 /System/Library/PrivateFrameworks/MetadataUtilities.framework/Versions/A/MetadataUtilities -0x000000019556c000 /usr/lib/libmecab.dylib -0x000000018a626000 /usr/lib/libCRFSuite.dylib -0x00000001955c8000 /usr/lib/libgermantok.dylib -0x0000000196163000 /usr/lib/libThaiTokenizer.dylib -0x0000000191535000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vImage.framework/Versions/A/vImage -0x000000019d5cc000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib -0x000000019752d000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvMisc.dylib -0x000000019511f000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvDSP.dylib -0x000000018a0b5000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib -0x0000000196293000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib -0x00000001955cb000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLinearAlgebra.dylib -0x00000001961a5000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libSparseBLAS.dylib -0x000000019628e000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libQuadrature.dylib -0x0000000194944000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBNNS.dylib -0x000000018a52c000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libSparse.dylib -0x000000020f559000 /System/Library/PrivateFrameworks/MIL.framework/Versions/A/MIL -0x000000019604a000 /usr/lib/libiconv.2.dylib -0x0000000195f96000 /usr/lib/libcharset.1.dylib -0x0000000191faf000 /System/Library/Frameworks/OpenDirectory.framework/Versions/A/Frameworks/CFOpenDirectory.framework/Versions/A/CFOpenDirectory -0x0000000191f9f000 /System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory -0x0000000197477000 /System/Library/PrivateFrameworks/APFS.framework/Versions/A/APFS -0x0000000195473000 /System/Library/Frameworks/SecurityFoundation.framework/Versions/A/SecurityFoundation -0x00000001974f5000 /usr/lib/libutil.dylib -0x000000020d78e000 /System/Library/PrivateFrameworks/InstalledContentLibrary.framework/Versions/A/InstalledContentLibrary -0x000000018ce72000 /System/Library/PrivateFrameworks/CoreServicesStore.framework/Versions/A/CoreServicesStore -0x00000001fddd6000 /System/Library/PrivateFrameworks/AppleMobileFileIntegrity.framework/Versions/A/AppleMobileFileIntegrity -0x00000001ae560000 /usr/lib/libmis.dylib -0x00000001be072000 /System/Library/PrivateFrameworks/MobileSystemServices.framework/Versions/A/MobileSystemServices -0x00000001ef2c8000 /System/Library/PrivateFrameworks/ConfigProfileHelper.framework/Versions/A/ConfigProfileHelper -0x0000000196165000 /System/Library/PrivateFrameworks/AppleSauce.framework/Versions/A/AppleSauce -0x000000018b551000 /System/Library/PrivateFrameworks/LanguageModeling.framework/Versions/A/LanguageModeling -0x00000001974f9000 /usr/lib/libxslt.1.dylib -0x0000000196051000 /usr/lib/libcmph.dylib -0x0000000195210000 /System/Library/PrivateFrameworks/CoreEmoji.framework/Versions/A/CoreEmoji -0x000000019493e000 /System/Library/PrivateFrameworks/LinguisticData.framework/Versions/A/LinguisticData -0x000000018a43f000 /System/Library/PrivateFrameworks/Lexicon.framework/Versions/A/Lexicon -0x0000000195501000 /System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/BackgroundTaskManagement -0x000000022944e000 /usr/lib/libTLE.dylib -0x0000000197db4000 /System/Library/PrivateFrameworks/AppleJPEG.framework/Versions/A/AppleJPEG -0x00000001978b2000 /usr/lib/libexpat.1.dylib -0x00000001983ae000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libPng.dylib -0x00000001983d9000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib -0x00000001984c4000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libGIF.dylib -0x0000000197dfa000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJP2.dylib -0x0000000198469000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJPEG.dylib -0x0000000198460000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libRadiance.dylib -0x0000000193c73000 /System/Library/PrivateFrameworks/FontServices.framework/libFontParser.dylib -0x0000000190743000 /System/Library/PrivateFrameworks/RunningBoardServices.framework/Versions/A/RunningBoardServices -0x00000001a3d0d000 /System/Library/PrivateFrameworks/IOSurfaceAccelerator.framework/Versions/A/IOSurfaceAccelerator -0x0000000197eea000 /System/Library/PrivateFrameworks/WatchdogClient.framework/Versions/A/WatchdogClient -0x000000018b734000 /System/Library/Frameworks/CoreDisplay.framework/Versions/A/CoreDisplay -0x0000000193b2c000 /System/Library/Frameworks/CoreMedia.framework/Versions/A/CoreMedia -0x00000001938d0000 /System/Library/PrivateFrameworks/IOAccelerator.framework/Versions/A/IOAccelerator -0x0000000192142000 /System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo -0x00000001961b8000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/MetalPerformanceShaders -0x0000000197f2d000 /System/Library/Frameworks/VideoToolbox.framework/Versions/A/VideoToolbox -0x00000001921dd000 /System/Library/PrivateFrameworks/UserManagement.framework/Versions/A/UserManagement -0x0000000190672000 /System/Library/PrivateFrameworks/BaseBoard.framework/Versions/A/BaseBoard -0x0000000194819000 /System/Library/PrivateFrameworks/AggregateDictionary.framework/Versions/A/AggregateDictionary -0x00000001fdd56000 /System/Library/PrivateFrameworks/AppleKeyStore.framework/Versions/A/AppleKeyStore -0x000000019845b000 /System/Library/PrivateFrameworks/GPUWrangler.framework/Versions/A/GPUWrangler -0x000000019843b000 /System/Library/PrivateFrameworks/IOPresentment.framework/Versions/A/IOPresentment -0x0000000198463000 /System/Library/PrivateFrameworks/DSExternalDisplay.framework/Versions/A/DSExternalDisplay -0x0000000209900000 /System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/32023/Libraries/libllvm-flatbuffers.dylib -0x00000001f1e53000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreFSCache.dylib -0x0000000206b38000 /System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/32023/Libraries/libGPUCompilerUtils.dylib -0x00000001984ca000 /System/Library/PrivateFrameworks/CMCaptureCore.framework/Versions/A/CMCaptureCore -0x00000001f6c49000 /System/Library/Frameworks/ExtensionFoundation.framework/Versions/A/ExtensionFoundation -0x000000019f4a4000 /System/Library/PrivateFrameworks/CoreTime.framework/Versions/A/CoreTime -0x0000000197a83000 /System/Library/PrivateFrameworks/AppServerSupport.framework/Versions/A/AppServerSupport -0x0000000199fdb000 /System/Library/PrivateFrameworks/perfdata.framework/Versions/A/perfdata -0x000000018b858000 /System/Library/PrivateFrameworks/AudioToolboxCore.framework/Versions/A/AudioToolboxCore -0x0000000193b02000 /System/Library/PrivateFrameworks/caulk.framework/Versions/A/caulk -0x0000000199856000 /usr/lib/libAudioStatistics.dylib -0x00000001ad8bc000 /System/Library/PrivateFrameworks/SystemPolicy.framework/Versions/A/SystemPolicy -0x0000000199b2e000 /usr/lib/libSMC.dylib -0x00000001a3308000 /System/Library/Frameworks/CoreMIDI.framework/Versions/A/CoreMIDI -0x0000000198375000 /usr/lib/libAudioToolboxUtility.dylib -0x00000001a90f2000 /System/Library/PrivateFrameworks/OSAServicesClient.framework/Versions/A/OSAServicesClient -0x0000000199fe9000 /usr/lib/libperfcheck.dylib -0x000000019779c000 /System/Library/PrivateFrameworks/PlugInKit.framework/Versions/A/PlugInKit -0x0000000195465000 /System/Library/PrivateFrameworks/AssertionServices.framework/Versions/A/AssertionServices -0x00000001a241d000 /System/Library/PrivateFrameworks/ASEProcessing.framework/Versions/A/ASEProcessing -0x00000001c9cc4000 /System/Library/PrivateFrameworks/Symbolication.framework/Versions/A/Symbolication -0x00000002149db000 /System/Library/PrivateFrameworks/PhotosensitivityProcessing.framework/Versions/A/PhotosensitivityProcessing -0x0000000197a35000 /System/Library/PrivateFrameworks/GraphVisualizer.framework/Versions/A/GraphVisualizer -0x00000001f1eb5000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.dylib -0x00000001f1e74000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGFXShared.dylib -0x00000001f204d000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib -0x00000001f1e7d000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLImage.dylib -0x00000001f1e71000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCVMSPluginSupport.dylib -0x0000000229407000 /usr/lib/libRosetta.dylib -0x00000001f1e5a000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreVMClient.dylib -0x0000000204ef2000 /System/Library/PrivateFrameworks/FontServices.framework/Versions/A/FontServices -0x0000000197a41000 /System/Library/PrivateFrameworks/OTSVG.framework/Versions/A/OTSVG -0x0000000191ce3000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontRegistry.dylib -0x0000000197a8d000 /System/Library/PrivateFrameworks/FontServices.framework/libhvf.dylib -0x0000000204ef3000 /System/Library/PrivateFrameworks/FontServices.framework/libXTFontStaticRegistryData.dylib -0x0000000194790000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSCore.framework/Versions/A/MPSCore -0x0000000195adb000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSImage.framework/Versions/A/MPSImage -0x00000001955e0000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSNeuralNetwork.framework/Versions/A/MPSNeuralNetwork -0x00000001959ce000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSMatrix.framework/Versions/A/MPSMatrix -0x00000001957da000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSRayIntersector.framework/Versions/A/MPSRayIntersector -0x00000001959fd000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSNDArray.framework/Versions/A/MPSNDArray -0x00000001f8321000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSFunctions.framework/Versions/A/MPSFunctions -0x00000001f8303000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSBenchmarkLoop.framework/Versions/A/MPSBenchmarkLoop -0x0000000189f6a000 /System/Library/PrivateFrameworks/MetalTools.framework/Versions/A/MetalTools -0x00000001b2971000 /System/Library/PrivateFrameworks/IOAccelMemoryInfo.framework/Versions/A/IOAccelMemoryInfo -0x00000001bdf7f000 /System/Library/PrivateFrameworks/kperf.framework/Versions/A/kperf -0x00000001ae574000 /System/Library/PrivateFrameworks/GPURawCounter.framework/Versions/A/GPURawCounter -0x000000019f394000 /System/Library/PrivateFrameworks/CoreSymbolication.framework/Versions/A/CoreSymbolication -0x00000001ae531000 /System/Library/PrivateFrameworks/MallocStackLogging.framework/Versions/A/MallocStackLogging -0x0000000197643000 /System/Library/PrivateFrameworks/CrashReporterSupport.framework/Versions/A/CrashReporterSupport -0x000000019f34f000 /System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols -0x00000001bd2bd000 /System/Library/PrivateFrameworks/OSAnalytics.framework/Versions/A/OSAnalytics -0x0000000220990000 /System/Library/PrivateFrameworks/VideoToolboxParavirtualizationSupport.framework/Versions/A/VideoToolboxParavirtualizationSupport -0x0000000197866000 /System/Library/PrivateFrameworks/AppleVA.framework/Versions/A/AppleVA -0x000000019989e000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/ATS -0x000000018fba9000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/HIServices -0x00000001984d8000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/PrintCore -0x0000000199c87000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/QD.framework/Versions/A/QD -0x0000000199c7b000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ColorSyncLegacy.framework/Versions/A/ColorSyncLegacy -0x000000019986e000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/SpeechSynthesis.framework/Versions/A/SpeechSynthesis -0x0000000198494000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATSUI.framework/Versions/A/ATSUI -0x0000000199c0e000 /usr/lib/libcups.2.dylib -0x0000000199ff7000 /System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos -0x000000019a008000 /System/Library/Frameworks/GSS.framework/Versions/A/GSS -0x000000019991d000 /usr/lib/libresolv.9.dylib -0x0000000197a9e000 /System/Library/PrivateFrameworks/Heimdal.framework/Versions/A/Heimdal -0x00000001a13bf000 /System/Library/Frameworks/Kerberos.framework/Versions/A/Libraries/libHeimdalProxy.dylib -0x000000019a062000 /System/Library/PrivateFrameworks/CommonAuth.framework/Versions/A/CommonAuth -0x00000001f5a4a000 /System/Library/Frameworks/AVFAudio.framework/Versions/A/AVFAudio -0x00000001a9141000 /System/Library/PrivateFrameworks/AXCoreUtilities.framework/Versions/A/AXCoreUtilities -0x00000001997da000 /System/Library/PrivateFrameworks/AudioSession.framework/Versions/A/AudioSession -0x000000019b27f000 /System/Library/Frameworks/IOBluetooth.framework/Versions/A/IOBluetooth -0x0000000197971000 /System/Library/PrivateFrameworks/MediaExperience.framework/Versions/A/MediaExperience -0x000000019961d000 /System/Library/PrivateFrameworks/AudioSession.framework/libSessionUtility.dylib -0x0000000199c93000 /System/Library/PrivateFrameworks/AudioResourceArbitration.framework/Versions/A/AudioResourceArbitration -0x000000019e322000 /System/Library/PrivateFrameworks/PowerLog.framework/Versions/A/PowerLog -0x000000019e245000 /System/Library/Frameworks/CoreBluetooth.framework/Versions/A/CoreBluetooth -0x00000001a13c0000 /System/Library/Frameworks/AudioUnit.framework/Versions/A/AudioUnit -0x00000001952d0000 /System/Library/PrivateFrameworks/CoreUtils.framework/Versions/A/CoreUtils -0x0000000203368000 /System/Library/PrivateFrameworks/CoreUtilsExtras.framework/Versions/A/CoreUtilsExtras -0x000000020d625000 /System/Library/PrivateFrameworks/IO80211.framework/Versions/A/IO80211 -0x00000001a915c000 /usr/lib/libAccessibility.dylib -0x000000019d945000 /System/Library/Frameworks/MediaAccessibility.framework/Versions/A/MediaAccessibility -0x000000019eecb000 /System/Library/PrivateFrameworks/FrontBoardServices.framework/Versions/A/FrontBoardServices -0x00000001a099d000 /System/Library/PrivateFrameworks/BackBoardServices.framework/Versions/A/BackBoardServices -0x000000019ef85000 /System/Library/PrivateFrameworks/BoardServices.framework/Versions/A/BoardServices -0x00000001978d8000 /System/Library/PrivateFrameworks/IconFoundation.framework/Versions/A/IconFoundation -0x000000019d1dd000 /System/Library/PrivateFrameworks/SpeechRecognitionCore.framework/Versions/A/SpeechRecognitionCore -0x00000001cd0d6000 /System/Library/Frameworks/OSLog.framework/Versions/A/OSLog -0x00000001ae4c1000 /System/Library/PrivateFrameworks/LoggingSupport.framework/Versions/A/LoggingSupport -0x0000000105b38000 /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/server/libjvm.dylib -0x0000000104650000 /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libjimage.dylib -0x0000000104698000 /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libjava.dylib -0x00000001049c8000 /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libnio.dylib -0x0000000104a0c000 /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libnet.dylib -0x00000001049e8000 /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libzip.dylib -0x0000000105534000 /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libverify.dylib -0x0000000105550000 /Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home/lib/libextnet.dylib -0x00000001254a8000 /Users/andrewc/git/bq/babushka/java/target/release/libglide_rs.dylib - - -VM Arguments: -jvm_args: -Djava.library.path=/Users/andrewc/git/bq/babushka/java/client/../target/release:/Users/andrewc/git/bq/babushka/java/client/../target/debug -Dorg.gradle.internal.worker.tmpdir=/Users/andrewc/git/bq/babushka/java/client/build/tmp/test/work -Dorg.gradle.native=false -Xmx512m -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en -Duser.variant -ea -java_command: worker.org.gradle.process.internal.worker.GradleWorkerMain 'Gradle Test Executor 12' -java_class_path (initial): /Users/andrewc/.gradle/caches/8.3/workerMain/gradle-worker.jar:/Users/andrewc/git/bq/babushka/java/client/build/classes/java/test:/Users/andrewc/git/bq/babushka/java/client/build/classes/java/main:/Users/andrewc/.gradle/caches/modules-2/files-2.1/com.google.protobuf/protobuf-java/3.24.3/8e0f08a59c21e3f17121667489a005a8df091af0/protobuf-java-3.24.3.jar:/Users/andrewc/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.13.0/b7263237aa89c1f99b327197c41d0669707a462e/commons-lang3-3.13.0.jar:/Users/andrewc/.gradle/caches/modules-2/files-2.1/io.netty/netty-handler/4.1.100.Final/4c0acdb8bb73647ebb3847ac2d503d53d72c02b4/netty-handler-4.1.100.Final.jar:/Users/andrewc/.gradle/caches/modules-2/files-2.1/io.netty/netty-transport-native-epoll/4.1.100.Final/d83003b8eac838e4bc3f7662a22f9f2d879c0fe4/netty-transport-native-epoll-4.1.100.Final-linux-x86_64.jar:/Users/andrewc/.gradle/caches/modules-2/files-2.1/io.netty/netty-transport-native-kqueue/4.1.100.Final/135c3a560a4fb84b0e2084f376610347483e2e8a/netty-transport-native-kqueue-4.1.100.Final-osx-x86_64.jar:/Users/andrewc/.gradle/caches/modules-2/files-2.1/io.netty/netty-transport-native-kqueue/4.1.100.Final/2d75a8e80a75def2b61bac1ea5f66d184f5069f0/netty-transport-native-kqueue-4.1.100.Final-osx-aarch_64.jar:/Users/andrewc/.gradle/caches/modules-2/files-2.1/org.mockito/mockito-junit-jupiter/3.12.4/c42cc385c3a953fb0cdcea39209ea374fbc6824c/mockito-junit-jupiter-3.12.4.jar:/Users/andrewc/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-params/5.7.2/685f832f8c54dd40100f646d61aca88ed9545421/junit-jupiter-params-5.7.2.jar:/Users/andrewc/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-engine/5.7.2/9415680a889f00b8205a094c5c487bc69dc7077d/junit-jupiter-engine-5.7.2.jar:/Users/andrewc/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-api/5.7.2/f4b4079732a9c537983324cfa4e46655f21d2c56/junit-jupiter-api-5.7.2.jar:/Users/andrewc/.gradle/caches/ -Launcher Type: SUN_STANDARD - -[Global flags] - intx CICompilerCount = 4 {product} {ergonomic} - uint ConcGCThreads = 2 {product} {ergonomic} - uint G1ConcRefinementThreads = 9 {product} {ergonomic} - size_t G1HeapRegionSize = 1048576 {product} {ergonomic} - uintx GCDrainStackTargetSize = 64 {product} {ergonomic} - size_t InitialHeapSize = 536870912 {product} {ergonomic} - size_t MarkStackSize = 4194304 {product} {ergonomic} - size_t MaxHeapSize = 536870912 {product} {command line} - size_t MaxNewSize = 321912832 {product} {ergonomic} - size_t MinHeapDeltaBytes = 1048576 {product} {ergonomic} - size_t MinHeapSize = 8388608 {product} {ergonomic} - uintx NonNMethodCodeHeapSize = 5839564 {pd product} {ergonomic} - uintx NonProfiledCodeHeapSize = 122909338 {pd product} {ergonomic} - uintx ProfiledCodeHeapSize = 122909338 {pd product} {ergonomic} - uintx ReservedCodeCacheSize = 251658240 {pd product} {ergonomic} - bool SegmentedCodeCache = true {product} {ergonomic} - size_t SoftMaxHeapSize = 536870912 {manageable} {ergonomic} - bool UseCompressedClassPointers = true {product lp64_product} {ergonomic} - bool UseCompressedOops = true {product lp64_product} {ergonomic} - bool UseG1GC = true {product} {ergonomic} - bool UseNUMA = false {product} {ergonomic} - bool UseNUMAInterleaving = false {product} {ergonomic} - -Logging: -Log output configuration: - #0: stdout all=warning uptime,level,tags - #1: stderr all=off uptime,level,tags - -Environment Variables: -JAVA_HOME=/Users/andrewc/Library/Java/JavaVirtualMachines/corretto-17.0.3/Contents/Home -PATH=/opt/homebrew/opt/node@16/bin:/usr/local/mysql/bin:/opt/homebrew/opt/ruby/bin:/Users/andrewc/Library/Python/3.8/bin:/opt/homebrew/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/usr/local/MacGPG2/bin:/Users/andrewc/.cargo/bin -SHELL=/bin/zsh -LC_CTYPE=en_CA.UTF-8 - -Signal Handlers: - SIGSEGV: crash_handler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO - SIGBUS: crash_handler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO - SIGFPE: crash_handler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO - SIGPIPE: javaSignalHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO - SIGXFSZ: javaSignalHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO - SIGILL: crash_handler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO - SIGUSR2: SR_handler in libjvm.dylib, mask=00100000000000000000000000000000, flags=SA_RESTART|SA_SIGINFO - SIGHUP: UserHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO - SIGINT: UserHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO - SIGTERM: UserHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO - SIGQUIT: UserHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO - *** Handler was modified! - *** Expected: javaSignalHandler in libjvm.dylib, mask=11100110100111111111111111111111, flags=SA_RESTART|SA_SIGINFO - SIGTRAP: crash_handler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO - - ---------------- S Y S T E M --------------- - -OS: -uname: Darwin 23.2.0 Darwin Kernel Version 23.2.0: Wed Nov 15 21:53:18 PST 2023; root:xnu-10002.61.3~2/RELEASE_ARM64_T6000 arm64 -OS uptime: 7 days 6:34 hours -rlimit (soft/hard): STACK 8176k/65520k , CORE 0k/infinity , NPROC 10666/16000 , NOFILE 10240/infinity , AS infinity/infinity , CPU infinity/infinity , DATA infinity/infinity , FSIZE infinity/infinity , MEMLOCK infinity/infinity , RSS infinity/infinity -load average: 6.70 7.17 7.87 - -CPU: total 10 (initial active 10) 0x61:0x0:0x1b588bb3:0, fp, simd, crc, lse - -Memory: 16k page, physical 67108864k(2424576k free), swap 0k(0k free) - -vm_info: OpenJDK 64-Bit Server VM (17.0.3+6-LTS) for bsd-aarch64 JRE (17.0.3+6-LTS), built on Apr 16 2022 17:14:31 by "jenkins" with clang Apple LLVM 13.0.0 (clang-1300.0.29.30) - -END. From 1a31d3b4280f89782526c1d12a4cfb0ab1855969 Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Tue, 2 Jan 2024 15:25:34 -0800 Subject: [PATCH 06/23] Update JavaDocs and comments Signed-off-by: Andrew Carbonetto --- java/client/src/main/java/glide/api/BaseClient.java | 2 +- java/client/src/main/java/glide/api/RedisClient.java | 7 +++---- .../api/models/configuration/BaseClientConfiguration.java | 2 +- .../java/glide/connectors/handlers/ChannelHandler.java | 2 +- .../src/main/java/glide/managers/CallbackManager.java | 2 +- .../src/main/java/glide/managers/ConnectionManager.java | 5 +---- 6 files changed, 8 insertions(+), 12 deletions(-) diff --git a/java/client/src/main/java/glide/api/BaseClient.java b/java/client/src/main/java/glide/api/BaseClient.java index 07b004ac6a..88a42c1551 100644 --- a/java/client/src/main/java/glide/api/BaseClient.java +++ b/java/client/src/main/java/glide/api/BaseClient.java @@ -4,7 +4,7 @@ import glide.managers.ConnectionManager; import lombok.AllArgsConstructor; -/** Base Client class for connecting to Redis */ +/** Base Client class for Redis */ @AllArgsConstructor public abstract class BaseClient implements AutoCloseable { diff --git a/java/client/src/main/java/glide/api/RedisClient.java b/java/client/src/main/java/glide/api/RedisClient.java index ee49b7803c..a8b0f65424 100644 --- a/java/client/src/main/java/glide/api/RedisClient.java +++ b/java/client/src/main/java/glide/api/RedisClient.java @@ -12,7 +12,8 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicBoolean; -/** Factory class for creating Glide/Redis-client connections */ +/** Async (non-blocking) client for Redis in Standalone mode. Use {@link #CreateClient()} to + * request a client to Redis. */ public class RedisClient extends BaseClient { public static CompletableFuture CreateClient() { @@ -29,14 +30,12 @@ public static CompletableFuture CreateClient(String host, Integer p } /** - * Async (non-blocking) connection to Redis. + * Request an async (non-blocking) Redis client in Standalone mode. * * @param config - Redis Client Configuration * @return a promise to connect and return a RedisClient */ public static CompletableFuture CreateClient(RedisClientConfiguration config) { - AtomicBoolean connectionStatus = new AtomicBoolean(false); - CallbackDispatcher callbackDispatcher = new CallbackDispatcher(); ChannelHandler channelHandler = new ChannelHandler(callbackDispatcher, getSocket()); var connectionManager = new ConnectionManager(channelHandler); diff --git a/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java b/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java index 41d6321ba0..7835867f09 100644 --- a/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java +++ b/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java @@ -7,7 +7,7 @@ import lombok.Singular; import lombok.experimental.SuperBuilder; -/** Represents the configuration settings for a Redis client. */ +/** Configuration settings class for creating a Redis Client. Shared settings for both a standalone and cluster clients. */ @Getter @SuperBuilder public abstract class BaseClientConfiguration { diff --git a/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java b/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java index bc38510105..6326b06c54 100644 --- a/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java +++ b/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java @@ -12,7 +12,7 @@ import response.ResponseOuterClass.Response; /** - * Class responsible for handling calls to/from a netty.io {@link Channel}.
+ * Class responsible for handling calls to/from a netty.io {@link Channel}. * Uses a {@link CallbackDispatcher} to record callbacks of every request sent. */ public class ChannelHandler { diff --git a/java/client/src/main/java/glide/managers/CallbackManager.java b/java/client/src/main/java/glide/managers/CallbackManager.java index 720b84f36f..54e3a19078 100644 --- a/java/client/src/main/java/glide/managers/CallbackManager.java +++ b/java/client/src/main/java/glide/managers/CallbackManager.java @@ -14,7 +14,7 @@ public class CallbackManager { private final AtomicInteger requestId = new AtomicInteger(0); /** - * Storage of Futures to handle responses. Map key is callback id, which starts from 1.
+ * Storage of Futures to handle responses. Map key is callback id, which starts from 0. * Each future is a promise for every submitted by user request. */ private final Map> responses = new ConcurrentHashMap<>(); diff --git a/java/client/src/main/java/glide/managers/ConnectionManager.java b/java/client/src/main/java/glide/managers/ConnectionManager.java index dd5503a6ba..93d22195bd 100644 --- a/java/client/src/main/java/glide/managers/ConnectionManager.java +++ b/java/client/src/main/java/glide/managers/ConnectionManager.java @@ -155,9 +155,8 @@ private ConnectionRequestOuterClass.ReadFrom mapReadFromEnum(ReadFrom readFrom) /** Check a response received from Glide. */ private Void checkGlideRsResponse(Response response) { - // TODO do we need to check callback value? It could be -1 or 0 if (response.hasRequestError()) { - // TODO do we need to support different types of exceptions and distinguish them by type? + // TODO support different types of exceptions and distinguish them by type: throw new RuntimeException( String.format( "%s: %s", @@ -169,8 +168,6 @@ private Void checkGlideRsResponse(Response response) { } else if (response.hasRespPointer()) { throw new RuntimeException("Unexpected data in response"); } - // TODO commented out due to #710 https://github.com/aws/babushka/issues/710 - // empty response means a successful connection // throw new IllegalStateException("A malformed response received: " + response.toString()); return null; } From 2a9e6ff52324500af378acdd4fa24247b2e60f82 Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Tue, 2 Jan 2024 23:57:54 -0800 Subject: [PATCH 07/23] Update comments; Add CreateClient unit tests Signed-off-by: Andrew Carbonetto --- java/client/build.gradle | 1 + .../src/main/java/glide/api/RedisClient.java | 11 +- .../BaseClientConfiguration.java | 5 +- .../connectors/handlers/ChannelHandler.java | 4 +- .../java/glide/managers/CallbackManager.java | 4 +- .../glide/managers/ConnectionManager.java | 4 +- .../java/glide/api/RedisClientCreateTest.java | 153 ++++++++++++++++++ .../ConnectionManagerTest.java | 3 +- 8 files changed, 170 insertions(+), 15 deletions(-) create mode 100644 java/client/src/test/java/glide/api/RedisClientCreateTest.java rename java/client/src/test/java/glide/{api => managers}/ConnectionManagerTest.java (99%) diff --git a/java/client/build.gradle b/java/client/build.gradle index 9f3b80f5c6..0fb95b43ec 100644 --- a/java/client/build.gradle +++ b/java/client/build.gradle @@ -26,6 +26,7 @@ dependencies { testAnnotationProcessor 'org.projectlombok:lombok:1.18.30' // junit + testImplementation group: 'org.mockito', name: 'mockito-inline', version: '3.12.4' testImplementation('org.junit.jupiter:junit-jupiter:5.6.2') testImplementation group: 'org.mockito', name: 'mockito-junit-jupiter', version: '3.12.4' } diff --git a/java/client/src/main/java/glide/api/RedisClient.java b/java/client/src/main/java/glide/api/RedisClient.java index a8b0f65424..1ca7fda11d 100644 --- a/java/client/src/main/java/glide/api/RedisClient.java +++ b/java/client/src/main/java/glide/api/RedisClient.java @@ -10,10 +10,11 @@ import glide.managers.ConnectionManager; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; -import java.util.concurrent.atomic.AtomicBoolean; -/** Async (non-blocking) client for Redis in Standalone mode. Use {@link #CreateClient()} to - * request a client to Redis. */ +/** + * Async (non-blocking) client for Redis in Standalone mode. Use {@link #CreateClient()} to request + * a client to Redis. + */ public class RedisClient extends BaseClient { public static CompletableFuture CreateClient() { @@ -25,7 +26,6 @@ public static CompletableFuture CreateClient(String host, Integer p RedisClientConfiguration.builder() .address(NodeAddress.builder().host(host).port(port).build()) .build(); - return CreateClient(config); } @@ -40,11 +40,10 @@ public static CompletableFuture CreateClient(RedisClientConfigurati ChannelHandler channelHandler = new ChannelHandler(callbackDispatcher, getSocket()); var connectionManager = new ConnectionManager(channelHandler); var commandManager = new CommandManager(new CompletableFuture<>()); - // TODO: send request with configuration to connection Manager as part of a follow-up PR return CreateClient(config, connectionManager, commandManager); } - private static CompletableFuture CreateClient( + protected static CompletableFuture CreateClient( RedisClientConfiguration config, ConnectionManager connectionManager, CommandManager commandManager) { diff --git a/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java b/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java index 7835867f09..b131b0e4cc 100644 --- a/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java +++ b/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java @@ -7,7 +7,10 @@ import lombok.Singular; import lombok.experimental.SuperBuilder; -/** Configuration settings class for creating a Redis Client. Shared settings for both a standalone and cluster clients. */ +/** + * Configuration settings class for creating a Redis Client. Shared settings for both a standalone + * and cluster clients. + */ @Getter @SuperBuilder public abstract class BaseClientConfiguration { diff --git a/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java b/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java index 6326b06c54..55464628f7 100644 --- a/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java +++ b/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java @@ -12,8 +12,8 @@ import response.ResponseOuterClass.Response; /** - * Class responsible for handling calls to/from a netty.io {@link Channel}. - * Uses a {@link CallbackDispatcher} to record callbacks of every request sent. + * Class responsible for handling calls to/from a netty.io {@link Channel}. Uses a {@link + * CallbackDispatcher} to record callbacks of every request sent. */ public class ChannelHandler { diff --git a/java/client/src/main/java/glide/managers/CallbackManager.java b/java/client/src/main/java/glide/managers/CallbackManager.java index 54e3a19078..5ac6af263c 100644 --- a/java/client/src/main/java/glide/managers/CallbackManager.java +++ b/java/client/src/main/java/glide/managers/CallbackManager.java @@ -14,8 +14,8 @@ public class CallbackManager { private final AtomicInteger requestId = new AtomicInteger(0); /** - * Storage of Futures to handle responses. Map key is callback id, which starts from 0. - * Each future is a promise for every submitted by user request. + * Storage of Futures to handle responses. Map key is callback id, which starts from 0. Each + * future is a promise for every submitted by user request. */ private final Map> responses = new ConcurrentHashMap<>(); diff --git a/java/client/src/main/java/glide/managers/ConnectionManager.java b/java/client/src/main/java/glide/managers/ConnectionManager.java index 93d22195bd..1e6a87811a 100644 --- a/java/client/src/main/java/glide/managers/ConnectionManager.java +++ b/java/client/src/main/java/glide/managers/ConnectionManager.java @@ -25,12 +25,12 @@ public class ConnectionManager { * @param configuration Connection Request Configuration */ public CompletableFuture connectToRedis(BaseClientConfiguration configuration) { - connection_request.ConnectionRequestOuterClass.ConnectionRequest request = createConnectionRequest(configuration); + ConnectionRequestOuterClass.ConnectionRequest request = createConnectionRequest(configuration); return channel.connect(request).thenApplyAsync(this::checkGlideRsResponse); } - /** Close the connection and the corresponding channel. */ /** + * Close the connection and the corresponding channel. * Creates a ConnectionRequest protobuf message based on the type of client Standalone/Cluster. * * @param configuration Connection Request Configuration diff --git a/java/client/src/test/java/glide/api/RedisClientCreateTest.java b/java/client/src/test/java/glide/api/RedisClientCreateTest.java new file mode 100644 index 0000000000..65e52716b6 --- /dev/null +++ b/java/client/src/test/java/glide/api/RedisClientCreateTest.java @@ -0,0 +1,153 @@ +package glide.api; + +import static glide.api.RedisClient.CreateClient; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.mockito.Mockito.withSettings; + +import glide.api.models.configuration.RedisClientConfiguration; +import glide.ffi.resolvers.SocketListenerResolver; +import glide.managers.CommandManager; +import glide.managers.ConnectionManager; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import lombok.SneakyThrows; +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + +public class RedisClientCreateTest { + + @Test + @SneakyThrows + public void createClient_withConfig_successfullyReturnsRedisClient() { + try (MockedStatic mockedClient = Mockito.mockStatic(RedisClient.class); + MockedStatic mockedSocketListener = + Mockito.mockStatic(SocketListenerResolver.class)) { + + // setup + CompletableFuture testFuture = new CompletableFuture<>(); + RedisClientConfiguration config = RedisClientConfiguration.builder().build(); + + mockedSocketListener.when(SocketListenerResolver::getSocket).thenReturn("test_socket"); + mockedClient.when(() -> CreateClient(any(), any(), any())).thenReturn(testFuture); + + // method under test + mockedClient.when(() -> CreateClient(config)).thenCallRealMethod(); + + // exercise + CompletableFuture result = CreateClient(config); + + // verify + mockedClient.verify(() -> CreateClient(any(), any(), any())); + assertEquals(testFuture, result); + } + } + + @Test + @SneakyThrows + public void createClient_noArgs_successfullyReturnsRedisClient() { + try (MockedStatic mockedClient = + Mockito.mockStatic(RedisClient.class, withSettings().verboseLogging()); + MockedStatic mockedSocketListener = + Mockito.mockStatic(SocketListenerResolver.class, withSettings().verboseLogging())) { + + // setup + mockedSocketListener.when(SocketListenerResolver::getSocket).thenReturn("test_socket"); + CompletableFuture testFuture = new CompletableFuture<>(); + mockedClient.when(() -> CreateClient(any(), any(), any())).thenReturn(testFuture); + + // method under test + mockedClient.when(RedisClient::CreateClient).thenCallRealMethod(); + mockedClient.when(() -> CreateClient(any())).thenCallRealMethod(); + + // exercise + CompletableFuture result = CreateClient(); + + // verify + assertEquals(testFuture, result); + } + } + + @Test + @SneakyThrows + public void createClient_withHostPort_successfullyReturnsRedisClient() { + try (MockedStatic mockedClient = + Mockito.mockStatic(RedisClient.class, withSettings().verboseLogging()); + MockedStatic mockedSocketListener = + Mockito.mockStatic(SocketListenerResolver.class, withSettings().verboseLogging())) { + + // setup + String host = "testhost"; + int port = 999; + + mockedSocketListener.when(SocketListenerResolver::getSocket).thenReturn("test_socket"); + CompletableFuture testFuture = new CompletableFuture<>(); + mockedClient.when(() -> CreateClient(any())).thenReturn(testFuture); + + // method under test + mockedClient.when(RedisClient::CreateClient).thenCallRealMethod(); + mockedClient.when(() -> CreateClient(host, port)).thenCallRealMethod(); + + // exercise + CompletableFuture result = CreateClient(); + + // verify + assertEquals(testFuture, result); + } + } + + @SneakyThrows + @Test + public void createClient_successfulConnectionReturnsRedisClient() { + + // setup + ConnectionManager connectionManager = mock(ConnectionManager.class); + CommandManager commandManager = mock(CommandManager.class); + RedisClientConfiguration configuration = RedisClientConfiguration.builder().build(); + CompletableFuture connectionFuture = new CompletableFuture<>(); + connectionFuture.complete(null); + when(connectionManager.connectToRedis(eq(configuration))).thenReturn(connectionFuture); + + // exercise + CompletableFuture response = + RedisClient.CreateClient(configuration, connectionManager, commandManager); + RedisClient client = response.get(); + + // verify + assertEquals(connectionManager, client.connectionManager); + assertEquals(commandManager, client.commandManager); + + // teardown + } + + @SneakyThrows + @Test + public void createClient_errorOnConnectionThrowsExecutionException() { + + // setup + ConnectionManager connectionManager = mock(ConnectionManager.class); + CommandManager commandManager = mock(CommandManager.class); + RedisClientConfiguration configuration = RedisClientConfiguration.builder().build(); + CompletableFuture connectionFuture = new CompletableFuture<>(); + RuntimeException exception = new RuntimeException("disconnected"); + connectionFuture.completeExceptionally(exception); + when(connectionManager.connectToRedis(eq(configuration))).thenReturn(connectionFuture); + + // exercise + CompletableFuture response = + RedisClient.CreateClient(configuration, connectionManager, commandManager); + + ExecutionException executionException = + assertThrows(ExecutionException.class, () -> response.get()); + + // verify + assertEquals(exception, executionException.getCause()); + + // teardown + } +} diff --git a/java/client/src/test/java/glide/api/ConnectionManagerTest.java b/java/client/src/test/java/glide/managers/ConnectionManagerTest.java similarity index 99% rename from java/client/src/test/java/glide/api/ConnectionManagerTest.java rename to java/client/src/test/java/glide/managers/ConnectionManagerTest.java index 44b6d545a1..ee11eb1285 100644 --- a/java/client/src/test/java/glide/api/ConnectionManagerTest.java +++ b/java/client/src/test/java/glide/managers/ConnectionManagerTest.java @@ -1,4 +1,4 @@ -package glide.api; +package glide.managers; import static glide.api.models.configuration.NodeAddress.DEFAULT_HOST; import static glide.api.models.configuration.NodeAddress.DEFAULT_PORT; @@ -22,7 +22,6 @@ import glide.api.models.configuration.RedisClusterClientConfiguration; import glide.api.models.configuration.RedisCredentials; import glide.connectors.handlers.ChannelHandler; -import glide.managers.ConnectionManager; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import org.junit.jupiter.api.BeforeEach; From 75d24941b1d9907127806ea9c0d5a558b4c66ac4 Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Wed, 3 Jan 2024 13:46:18 -0800 Subject: [PATCH 08/23] Clean up RedisClient and ConnectionManager after mergre Signed-off-by: Andrew Carbonetto --- .../src/main/java/glide/api/RedisClient.java | 8 ++---- .../glide/managers/ConnectionManager.java | 26 ++++++++++++------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/java/client/src/main/java/glide/api/RedisClient.java b/java/client/src/main/java/glide/api/RedisClient.java index 1ca7fda11d..dedb4df659 100644 --- a/java/client/src/main/java/glide/api/RedisClient.java +++ b/java/client/src/main/java/glide/api/RedisClient.java @@ -39,7 +39,7 @@ public static CompletableFuture CreateClient(RedisClientConfigurati CallbackDispatcher callbackDispatcher = new CallbackDispatcher(); ChannelHandler channelHandler = new ChannelHandler(callbackDispatcher, getSocket()); var connectionManager = new ConnectionManager(channelHandler); - var commandManager = new CommandManager(new CompletableFuture<>()); + var commandManager = new CommandManager(channelHandler); return CreateClient(config, connectionManager, commandManager); } @@ -64,11 +64,7 @@ protected RedisClient(ConnectionManager connectionManager, CommandManager comman @Override public void close() throws ExecutionException { try { - connectionManager - .closeConnection() - .thenComposeAsync(ignore -> commandManager.closeConnection()) - .thenApplyAsync(ignore -> this) - .get(); + connectionManager.closeConnection().get(); } catch (InterruptedException interruptedException) { // AutoCloseable functions are strongly advised to avoid throwing InterruptedExceptions // TODO: marking resources as closed: diff --git a/java/client/src/main/java/glide/managers/ConnectionManager.java b/java/client/src/main/java/glide/managers/ConnectionManager.java index 1e6a87811a..82644e3c66 100644 --- a/java/client/src/main/java/glide/managers/ConnectionManager.java +++ b/java/client/src/main/java/glide/managers/ConnectionManager.java @@ -1,10 +1,16 @@ package glide.managers; +import static glide.api.models.configuration.NodeAddress.DEFAULT_HOST; +import static glide.api.models.configuration.NodeAddress.DEFAULT_PORT; + +import connection_request.ConnectionRequestOuterClass; import connection_request.ConnectionRequestOuterClass.ConnectionRequest; import glide.api.models.configuration.BaseClientConfiguration; +import glide.api.models.configuration.NodeAddress; +import glide.api.models.configuration.ReadFrom; +import glide.api.models.configuration.RedisClientConfiguration; +import glide.api.models.configuration.RedisClusterClientConfiguration; import glide.connectors.handlers.ChannelHandler; -import glide.ffi.resolvers.RedisValueResolver; -import glide.models.RequestBuilder; import java.util.concurrent.CompletableFuture; import lombok.RequiredArgsConstructor; import response.ResponseOuterClass.Response; @@ -25,13 +31,13 @@ public class ConnectionManager { * @param configuration Connection Request Configuration */ public CompletableFuture connectToRedis(BaseClientConfiguration configuration) { - ConnectionRequestOuterClass.ConnectionRequest request = createConnectionRequest(configuration); + ConnectionRequest request = createConnectionRequest(configuration); return channel.connect(request).thenApplyAsync(this::checkGlideRsResponse); } /** - * Close the connection and the corresponding channel. - * Creates a ConnectionRequest protobuf message based on the type of client Standalone/Cluster. + * Close the connection and the corresponding channel. Creates a ConnectionRequest protobuf + * message based on the type of client Standalone/Cluster. * * @param configuration Connection Request Configuration * @return ConnectionRequest protobuf message @@ -59,7 +65,7 @@ private ConnectionRequest.Builder setupConnectionRequestBuilderBaseConfiguration if (!configuration.getAddresses().isEmpty()) { for (NodeAddress nodeAddress : configuration.getAddresses()) { connectionRequestBuilder.addAddresses( - ConnectionRequestOuterClass.NodeAddress.newBuilder() + connection_request.ConnectionRequestOuterClass.NodeAddress.newBuilder() .setHost(nodeAddress.getHost()) .setPort(nodeAddress.getPort()) .build()); @@ -76,12 +82,12 @@ private ConnectionRequest.Builder setupConnectionRequestBuilderBaseConfiguration .setTlsMode( configuration.isUseTLS() ? ConnectionRequestOuterClass.TlsMode.SecureTls - : ConnectionRequestOuterClass.TlsMode.NoTls) + : connection_request.ConnectionRequestOuterClass.TlsMode.NoTls) .setReadFrom(mapReadFromEnum(configuration.getReadFrom())); if (configuration.getCredentials() != null) { - ConnectionRequestOuterClass.AuthenticationInfo.Builder authenticationInfoBuilder = - ConnectionRequestOuterClass.AuthenticationInfo.newBuilder(); + connection_request.ConnectionRequestOuterClass.AuthenticationInfo.Builder + authenticationInfoBuilder = ConnectionRequestOuterClass.AuthenticationInfo.newBuilder(); if (configuration.getCredentials().getUsername() != null) { authenticationInfoBuilder.setUsername(configuration.getCredentials().getUsername()); } @@ -129,7 +135,7 @@ private ConnectionRequest.Builder setupConnectionRequestBuilderRedisClient( * * @param configuration */ - private ConnectionRequestOuterClass.ConnectionRequest.Builder + private connection_request.ConnectionRequestOuterClass.ConnectionRequest.Builder setupConnectionRequestBuilderRedisClusterClient( RedisClusterClientConfiguration configuration) { ConnectionRequest.Builder connectionRequestBuilder = From 617ab3e3b9a85096c9d3ab4da1113f4027332e10 Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Wed, 3 Jan 2024 14:33:38 -0800 Subject: [PATCH 09/23] More clean up after merge Signed-off-by: Andrew Carbonetto --- .../src/main/java/glide/api/RedisClient.java | 17 ++++- .../java/glide/managers/CallbackManager.java | 63 ------------------- .../glide/managers/ConnectionManager.java | 14 +++-- 3 files changed, 24 insertions(+), 70 deletions(-) delete mode 100644 java/client/src/main/java/glide/managers/CallbackManager.java diff --git a/java/client/src/main/java/glide/api/RedisClient.java b/java/client/src/main/java/glide/api/RedisClient.java index dedb4df659..3995cb08d2 100644 --- a/java/client/src/main/java/glide/api/RedisClient.java +++ b/java/client/src/main/java/glide/api/RedisClient.java @@ -17,10 +17,22 @@ */ public class RedisClient extends BaseClient { + /** + * Request an async (non-blocking) Redis client in Standalone mode to a Redis service on localhost. + * + * @return a promise to connect and return a RedisClient + */ public static CompletableFuture CreateClient() { return CreateClient(RedisClientConfiguration.builder().build()); } + /** + * Request an async (non-blocking) Redis client in Standalone mode. + * + * @param host - host address of the Redis service + * @param port - port of the Redis service + * @return a promise to connect and return a RedisClient + */ public static CompletableFuture CreateClient(String host, Integer port) { RedisClientConfiguration config = RedisClientConfiguration.builder() @@ -47,6 +59,7 @@ protected static CompletableFuture CreateClient( RedisClientConfiguration config, ConnectionManager connectionManager, CommandManager commandManager) { + // TODO: Support exception throwing, including interrupted exceptions return connectionManager .connectToRedis(config) .thenApplyAsync(ignore -> new RedisClient(connectionManager, commandManager)); @@ -58,7 +71,9 @@ protected RedisClient(ConnectionManager connectionManager, CommandManager comman /** * Closes this resource, relinquishing any underlying resources. This method is invoked - * automatically on objects managed by the try-with-resources statement. see:
see: AutoCloseable::close() */ @Override diff --git a/java/client/src/main/java/glide/managers/CallbackManager.java b/java/client/src/main/java/glide/managers/CallbackManager.java deleted file mode 100644 index 5ac6af263c..0000000000 --- a/java/client/src/main/java/glide/managers/CallbackManager.java +++ /dev/null @@ -1,63 +0,0 @@ -package glide.managers; - -import java.util.Map; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicInteger; -import lombok.Getter; -import org.apache.commons.lang3.tuple.Pair; -import response.ResponseOuterClass.Response; - -/** Holder for resources required to dispatch responses and used by ReadHandler. */ -public class CallbackManager { - /** Unique request ID (callback ID). Thread-safe. */ - private final AtomicInteger requestId = new AtomicInteger(0); - - /** - * Storage of Futures to handle responses. Map key is callback id, which starts from 0. Each - * future is a promise for every submitted by user request. - */ - private final Map> responses = new ConcurrentHashMap<>(); - - /** - * Storage for connection request similar to {@link #responses}. Unfortunately, connection - * requests can't be stored in the same storage, because callback ID = 0 is hardcoded for - * connection requests. - */ - @Getter private final CompletableFuture connectionPromise = new CompletableFuture<>(); - - /** - * Register a new request to be sent. Once response received, the given future completes with it. - * - * @return A pair of unique callback ID which should set into request and a client promise for - * response. - */ - public Pair> registerRequest() { - int callbackId = requestId.incrementAndGet(); - var future = new CompletableFuture(); - responses.put(callbackId, future); - return Pair.of(callbackId, future); - } - - /** - * Complete the corresponding client promise and free resources. - * - * @param response A response received - */ - public void completeRequest(Response response) { - int callbackId = response.getCallbackIdx(); - if (callbackId == 0) { - connectionPromise.completeAsync(() -> response); - } else { - responses.get(callbackId).completeAsync(() -> response); - responses.remove(callbackId); - } - } - - public void shutdownGracefully() { - connectionPromise.completeExceptionally(new InterruptedException()); - responses.forEach( - (callbackId, future) -> future.completeExceptionally(new InterruptedException())); - responses.clear(); - } -} diff --git a/java/client/src/main/java/glide/managers/ConnectionManager.java b/java/client/src/main/java/glide/managers/ConnectionManager.java index 82644e3c66..7a884009ab 100644 --- a/java/client/src/main/java/glide/managers/ConnectionManager.java +++ b/java/client/src/main/java/glide/managers/ConnectionManager.java @@ -167,15 +167,17 @@ private Void checkGlideRsResponse(Response response) { String.format( "%s: %s", response.getRequestError().getType(), response.getRequestError().getMessage())); - } else if (response.hasClosingError()) { + } + if (response.hasClosingError()) { throw new RuntimeException("Connection closed: " + response.getClosingError()); - } else if (response.hasConstantResponse()) { - return null; - } else if (response.hasRespPointer()) { + } + if (response.hasRespPointer()) { throw new RuntimeException("Unexpected data in response"); } - // throw new IllegalStateException("A malformed response received: " + response.toString()); - return null; + if (response.hasConstantResponse()) { + return null; + } + throw new RuntimeException("Connection response expects an OK response"); } /** Close the connection and the corresponding channel. */ From 1e1842c3b502795f8f42957be961f3815edb2a17 Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Wed, 3 Jan 2024 16:00:33 -0800 Subject: [PATCH 10/23] Fix failed connection test Signed-off-by: Andrew Carbonetto --- .../glide/managers/ConnectionManager.java | 1 + .../glide/managers/ConnectionManagerTest.java | 25 ++++++++----------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/java/client/src/main/java/glide/managers/ConnectionManager.java b/java/client/src/main/java/glide/managers/ConnectionManager.java index 7a884009ab..964d60ebea 100644 --- a/java/client/src/main/java/glide/managers/ConnectionManager.java +++ b/java/client/src/main/java/glide/managers/ConnectionManager.java @@ -175,6 +175,7 @@ private Void checkGlideRsResponse(Response response) { throw new RuntimeException("Unexpected data in response"); } if (response.hasConstantResponse()) { + // successful connection response has an "OK" return null; } throw new RuntimeException("Connection response expects an OK response"); diff --git a/java/client/src/test/java/glide/managers/ConnectionManagerTest.java b/java/client/src/test/java/glide/managers/ConnectionManagerTest.java index ee11eb1285..790954fbbd 100644 --- a/java/client/src/test/java/glide/managers/ConnectionManagerTest.java +++ b/java/client/src/test/java/glide/managers/ConnectionManagerTest.java @@ -2,6 +2,7 @@ import static glide.api.models.configuration.NodeAddress.DEFAULT_HOST; import static glide.api.models.configuration.NodeAddress.DEFAULT_PORT; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -179,7 +180,7 @@ public void ConnectionRequestProtobufGeneration_RedisClientAllFieldsSet_returns( } @Test - public void DoubleConnection_successfullyReturns() + public void onConnection_emptyResponse_throwsRuntimeException() throws ExecutionException, InterruptedException { // setup RedisClientConfiguration redisClientConfiguration = RedisClientConfiguration.builder().build(); @@ -189,20 +190,14 @@ public void DoubleConnection_successfullyReturns() // execute when(channel.connect(any())).thenReturn(completedFuture); - CompletableFuture result1 = connectionManager.connectToRedis(redisClientConfiguration); - - // verify - assertNull(result1.get()); - verify(channel).connect(any()); - - // TODO: what is the expected behaviour if we send a different configuration on the second call - - // execute - CompletableFuture result2 = connectionManager.connectToRedis(redisClientConfiguration); - - // verify - assertNull(result2.get()); - verify(channel, new Times(2)).connect(any()); + ExecutionException executionException = assertThrows( + ExecutionException.class, + () -> connectionManager.connectToRedis(redisClientConfiguration).get()); + + assertTrue(executionException.getCause() instanceof RuntimeException); + assertEquals( + "Connection response expects an OK response", + executionException.getCause().getMessage()); } @Test From 26dd3642f9adec546fdab4eb99f0c1632a226aa3 Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Wed, 3 Jan 2024 16:01:00 -0800 Subject: [PATCH 11/23] Spotless fix Signed-off-by: Andrew Carbonetto --- java/client/src/main/java/glide/api/RedisClient.java | 3 ++- .../java/glide/managers/ConnectionManagerTest.java | 11 +++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/java/client/src/main/java/glide/api/RedisClient.java b/java/client/src/main/java/glide/api/RedisClient.java index 3995cb08d2..84d33b2225 100644 --- a/java/client/src/main/java/glide/api/RedisClient.java +++ b/java/client/src/main/java/glide/api/RedisClient.java @@ -18,7 +18,8 @@ public class RedisClient extends BaseClient { /** - * Request an async (non-blocking) Redis client in Standalone mode to a Redis service on localhost. + * Request an async (non-blocking) Redis client in Standalone mode to a Redis service on + * localhost. * * @return a promise to connect and return a RedisClient */ diff --git a/java/client/src/test/java/glide/managers/ConnectionManagerTest.java b/java/client/src/test/java/glide/managers/ConnectionManagerTest.java index 790954fbbd..3a5460a01a 100644 --- a/java/client/src/test/java/glide/managers/ConnectionManagerTest.java +++ b/java/client/src/test/java/glide/managers/ConnectionManagerTest.java @@ -27,7 +27,6 @@ import java.util.concurrent.ExecutionException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.internal.verification.Times; import response.ResponseOuterClass; import response.ResponseOuterClass.Response; @@ -190,14 +189,14 @@ public void onConnection_emptyResponse_throwsRuntimeException() // execute when(channel.connect(any())).thenReturn(completedFuture); - ExecutionException executionException = assertThrows( - ExecutionException.class, - () -> connectionManager.connectToRedis(redisClientConfiguration).get()); + ExecutionException executionException = + assertThrows( + ExecutionException.class, + () -> connectionManager.connectToRedis(redisClientConfiguration).get()); assertTrue(executionException.getCause() instanceof RuntimeException); assertEquals( - "Connection response expects an OK response", - executionException.getCause().getMessage()); + "Connection response expects an OK response", executionException.getCause().getMessage()); } @Test From 3ae1f078b558b6203914fead0c3cf47b2dbb5c9b Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Thu, 4 Jan 2024 13:26:57 -0800 Subject: [PATCH 12/23] Update CreateClient tests Signed-off-by: Andrew Carbonetto --- .../src/main/java/glide/api/BaseClient.java | 20 +++ .../src/main/java/glide/api/RedisClient.java | 63 ++------ .../BaseClientConfiguration.java | 2 +- .../java/glide/api/RedisClientCreateTest.java | 151 +++++++----------- 4 files changed, 95 insertions(+), 141 deletions(-) diff --git a/java/client/src/main/java/glide/api/BaseClient.java b/java/client/src/main/java/glide/api/BaseClient.java index 88a42c1551..e9aa310fb1 100644 --- a/java/client/src/main/java/glide/api/BaseClient.java +++ b/java/client/src/main/java/glide/api/BaseClient.java @@ -2,6 +2,7 @@ import glide.managers.CommandManager; import glide.managers.ConnectionManager; +import java.util.concurrent.ExecutionException; import lombok.AllArgsConstructor; /** Base Client class for Redis */ @@ -10,4 +11,23 @@ public abstract class BaseClient implements AutoCloseable { protected ConnectionManager connectionManager; protected CommandManager commandManager; + + /** + * Closes this resource, relinquishing any underlying resources. This method is invoked + * automatically on objects managed by the try-with-resources statement. + * + *

see: AutoCloseable::close() + */ + @Override + public void close() throws ExecutionException { + try { + connectionManager.closeConnection().get(); + } catch (InterruptedException interruptedException) { + // AutoCloseable functions are strongly advised to avoid throwing InterruptedExceptions + // TODO: marking resources as closed: + // https://github.com/orgs/Bit-Quill/projects/4/views/6?pane=issue&itemId=48063887 + throw new RuntimeException(interruptedException); + } + } } diff --git a/java/client/src/main/java/glide/api/RedisClient.java b/java/client/src/main/java/glide/api/RedisClient.java index 84d33b2225..6398eced96 100644 --- a/java/client/src/main/java/glide/api/RedisClient.java +++ b/java/client/src/main/java/glide/api/RedisClient.java @@ -27,21 +27,6 @@ public static CompletableFuture CreateClient() { return CreateClient(RedisClientConfiguration.builder().build()); } - /** - * Request an async (non-blocking) Redis client in Standalone mode. - * - * @param host - host address of the Redis service - * @param port - port of the Redis service - * @return a promise to connect and return a RedisClient - */ - public static CompletableFuture CreateClient(String host, Integer port) { - RedisClientConfiguration config = - RedisClientConfiguration.builder() - .address(NodeAddress.builder().host(host).port(port).build()) - .build(); - return CreateClient(config); - } - /** * Request an async (non-blocking) Redis client in Standalone mode. * @@ -49,43 +34,29 @@ public static CompletableFuture CreateClient(String host, Integer p * @return a promise to connect and return a RedisClient */ public static CompletableFuture CreateClient(RedisClientConfiguration config) { - CallbackDispatcher callbackDispatcher = new CallbackDispatcher(); - ChannelHandler channelHandler = new ChannelHandler(callbackDispatcher, getSocket()); - var connectionManager = new ConnectionManager(channelHandler); - var commandManager = new CommandManager(channelHandler); - return CreateClient(config, connectionManager, commandManager); - } - - protected static CompletableFuture CreateClient( - RedisClientConfiguration config, - ConnectionManager connectionManager, - CommandManager commandManager) { + ChannelHandler channelHandler = buildChannelHandler(); + ConnectionManager connectionManager = buildConnectionManager(channelHandler); + CommandManager commandManager = buildCommandManager(channelHandler); // TODO: Support exception throwing, including interrupted exceptions return connectionManager .connectToRedis(config) - .thenApplyAsync(ignore -> new RedisClient(connectionManager, commandManager)); + .thenApply(ignore -> new RedisClient(connectionManager, commandManager)); } - protected RedisClient(ConnectionManager connectionManager, CommandManager commandManager) { - super(connectionManager, commandManager); + protected static ChannelHandler buildChannelHandler() { + CallbackDispatcher callbackDispatcher = new CallbackDispatcher(); + return new ChannelHandler(callbackDispatcher, getSocket()); } - /** - * Closes this resource, relinquishing any underlying resources. This method is invoked - * automatically on objects managed by the try-with-resources statement. - * - *

see: AutoCloseable::close() - */ - @Override - public void close() throws ExecutionException { - try { - connectionManager.closeConnection().get(); - } catch (InterruptedException interruptedException) { - // AutoCloseable functions are strongly advised to avoid throwing InterruptedExceptions - // TODO: marking resources as closed: - // https://github.com/orgs/Bit-Quill/projects/4/views/6?pane=issue&itemId=48063887 - throw new RuntimeException(interruptedException); - } + protected static ConnectionManager buildConnectionManager(ChannelHandler channelHandler) { + return new ConnectionManager(channelHandler); + } + + protected static CommandManager buildCommandManager(ChannelHandler channelHandler) { + return new CommandManager(channelHandler); + } + + protected RedisClient(ConnectionManager connectionManager, CommandManager commandManager) { + super(connectionManager, commandManager); } } diff --git a/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java b/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java index b131b0e4cc..0d3ded8ce0 100644 --- a/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java +++ b/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java @@ -27,7 +27,7 @@ public abstract class BaseClientConfiguration { /** True if communication with the cluster should use Transport Level Security. */ @Builder.Default private final boolean useTLS = false; - /** If not set, `PRIMARY` will be used. */ + /** Represents the client's read from strategy. */ @NonNull @Builder.Default private final ReadFrom readFrom = ReadFrom.PRIMARY; /** diff --git a/java/client/src/test/java/glide/api/RedisClientCreateTest.java b/java/client/src/test/java/glide/api/RedisClientCreateTest.java index 65e52716b6..e906f0d574 100644 --- a/java/client/src/test/java/glide/api/RedisClientCreateTest.java +++ b/java/client/src/test/java/glide/api/RedisClientCreateTest.java @@ -1,6 +1,9 @@ package glide.api; import static glide.api.RedisClient.CreateClient; +import static glide.api.RedisClient.buildChannelHandler; +import static glide.api.RedisClient.buildCommandManager; +import static glide.api.RedisClient.buildConnectionManager; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; @@ -10,144 +13,104 @@ import static org.mockito.Mockito.withSettings; import glide.api.models.configuration.RedisClientConfiguration; +import glide.connectors.handlers.ChannelHandler; import glide.ffi.resolvers.SocketListenerResolver; import glide.managers.CommandManager; import glide.managers.ConnectionManager; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import lombok.SneakyThrows; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; import org.mockito.Mockito; public class RedisClientCreateTest { - @Test - @SneakyThrows - public void createClient_withConfig_successfullyReturnsRedisClient() { - try (MockedStatic mockedClient = Mockito.mockStatic(RedisClient.class); - MockedStatic mockedSocketListener = - Mockito.mockStatic(SocketListenerResolver.class)) { - - // setup - CompletableFuture testFuture = new CompletableFuture<>(); - RedisClientConfiguration config = RedisClientConfiguration.builder().build(); + private MockedStatic mockedClient; + private ChannelHandler channelHandler; + private ConnectionManager connectionManager; + private CommandManager commandManager; - mockedSocketListener.when(SocketListenerResolver::getSocket).thenReturn("test_socket"); - mockedClient.when(() -> CreateClient(any(), any(), any())).thenReturn(testFuture); + @BeforeEach + public void init() { + mockedClient = Mockito.mockStatic(RedisClient.class); - // method under test - mockedClient.when(() -> CreateClient(config)).thenCallRealMethod(); + channelHandler = mock(ChannelHandler.class); + commandManager = mock(CommandManager.class); + connectionManager = mock(ConnectionManager.class); - // exercise - CompletableFuture result = CreateClient(config); - - // verify - mockedClient.verify(() -> CreateClient(any(), any(), any())); - assertEquals(testFuture, result); - } + mockedClient.when(RedisClient::buildChannelHandler).thenReturn(channelHandler); + mockedClient.when(() -> buildConnectionManager(channelHandler)).thenReturn(connectionManager); + mockedClient.when(() -> buildCommandManager(channelHandler)).thenReturn(commandManager); } - @Test - @SneakyThrows - public void createClient_noArgs_successfullyReturnsRedisClient() { - try (MockedStatic mockedClient = - Mockito.mockStatic(RedisClient.class, withSettings().verboseLogging()); - MockedStatic mockedSocketListener = - Mockito.mockStatic(SocketListenerResolver.class, withSettings().verboseLogging())) { - - // setup - mockedSocketListener.when(SocketListenerResolver::getSocket).thenReturn("test_socket"); - CompletableFuture testFuture = new CompletableFuture<>(); - mockedClient.when(() -> CreateClient(any(), any(), any())).thenReturn(testFuture); - - // method under test - mockedClient.when(RedisClient::CreateClient).thenCallRealMethod(); - mockedClient.when(() -> CreateClient(any())).thenCallRealMethod(); - - // exercise - CompletableFuture result = CreateClient(); - - // verify - assertEquals(testFuture, result); - } + public void teardown() { + mockedClient.clearInvocations(); } @Test @SneakyThrows - public void createClient_withHostPort_successfullyReturnsRedisClient() { - try (MockedStatic mockedClient = - Mockito.mockStatic(RedisClient.class, withSettings().verboseLogging()); - MockedStatic mockedSocketListener = - Mockito.mockStatic(SocketListenerResolver.class, withSettings().verboseLogging())) { - - // setup - String host = "testhost"; - int port = 999; - - mockedSocketListener.when(SocketListenerResolver::getSocket).thenReturn("test_socket"); - CompletableFuture testFuture = new CompletableFuture<>(); - mockedClient.when(() -> CreateClient(any())).thenReturn(testFuture); - - // method under test - mockedClient.when(RedisClient::CreateClient).thenCallRealMethod(); - mockedClient.when(() -> CreateClient(host, port)).thenCallRealMethod(); - - // exercise - CompletableFuture result = CreateClient(); - - // verify - assertEquals(testFuture, result); - } + public void createClient_withConfig_successfullyReturnsRedisClient() { + + // setup + CompletableFuture connectToRedisFuture = new CompletableFuture<>(); + connectToRedisFuture.complete(null); + RedisClientConfiguration config = RedisClientConfiguration.builder().build(); + + when(connectionManager.connectToRedis(eq(config))).thenReturn(connectToRedisFuture); + + // exercise + mockedClient.when(() -> CreateClient(config)).thenCallRealMethod(); + CompletableFuture result = CreateClient(config); + RedisClient client = result.get(); + + // verify + assertEquals(connectionManager, client.connectionManager); + assertEquals(commandManager, client.commandManager); } - @SneakyThrows @Test - public void createClient_successfulConnectionReturnsRedisClient() { - + @SneakyThrows + public void createClient_noArgs_successfullyReturnsRedisClient() { // setup - ConnectionManager connectionManager = mock(ConnectionManager.class); - CommandManager commandManager = mock(CommandManager.class); - RedisClientConfiguration configuration = RedisClientConfiguration.builder().build(); - CompletableFuture connectionFuture = new CompletableFuture<>(); - connectionFuture.complete(null); - when(connectionManager.connectToRedis(eq(configuration))).thenReturn(connectionFuture); + CompletableFuture connectToRedisFuture = new CompletableFuture<>(); + connectToRedisFuture.complete(null); + RedisClientConfiguration config = RedisClientConfiguration.builder().build(); + + when(connectionManager.connectToRedis(eq(config))).thenReturn(connectToRedisFuture); // exercise - CompletableFuture response = - RedisClient.CreateClient(configuration, connectionManager, commandManager); - RedisClient client = response.get(); + mockedClient.when(() -> CreateClient()).thenCallRealMethod(); + mockedClient.when(() -> CreateClient(config)).thenCallRealMethod(); + CompletableFuture result = CreateClient(config); + RedisClient client = result.get(); // verify assertEquals(connectionManager, client.connectionManager); assertEquals(commandManager, client.commandManager); - - // teardown } @SneakyThrows @Test public void createClient_errorOnConnectionThrowsExecutionException() { - // setup - ConnectionManager connectionManager = mock(ConnectionManager.class); - CommandManager commandManager = mock(CommandManager.class); - RedisClientConfiguration configuration = RedisClientConfiguration.builder().build(); - CompletableFuture connectionFuture = new CompletableFuture<>(); + CompletableFuture connectToRedisFuture = new CompletableFuture<>(); RuntimeException exception = new RuntimeException("disconnected"); - connectionFuture.completeExceptionally(exception); - when(connectionManager.connectToRedis(eq(configuration))).thenReturn(connectionFuture); + connectToRedisFuture.completeExceptionally(exception); + RedisClientConfiguration config = RedisClientConfiguration.builder().build(); + + when(connectionManager.connectToRedis(eq(config))).thenReturn(connectToRedisFuture); // exercise - CompletableFuture response = - RedisClient.CreateClient(configuration, connectionManager, commandManager); + mockedClient.when(() -> CreateClient()).thenCallRealMethod(); + mockedClient.when(() -> CreateClient(config)).thenCallRealMethod(); + CompletableFuture result = CreateClient(config); ExecutionException executionException = - assertThrows(ExecutionException.class, () -> response.get()); + assertThrows(ExecutionException.class, () -> result.get()); // verify assertEquals(exception, executionException.getCause()); - - // teardown } } From 098122f01bfc89f03fa31bf4d3a1d26f2ec8da6b Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Thu, 4 Jan 2024 16:59:19 -0800 Subject: [PATCH 13/23] Clean up tests and some minor comments Signed-off-by: Andrew Carbonetto --- .../src/main/java/glide/api/RedisClient.java | 2 -- .../ffi/resolvers/RedisValueResolver.java | 1 + .../ffi/resolvers/SocketListenerResolver.java | 1 + .../java/glide/api/RedisClientCreateTest.java | 18 +++++------ .../glide/managers/ConnectionManagerTest.java | 31 +++++-------------- 5 files changed, 17 insertions(+), 36 deletions(-) diff --git a/java/client/src/main/java/glide/api/RedisClient.java b/java/client/src/main/java/glide/api/RedisClient.java index 6398eced96..ad1830a1d6 100644 --- a/java/client/src/main/java/glide/api/RedisClient.java +++ b/java/client/src/main/java/glide/api/RedisClient.java @@ -2,14 +2,12 @@ import static glide.ffi.resolvers.SocketListenerResolver.getSocket; -import glide.api.models.configuration.NodeAddress; import glide.api.models.configuration.RedisClientConfiguration; import glide.connectors.handlers.CallbackDispatcher; import glide.connectors.handlers.ChannelHandler; import glide.managers.CommandManager; import glide.managers.ConnectionManager; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; /** * Async (non-blocking) client for Redis in Standalone mode. Use {@link #CreateClient()} to request diff --git a/java/client/src/main/java/glide/ffi/resolvers/RedisValueResolver.java b/java/client/src/main/java/glide/ffi/resolvers/RedisValueResolver.java index 0ab5f0a4ca..c7afbda563 100644 --- a/java/client/src/main/java/glide/ffi/resolvers/RedisValueResolver.java +++ b/java/client/src/main/java/glide/ffi/resolvers/RedisValueResolver.java @@ -4,6 +4,7 @@ public class RedisValueResolver { + // TODO: consider lazy loading the glide_rs library static { System.loadLibrary("glide_rs"); } diff --git a/java/client/src/main/java/glide/ffi/resolvers/SocketListenerResolver.java b/java/client/src/main/java/glide/ffi/resolvers/SocketListenerResolver.java index ba4ed4c327..2c8312396c 100644 --- a/java/client/src/main/java/glide/ffi/resolvers/SocketListenerResolver.java +++ b/java/client/src/main/java/glide/ffi/resolvers/SocketListenerResolver.java @@ -5,6 +5,7 @@ public class SocketListenerResolver { /** Make an FFI call to Glide to open a UDS socket to connect to. */ private static native String startSocketListener() throws Exception; + // TODO: consider lazy loading the glide_rs library static { System.loadLibrary("glide_rs"); } diff --git a/java/client/src/test/java/glide/api/RedisClientCreateTest.java b/java/client/src/test/java/glide/api/RedisClientCreateTest.java index e906f0d574..a29c4ebff7 100644 --- a/java/client/src/test/java/glide/api/RedisClientCreateTest.java +++ b/java/client/src/test/java/glide/api/RedisClientCreateTest.java @@ -1,25 +1,22 @@ package glide.api; import static glide.api.RedisClient.CreateClient; -import static glide.api.RedisClient.buildChannelHandler; import static glide.api.RedisClient.buildCommandManager; import static glide.api.RedisClient.buildConnectionManager; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import static org.mockito.Mockito.withSettings; import glide.api.models.configuration.RedisClientConfiguration; import glide.connectors.handlers.ChannelHandler; -import glide.ffi.resolvers.SocketListenerResolver; import glide.managers.CommandManager; import glide.managers.ConnectionManager; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import lombok.SneakyThrows; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; @@ -45,8 +42,9 @@ public void init() { mockedClient.when(() -> buildCommandManager(channelHandler)).thenReturn(commandManager); } + @AfterEach public void teardown() { - mockedClient.clearInvocations(); + mockedClient.close(); } @Test @@ -59,9 +57,9 @@ public void createClient_withConfig_successfullyReturnsRedisClient() { RedisClientConfiguration config = RedisClientConfiguration.builder().build(); when(connectionManager.connectToRedis(eq(config))).thenReturn(connectToRedisFuture); + mockedClient.when(() -> CreateClient(config)).thenCallRealMethod(); // exercise - mockedClient.when(() -> CreateClient(config)).thenCallRealMethod(); CompletableFuture result = CreateClient(config); RedisClient client = result.get(); @@ -79,10 +77,10 @@ public void createClient_noArgs_successfullyReturnsRedisClient() { RedisClientConfiguration config = RedisClientConfiguration.builder().build(); when(connectionManager.connectToRedis(eq(config))).thenReturn(connectToRedisFuture); - - // exercise mockedClient.when(() -> CreateClient()).thenCallRealMethod(); mockedClient.when(() -> CreateClient(config)).thenCallRealMethod(); + + // exercise CompletableFuture result = CreateClient(config); RedisClient client = result.get(); @@ -101,10 +99,10 @@ public void createClient_errorOnConnectionThrowsExecutionException() { RedisClientConfiguration config = RedisClientConfiguration.builder().build(); when(connectionManager.connectToRedis(eq(config))).thenReturn(connectToRedisFuture); - - // exercise mockedClient.when(() -> CreateClient()).thenCallRealMethod(); mockedClient.when(() -> CreateClient(config)).thenCallRealMethod(); + + // exercise CompletableFuture result = CreateClient(config); ExecutionException executionException = diff --git a/java/client/src/test/java/glide/managers/ConnectionManagerTest.java b/java/client/src/test/java/glide/managers/ConnectionManagerTest.java index 3a5460a01a..525c93372c 100644 --- a/java/client/src/test/java/glide/managers/ConnectionManagerTest.java +++ b/java/client/src/test/java/glide/managers/ConnectionManagerTest.java @@ -25,6 +25,7 @@ import glide.connectors.handlers.ChannelHandler; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import lombok.SneakyThrows; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import response.ResponseOuterClass; @@ -199,8 +200,9 @@ public void onConnection_emptyResponse_throwsRuntimeException() "Connection response expects an OK response", executionException.getCause().getMessage()); } + @SneakyThrows @Test - public void CloseConnection() throws ExecutionException, InterruptedException { + public void CloseConnection_closesChannels() { // setup RedisClientConfiguration redisClientConfiguration = RedisClientConfiguration.builder().build(); CompletableFuture completedFuture = new CompletableFuture<>(); @@ -222,9 +224,9 @@ public void CloseConnection() throws ExecutionException, InterruptedException { verify(channel).close(); } + @SneakyThrows @Test - public void CheckBabushkaResponse_ConstantResponse_returnsSuccessfully() - throws ExecutionException, InterruptedException { + public void CheckRedisResponse_ConstantResponse_returnsSuccessfully() { // setup RedisClientConfiguration redisClientConfiguration = RedisClientConfiguration.builder().build(); CompletableFuture completedFuture = new CompletableFuture<>(); @@ -242,7 +244,7 @@ public void CheckBabushkaResponse_ConstantResponse_returnsSuccessfully() } @Test - public void CheckBabushkaResponse_RequestError_throwsRuntimeException() { + public void CheckRedisResponse_RequestError_throwsRuntimeException() { // setup RedisClientConfiguration redisClientConfiguration = RedisClientConfiguration.builder().build(); CompletableFuture completedFuture = new CompletableFuture<>(); @@ -266,26 +268,7 @@ public void CheckBabushkaResponse_RequestError_throwsRuntimeException() { } @Test - public void CheckBabushkaResponse_RespPointer_throwsRuntimeException() - throws ExecutionException, InterruptedException { - // setup - RedisClientConfiguration redisClientConfiguration = RedisClientConfiguration.builder().build(); - CompletableFuture completedFuture = new CompletableFuture<>(); - Response response = Response.newBuilder().setRespPointer(1).build(); - completedFuture.complete(response); - - // execute - when(channel.connect(any())).thenReturn(completedFuture); - CompletableFuture result = connectionManager.connectToRedis(redisClientConfiguration); - - // verify - ExecutionException exception = assertThrows(ExecutionException.class, result::get); - assertTrue(exception.getCause() instanceof RuntimeException); - } - - @Test - public void CheckBabushkaResponse_ClosingError_throwsRuntimeException() - throws ExecutionException, InterruptedException { + public void CheckRedisResponse_ClosingError_throwsRuntimeException() { // setup RedisClientConfiguration redisClientConfiguration = RedisClientConfiguration.builder().build(); CompletableFuture completedFuture = new CompletableFuture<>(); From 76b5cd774e26379988cc32037bb5ad75c3e06b6b Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Fri, 5 Jan 2024 05:14:37 -0800 Subject: [PATCH 14/23] Cleaning up tests and adding TODOs Signed-off-by: Andrew Carbonetto --- .../src/main/java/glide/api/RedisClient.java | 4 ++-- .../java/glide/api/RedisClientCreateTest.java | 1 + .../glide/managers/ConnectionManagerTest.java | 15 +++++++-------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/java/client/src/main/java/glide/api/RedisClient.java b/java/client/src/main/java/glide/api/RedisClient.java index ad1830a1d6..1bb726fa69 100644 --- a/java/client/src/main/java/glide/api/RedisClient.java +++ b/java/client/src/main/java/glide/api/RedisClient.java @@ -19,7 +19,7 @@ public class RedisClient extends BaseClient { * Request an async (non-blocking) Redis client in Standalone mode to a Redis service on * localhost. * - * @return a promise to connect and return a RedisClient + * @return a Future to connect and return a RedisClient */ public static CompletableFuture CreateClient() { return CreateClient(RedisClientConfiguration.builder().build()); @@ -29,7 +29,7 @@ public static CompletableFuture CreateClient() { * Request an async (non-blocking) Redis client in Standalone mode. * * @param config - Redis Client Configuration - * @return a promise to connect and return a RedisClient + * @return a Future to connect and return a RedisClient */ public static CompletableFuture CreateClient(RedisClientConfiguration config) { ChannelHandler channelHandler = buildChannelHandler(); diff --git a/java/client/src/test/java/glide/api/RedisClientCreateTest.java b/java/client/src/test/java/glide/api/RedisClientCreateTest.java index a29c4ebff7..d294df0511 100644 --- a/java/client/src/test/java/glide/api/RedisClientCreateTest.java +++ b/java/client/src/test/java/glide/api/RedisClientCreateTest.java @@ -94,6 +94,7 @@ public void createClient_noArgs_successfullyReturnsRedisClient() { public void createClient_errorOnConnectionThrowsExecutionException() { // setup CompletableFuture connectToRedisFuture = new CompletableFuture<>(); + // TODO: return a RedisException, not a RuntimeException RuntimeException exception = new RuntimeException("disconnected"); connectToRedisFuture.completeExceptionally(exception); RedisClientConfiguration config = RedisClientConfiguration.builder().build(); diff --git a/java/client/src/test/java/glide/managers/ConnectionManagerTest.java b/java/client/src/test/java/glide/managers/ConnectionManagerTest.java index 525c93372c..0a56278b94 100644 --- a/java/client/src/test/java/glide/managers/ConnectionManagerTest.java +++ b/java/client/src/test/java/glide/managers/ConnectionManagerTest.java @@ -56,9 +56,9 @@ public void setUp() { connectionManager = new ConnectionManager(channel); } + @SneakyThrows @Test - public void ConnectionRequestProtobufGeneration_DefaultRedisClientConfiguration_returns() - throws ExecutionException, InterruptedException { + public void ConnectionRequestProtobufGeneration_DefaultRedisClientConfiguration_returns() { // setup RedisClientConfiguration redisClientConfiguration = RedisClientConfiguration.builder().build(); ConnectionRequest expectedProtobufConnectionRequest = @@ -87,9 +87,9 @@ public void ConnectionRequestProtobufGeneration_DefaultRedisClientConfiguration_ verify(channel).connect(eq(expectedProtobufConnectionRequest)); } + @SneakyThrows @Test - public void ConnectionRequestProtobufGeneration_DefaultRedisClusterClientConfiguration_returns() - throws ExecutionException, InterruptedException { + public void ConnectionRequestProtobufGeneration_DefaultRedisClusterClientConfiguration_returns() { // setup RedisClusterClientConfiguration redisClusterClientConfiguration = RedisClusterClientConfiguration.builder().build(); @@ -119,9 +119,9 @@ public void ConnectionRequestProtobufGeneration_DefaultRedisClusterClientConfigu verify(channel).connect(eq(expectedProtobufConnectionRequest)); } + @SneakyThrows @Test - public void ConnectionRequestProtobufGeneration_RedisClientAllFieldsSet_returns() - throws ExecutionException, InterruptedException { + public void ConnectionRequestProtobufGeneration_RedisClientAllFieldsSet_returns() { // setup RedisClientConfiguration redisClientConfiguration = RedisClientConfiguration.builder() @@ -180,8 +180,7 @@ public void ConnectionRequestProtobufGeneration_RedisClientAllFieldsSet_returns( } @Test - public void onConnection_emptyResponse_throwsRuntimeException() - throws ExecutionException, InterruptedException { + public void onConnection_emptyResponse_throwsRuntimeException() { // setup RedisClientConfiguration redisClientConfiguration = RedisClientConfiguration.builder().build(); CompletableFuture completedFuture = new CompletableFuture<>(); From 8092b625afffd81bb4a435390fd5f81068a1138b Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Mon, 8 Jan 2024 09:41:41 -0800 Subject: [PATCH 15/23] Revert lib.rs change Signed-off-by: Andrew Carbonetto --- java/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/src/lib.rs b/java/src/lib.rs index 0a0a19c43b..31372c46b5 100644 --- a/java/src/lib.rs +++ b/java/src/lib.rs @@ -100,4 +100,4 @@ fn throw_java_exception(mut env: JNIEnv, message: String) { ); } }; -} \ No newline at end of file +} From 30a8d644d68de3c8999284cf95e97b3f9ea23e57 Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Mon, 8 Jan 2024 10:57:06 -0800 Subject: [PATCH 16/23] Add comment to make connectionManager static Signed-off-by: Andrew Carbonetto --- .../client/src/main/java/glide/managers/ConnectionManager.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/java/client/src/main/java/glide/managers/ConnectionManager.java b/java/client/src/main/java/glide/managers/ConnectionManager.java index 964d60ebea..0a77855181 100644 --- a/java/client/src/main/java/glide/managers/ConnectionManager.java +++ b/java/client/src/main/java/glide/managers/ConnectionManager.java @@ -22,6 +22,8 @@ @RequiredArgsConstructor public class ConnectionManager { + // TODO: consider making connection manager static, and moving the ChannelHandler to the RedisClient. + /** UDS connection representation. */ private final ChannelHandler channel; @@ -172,6 +174,7 @@ private Void checkGlideRsResponse(Response response) { throw new RuntimeException("Connection closed: " + response.getClosingError()); } if (response.hasRespPointer()) { + // TODO: throw ClosingException and close/cancel all existing responses throw new RuntimeException("Unexpected data in response"); } if (response.hasConstantResponse()) { From 6f1e3daaf1ed4a2549ea362492c46f488c5bc382 Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Tue, 9 Jan 2024 17:43:27 -0800 Subject: [PATCH 17/23] Spotless Signed-off-by: Andrew Carbonetto --- .../client/src/main/java/glide/managers/ConnectionManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java/client/src/main/java/glide/managers/ConnectionManager.java b/java/client/src/main/java/glide/managers/ConnectionManager.java index 0a77855181..20d31723e6 100644 --- a/java/client/src/main/java/glide/managers/ConnectionManager.java +++ b/java/client/src/main/java/glide/managers/ConnectionManager.java @@ -22,7 +22,8 @@ @RequiredArgsConstructor public class ConnectionManager { - // TODO: consider making connection manager static, and moving the ChannelHandler to the RedisClient. + // TODO: consider making connection manager static, and moving the ChannelHandler to the + // RedisClient. /** UDS connection representation. */ private final ChannelHandler channel; From 818a704b7b76594958c1d04c77aaba1b5ffd914c Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Tue, 9 Jan 2024 18:20:07 -0800 Subject: [PATCH 18/23] Apply default test name replacer Signed-off-by: Andrew Carbonetto --- java/client/src/test/resources/junit-platform.properties | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 java/client/src/test/resources/junit-platform.properties diff --git a/java/client/src/test/resources/junit-platform.properties b/java/client/src/test/resources/junit-platform.properties new file mode 100644 index 0000000000..3249fb3c49 --- /dev/null +++ b/java/client/src/test/resources/junit-platform.properties @@ -0,0 +1,2 @@ +junit.jupiter.displayname.generator.default = \ + org.junit.jupiter.api.DisplayNameGenerator$ReplaceUnderscores From 8546d9f24e843f363dd220f03cb5c9e6bbcd3902 Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Sun, 7 Jan 2024 22:39:56 -0800 Subject: [PATCH 19/23] Update comments from review comments Signed-off-by: Andrew Carbonetto --- .../src/main/java/glide/api/BaseClient.java | 2 +- .../src/main/java/glide/api/RedisClient.java | 3 +- .../models/configuration/BackoffStrategy.java | 8 +++-- .../BaseClientConfiguration.java | 12 +++++-- .../connectors/handlers/ChannelHandler.java | 36 +++++++++++++------ .../connectors/handlers/ReadHandler.java | 10 ++++-- .../glide/managers/ConnectionManager.java | 16 +++++---- 7 files changed, 58 insertions(+), 29 deletions(-) diff --git a/java/client/src/main/java/glide/api/BaseClient.java b/java/client/src/main/java/glide/api/BaseClient.java index e9aa310fb1..6751768c8a 100644 --- a/java/client/src/main/java/glide/api/BaseClient.java +++ b/java/client/src/main/java/glide/api/BaseClient.java @@ -24,7 +24,7 @@ public void close() throws ExecutionException { try { connectionManager.closeConnection().get(); } catch (InterruptedException interruptedException) { - // AutoCloseable functions are strongly advised to avoid throwing InterruptedExceptions + // AutoCloseable classes are strongly advised to avoid throwing InterruptedExceptions // TODO: marking resources as closed: // https://github.com/orgs/Bit-Quill/projects/4/views/6?pane=issue&itemId=48063887 throw new RuntimeException(interruptedException); diff --git a/java/client/src/main/java/glide/api/RedisClient.java b/java/client/src/main/java/glide/api/RedisClient.java index 1bb726fa69..eb4192bd9d 100644 --- a/java/client/src/main/java/glide/api/RedisClient.java +++ b/java/client/src/main/java/glide/api/RedisClient.java @@ -16,8 +16,7 @@ public class RedisClient extends BaseClient { /** - * Request an async (non-blocking) Redis client in Standalone mode to a Redis service on - * localhost. + * Request an async (non-blocking) Redis client in Standalone mode to a Redis service. * * @return a Future to connect and return a RedisClient */ diff --git a/java/client/src/main/java/glide/api/models/configuration/BackoffStrategy.java b/java/client/src/main/java/glide/api/models/configuration/BackoffStrategy.java index 2d3aa81bb6..3a4a30acb8 100644 --- a/java/client/src/main/java/glide/api/models/configuration/BackoffStrategy.java +++ b/java/client/src/main/java/glide/api/models/configuration/BackoffStrategy.java @@ -6,8 +6,10 @@ /** * Represents the strategy used to determine how and when to reconnect, in case of connection - * failures. The time between attempts grows exponentially, to the formula rand(0 ... factor * - * (exponentBase ^ N)), where N is the number of failed attempts. Once the maximum value is reached, + * failures. The time between attempts grows exponentially, to the formula rand(0 ... factor * + * (exponentBase ^ N)), where N is the number of failed attempts. + * + * Once the maximum value is reached, * that will remain the time between retry attempts until a reconnect attempt is successful. The * client will attempt to reconnect indefinitely. */ @@ -17,7 +19,7 @@ public class BackoffStrategy { /** * Number of retry attempts that the client should perform when disconnected from the server, * where the time between retries increases. Once the retries have reached the maximum value, the - * time between + * time between retries will remain constant until a reconnect attempt is successful. */ @NonNull private final Integer numOfRetries; diff --git a/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java b/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java index 0d3ded8ce0..752a43ebd2 100644 --- a/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java +++ b/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java @@ -18,13 +18,19 @@ public abstract class BaseClientConfiguration { * DNS Addresses and ports of known nodes in the cluster. If the server is in cluster mode the * list can be partial, as the client will attempt to map out the cluster and find all nodes. If * the server is in standalone mode, only nodes whose addresses were provided will be used by the - * client. For example: [ {address:sample-address-0001.use1.cache.amazonaws.com, port:6379}, - * {address: sample-address-0002.use2.cache.amazonaws.com, port:6379} ]. If none are set, a + * client. For example: [ {address:sample-address-0001.use1.cache.amazonaws.com, port:6379}, + * {address: sample-address-0002.use2.cache.amazonaws.com, port:6379} ]. If none are set, a * default address localhost:6379 will be used. */ @Singular private final List addresses; - /** True if communication with the cluster should use Transport Level Security. */ + /** + * True if communication with the cluster should use Transport Level Security. + * + *

If the server/cluster requires TLS, not setting this will cause the connection attempt to fail. + * + *

If the server/cluster doesn't require TLS, setting this will also cause the connection attempt to fail. + */ @Builder.Default private final boolean useTLS = false; /** Represents the client's read from strategy. */ diff --git a/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java b/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java index 55464628f7..b4cffa4ccd 100644 --- a/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java +++ b/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java @@ -5,7 +5,11 @@ import glide.connectors.resources.ThreadPoolAllocator; import io.netty.bootstrap.Bootstrap; import io.netty.channel.Channel; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.EventLoopGroup; import io.netty.channel.unix.DomainSocketAddress; +import io.netty.channel.unix.DomainSocketChannel; +import io.netty.channel.unix.UnixChannel; import java.util.Optional; import java.util.concurrent.CompletableFuture; import redis_request.RedisRequestOuterClass.RedisRequest; @@ -24,17 +28,27 @@ public class ChannelHandler { /** Open a new channel for a new client. */ public ChannelHandler(CallbackDispatcher callbackDispatcher, String socketPath) { - // TODO: add the ability to pass in group and channel from user - channel = - new Bootstrap() - // TODO let user specify the thread pool or pool size as an option - .group( - ThreadPoolAllocator.createOrGetNettyThreadPool(THREAD_POOL_NAME, Optional.empty())) - .channel(Platform.getClientUdsNettyChannelType()) - .handler(new ProtobufSocketChannelInitializer(callbackDispatcher)) - .connect(new DomainSocketAddress(socketPath)) - // TODO call here .sync() if needed or remove this comment - .channel(); + this( + ThreadPoolAllocator.createOrGetNettyThreadPool(THREAD_POOL_NAME, Optional.empty()), + Platform.getClientUdsNettyChannelType(), + new ProtobufSocketChannelInitializer(callbackDispatcher), + new DomainSocketAddress(socketPath), + callbackDispatcher + ); + } + + public ChannelHandler(EventLoopGroup eventLoopGroup, + Class domainSocketChannelClass, + ChannelInitializer channelInitializer, + DomainSocketAddress domainSocketAddress, + CallbackDispatcher callbackDispatcher) { + channel = new Bootstrap() + .group(eventLoopGroup) + .channel(domainSocketChannelClass) + .handler(channelInitializer) + .connect(domainSocketAddress) + // TODO call here .sync() if needed or remove this comment + .channel(); this.callbackDispatcher = callbackDispatcher; } diff --git a/java/client/src/main/java/glide/connectors/handlers/ReadHandler.java b/java/client/src/main/java/glide/connectors/handlers/ReadHandler.java index dee2abc1b2..36d4c60b9e 100644 --- a/java/client/src/main/java/glide/connectors/handlers/ReadHandler.java +++ b/java/client/src/main/java/glide/connectors/handlers/ReadHandler.java @@ -14,8 +14,14 @@ public class ReadHandler extends ChannelInboundHandlerAdapter { /** Submit responses from glide to an instance {@link CallbackDispatcher} to handle them. */ @Override - public void channelRead(@NonNull ChannelHandlerContext ctx, @NonNull Object msg) { - callbackDispatcher.completeRequest((Response) msg); + public void channelRead(@NonNull ChannelHandlerContext ctx, @NonNull Object msg) throws RuntimeException { + if (msg instanceof Response) { + Response response = (Response) msg; + callbackDispatcher.completeRequest(response); + ctx.fireChannelRead(msg); + return; + } + throw new RuntimeException("Unexpected message in socket"); } /** Handles uncaught exceptions from {@link #channelRead(ChannelHandlerContext, Object)}. */ diff --git a/java/client/src/main/java/glide/managers/ConnectionManager.java b/java/client/src/main/java/glide/managers/ConnectionManager.java index 20d31723e6..0f18a85545 100644 --- a/java/client/src/main/java/glide/managers/ConnectionManager.java +++ b/java/client/src/main/java/glide/managers/ConnectionManager.java @@ -4,7 +4,9 @@ import static glide.api.models.configuration.NodeAddress.DEFAULT_PORT; import connection_request.ConnectionRequestOuterClass; +import connection_request.ConnectionRequestOuterClass.AuthenticationInfo; import connection_request.ConnectionRequestOuterClass.ConnectionRequest; +import connection_request.ConnectionRequestOuterClass.TlsMode; import glide.api.models.configuration.BaseClientConfiguration; import glide.api.models.configuration.NodeAddress; import glide.api.models.configuration.ReadFrom; @@ -29,7 +31,7 @@ public class ConnectionManager { private final ChannelHandler channel; /** - * Connect to Redis using a ProtoBuf connection request. + * Make a connection request to Redis Rust-core client. * * @param configuration Connection Request Configuration */ @@ -68,7 +70,7 @@ private ConnectionRequest.Builder setupConnectionRequestBuilderBaseConfiguration if (!configuration.getAddresses().isEmpty()) { for (NodeAddress nodeAddress : configuration.getAddresses()) { connectionRequestBuilder.addAddresses( - connection_request.ConnectionRequestOuterClass.NodeAddress.newBuilder() + ConnectionRequestOuterClass.NodeAddress.newBuilder() .setHost(nodeAddress.getHost()) .setPort(nodeAddress.getPort()) .build()); @@ -84,13 +86,13 @@ private ConnectionRequest.Builder setupConnectionRequestBuilderBaseConfiguration connectionRequestBuilder .setTlsMode( configuration.isUseTLS() - ? ConnectionRequestOuterClass.TlsMode.SecureTls - : connection_request.ConnectionRequestOuterClass.TlsMode.NoTls) + ? TlsMode.SecureTls + : TlsMode.NoTls) .setReadFrom(mapReadFromEnum(configuration.getReadFrom())); if (configuration.getCredentials() != null) { - connection_request.ConnectionRequestOuterClass.AuthenticationInfo.Builder - authenticationInfoBuilder = ConnectionRequestOuterClass.AuthenticationInfo.newBuilder(); + AuthenticationInfo.Builder + authenticationInfoBuilder = AuthenticationInfo.newBuilder(); if (configuration.getCredentials().getUsername() != null) { authenticationInfoBuilder.setUsername(configuration.getCredentials().getUsername()); } @@ -138,7 +140,7 @@ private ConnectionRequest.Builder setupConnectionRequestBuilderRedisClient( * * @param configuration */ - private connection_request.ConnectionRequestOuterClass.ConnectionRequest.Builder + private ConnectionRequestOuterClass.ConnectionRequest.Builder setupConnectionRequestBuilderRedisClusterClient( RedisClusterClientConfiguration configuration) { ConnectionRequest.Builder connectionRequestBuilder = From 31bc4c512d2a36c3f18d946c1e8879b1fa6804e1 Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Tue, 9 Jan 2024 20:24:05 -0800 Subject: [PATCH 20/23] Spotless Signed-off-by: Andrew Carbonetto --- .../models/configuration/BackoffStrategy.java | 5 ++-- .../BaseClientConfiguration.java | 6 ++-- .../connectors/handlers/ChannelHandler.java | 29 ++++++++++--------- .../connectors/handlers/ReadHandler.java | 3 +- .../glide/managers/ConnectionManager.java | 15 ++++------ 5 files changed, 28 insertions(+), 30 deletions(-) diff --git a/java/client/src/main/java/glide/api/models/configuration/BackoffStrategy.java b/java/client/src/main/java/glide/api/models/configuration/BackoffStrategy.java index 3a4a30acb8..56af5ca828 100644 --- a/java/client/src/main/java/glide/api/models/configuration/BackoffStrategy.java +++ b/java/client/src/main/java/glide/api/models/configuration/BackoffStrategy.java @@ -9,9 +9,8 @@ * failures. The time between attempts grows exponentially, to the formula rand(0 ... factor * * (exponentBase ^ N)), where N is the number of failed attempts. * - * Once the maximum value is reached, - * that will remain the time between retry attempts until a reconnect attempt is successful. The - * client will attempt to reconnect indefinitely. + *

Once the maximum value is reached, that will remain the time between retry attempts until a + * reconnect attempt is successful. The client will attempt to reconnect indefinitely. */ @Getter @Builder diff --git a/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java b/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java index 752a43ebd2..ba99a0bf7a 100644 --- a/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java +++ b/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java @@ -27,9 +27,11 @@ public abstract class BaseClientConfiguration { /** * True if communication with the cluster should use Transport Level Security. * - *

If the server/cluster requires TLS, not setting this will cause the connection attempt to fail. + *

If the server/cluster requires TLS, not setting this will cause the connection attempt to + * fail. * - *

If the server/cluster doesn't require TLS, setting this will also cause the connection attempt to fail. + *

If the server/cluster doesn't require TLS, setting this will also cause the connection + * attempt to fail. */ @Builder.Default private final boolean useTLS = false; diff --git a/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java b/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java index b4cffa4ccd..eea2a717e6 100644 --- a/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java +++ b/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java @@ -33,22 +33,23 @@ public ChannelHandler(CallbackDispatcher callbackDispatcher, String socketPath) Platform.getClientUdsNettyChannelType(), new ProtobufSocketChannelInitializer(callbackDispatcher), new DomainSocketAddress(socketPath), - callbackDispatcher - ); + callbackDispatcher); } - public ChannelHandler(EventLoopGroup eventLoopGroup, - Class domainSocketChannelClass, - ChannelInitializer channelInitializer, - DomainSocketAddress domainSocketAddress, - CallbackDispatcher callbackDispatcher) { - channel = new Bootstrap() - .group(eventLoopGroup) - .channel(domainSocketChannelClass) - .handler(channelInitializer) - .connect(domainSocketAddress) - // TODO call here .sync() if needed or remove this comment - .channel(); + public ChannelHandler( + EventLoopGroup eventLoopGroup, + Class domainSocketChannelClass, + ChannelInitializer channelInitializer, + DomainSocketAddress domainSocketAddress, + CallbackDispatcher callbackDispatcher) { + channel = + new Bootstrap() + .group(eventLoopGroup) + .channel(domainSocketChannelClass) + .handler(channelInitializer) + .connect(domainSocketAddress) + // TODO call here .sync() if needed or remove this comment + .channel(); this.callbackDispatcher = callbackDispatcher; } diff --git a/java/client/src/main/java/glide/connectors/handlers/ReadHandler.java b/java/client/src/main/java/glide/connectors/handlers/ReadHandler.java index 36d4c60b9e..deba866d33 100644 --- a/java/client/src/main/java/glide/connectors/handlers/ReadHandler.java +++ b/java/client/src/main/java/glide/connectors/handlers/ReadHandler.java @@ -14,7 +14,8 @@ public class ReadHandler extends ChannelInboundHandlerAdapter { /** Submit responses from glide to an instance {@link CallbackDispatcher} to handle them. */ @Override - public void channelRead(@NonNull ChannelHandlerContext ctx, @NonNull Object msg) throws RuntimeException { + public void channelRead(@NonNull ChannelHandlerContext ctx, @NonNull Object msg) + throws RuntimeException { if (msg instanceof Response) { Response response = (Response) msg; callbackDispatcher.completeRequest(response); diff --git a/java/client/src/main/java/glide/managers/ConnectionManager.java b/java/client/src/main/java/glide/managers/ConnectionManager.java index 0f18a85545..9171255647 100644 --- a/java/client/src/main/java/glide/managers/ConnectionManager.java +++ b/java/client/src/main/java/glide/managers/ConnectionManager.java @@ -59,7 +59,7 @@ private ConnectionRequest createConnectionRequest(BaseClientConfiguration config } /** - * Modifies ConnectionRequestBuilder, so it has appropriate fields for the BaseClientConfiguration + * Creates ConnectionRequestBuilder, so it has appropriate fields for the BaseClientConfiguration * where the Standalone/Cluster inherit from. * * @param configuration @@ -84,15 +84,11 @@ private ConnectionRequest.Builder setupConnectionRequestBuilderBaseConfiguration } connectionRequestBuilder - .setTlsMode( - configuration.isUseTLS() - ? TlsMode.SecureTls - : TlsMode.NoTls) + .setTlsMode(configuration.isUseTLS() ? TlsMode.SecureTls : TlsMode.NoTls) .setReadFrom(mapReadFromEnum(configuration.getReadFrom())); if (configuration.getCredentials() != null) { - AuthenticationInfo.Builder - authenticationInfoBuilder = AuthenticationInfo.newBuilder(); + AuthenticationInfo.Builder authenticationInfoBuilder = AuthenticationInfo.newBuilder(); if (configuration.getCredentials().getUsername() != null) { authenticationInfoBuilder.setUsername(configuration.getCredentials().getUsername()); } @@ -109,8 +105,7 @@ private ConnectionRequest.Builder setupConnectionRequestBuilderBaseConfiguration } /** - * Modifies ConnectionRequestBuilder, so it has appropriate fields for the Redis Standalone - * Client. + * Creates ConnectionRequestBuilder, so it has appropriate fields for the Redis Standalone Client. * * @param configuration Connection Request Configuration */ @@ -136,7 +131,7 @@ private ConnectionRequest.Builder setupConnectionRequestBuilderRedisClient( } /** - * Modifies ConnectionRequestBuilder, so it has appropriate fields for the Redis Cluster Client. + * Creates ConnectionRequestBuilder, so it has appropriate fields for the Redis Cluster Client. * * @param configuration */ From 9b02892ce4785cb62d6e23eb0632f7b076a58f03 Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Tue, 9 Jan 2024 20:51:40 -0800 Subject: [PATCH 21/23] Add javadoc Signed-off-by: Andrew Carbonetto --- .../java/glide/connectors/handlers/ChannelHandler.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java b/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java index eea2a717e6..bca0db87cc 100644 --- a/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java +++ b/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java @@ -36,6 +36,15 @@ public ChannelHandler(CallbackDispatcher callbackDispatcher, String socketPath) callbackDispatcher); } + /** + * Open a new channel for a new client and running it on the provided EventLoopGroup + * + * @param eventLoopGroup - ELG to run handler on + * @param domainSocketChannelClass - socket channel class for Handler + * @param channelInitializer - UnixChannel initializer + * @param domainSocketAddress - address to connect + * @param callbackDispatcher - dispatcher to handle callbacks + */ public ChannelHandler( EventLoopGroup eventLoopGroup, Class domainSocketChannelClass, From 0c7d03bb0e31a063fc9ee6d7647163b470373034 Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Thu, 11 Jan 2024 12:40:53 -0800 Subject: [PATCH 22/23] Update for comments Signed-off-by: Andrew Carbonetto --- .../src/main/java/glide/api/RedisClient.java | 11 +--------- .../BaseClientConfiguration.java | 2 +- .../java/glide/api/RedisClientCreateTest.java | 22 ------------------- 3 files changed, 2 insertions(+), 33 deletions(-) diff --git a/java/client/src/main/java/glide/api/RedisClient.java b/java/client/src/main/java/glide/api/RedisClient.java index eb4192bd9d..29e4798717 100644 --- a/java/client/src/main/java/glide/api/RedisClient.java +++ b/java/client/src/main/java/glide/api/RedisClient.java @@ -10,20 +10,11 @@ import java.util.concurrent.CompletableFuture; /** - * Async (non-blocking) client for Redis in Standalone mode. Use {@link #CreateClient()} to request + * Async (non-blocking) client for Redis in Standalone mode. Use {@link #CreateClient(RedisClientConfiguration)} to request * a client to Redis. */ public class RedisClient extends BaseClient { - /** - * Request an async (non-blocking) Redis client in Standalone mode to a Redis service. - * - * @return a Future to connect and return a RedisClient - */ - public static CompletableFuture CreateClient() { - return CreateClient(RedisClientConfiguration.builder().build()); - } - /** * Request an async (non-blocking) Redis client in Standalone mode. * diff --git a/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java b/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java index ba99a0bf7a..ac0ed07f2e 100644 --- a/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java +++ b/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java @@ -8,7 +8,7 @@ import lombok.experimental.SuperBuilder; /** - * Configuration settings class for creating a Redis Client. Shared settings for both a standalone + * Configuration settings class for creating a Redis Client. Shared settings for standalone * and cluster clients. */ @Getter diff --git a/java/client/src/test/java/glide/api/RedisClientCreateTest.java b/java/client/src/test/java/glide/api/RedisClientCreateTest.java index d294df0511..b752ad8983 100644 --- a/java/client/src/test/java/glide/api/RedisClientCreateTest.java +++ b/java/client/src/test/java/glide/api/RedisClientCreateTest.java @@ -68,27 +68,6 @@ public void createClient_withConfig_successfullyReturnsRedisClient() { assertEquals(commandManager, client.commandManager); } - @Test - @SneakyThrows - public void createClient_noArgs_successfullyReturnsRedisClient() { - // setup - CompletableFuture connectToRedisFuture = new CompletableFuture<>(); - connectToRedisFuture.complete(null); - RedisClientConfiguration config = RedisClientConfiguration.builder().build(); - - when(connectionManager.connectToRedis(eq(config))).thenReturn(connectToRedisFuture); - mockedClient.when(() -> CreateClient()).thenCallRealMethod(); - mockedClient.when(() -> CreateClient(config)).thenCallRealMethod(); - - // exercise - CompletableFuture result = CreateClient(config); - RedisClient client = result.get(); - - // verify - assertEquals(connectionManager, client.connectionManager); - assertEquals(commandManager, client.commandManager); - } - @SneakyThrows @Test public void createClient_errorOnConnectionThrowsExecutionException() { @@ -100,7 +79,6 @@ public void createClient_errorOnConnectionThrowsExecutionException() { RedisClientConfiguration config = RedisClientConfiguration.builder().build(); when(connectionManager.connectToRedis(eq(config))).thenReturn(connectToRedisFuture); - mockedClient.when(() -> CreateClient()).thenCallRealMethod(); mockedClient.when(() -> CreateClient(config)).thenCallRealMethod(); // exercise From 572fc7bb3cf950d2c1e8b55ec161f9cb45c2ec9d Mon Sep 17 00:00:00 2001 From: Andrew Carbonetto Date: Thu, 11 Jan 2024 12:41:41 -0800 Subject: [PATCH 23/23] Spotless Signed-off-by: Andrew Carbonetto --- java/client/src/main/java/glide/api/RedisClient.java | 4 ++-- .../api/models/configuration/BaseClientConfiguration.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java/client/src/main/java/glide/api/RedisClient.java b/java/client/src/main/java/glide/api/RedisClient.java index 29e4798717..642635dda3 100644 --- a/java/client/src/main/java/glide/api/RedisClient.java +++ b/java/client/src/main/java/glide/api/RedisClient.java @@ -10,8 +10,8 @@ import java.util.concurrent.CompletableFuture; /** - * Async (non-blocking) client for Redis in Standalone mode. Use {@link #CreateClient(RedisClientConfiguration)} to request - * a client to Redis. + * Async (non-blocking) client for Redis in Standalone mode. Use {@link + * #CreateClient(RedisClientConfiguration)} to request a client to Redis. */ public class RedisClient extends BaseClient { diff --git a/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java b/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java index ac0ed07f2e..a15a3ea4b2 100644 --- a/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java +++ b/java/client/src/main/java/glide/api/models/configuration/BaseClientConfiguration.java @@ -8,8 +8,8 @@ import lombok.experimental.SuperBuilder; /** - * Configuration settings class for creating a Redis Client. Shared settings for standalone - * and cluster clients. + * Configuration settings class for creating a Redis Client. Shared settings for standalone and + * cluster clients. */ @Getter @SuperBuilder