This is an automated email from the ASF dual-hosted git repository.

sanpwc pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new ad00781fce IGNITE-22828 Use human readable keys in MG 
idempotentCommandCache (#4196)
ad00781fce is described below

commit ad00781fce2c7b02aa44e128b3355779552843b1
Author: Alexander Lapin <[email protected]>
AuthorDate: Wed Aug 7 17:42:11 2024 +0300

    IGNITE-22828 Use human readable keys in MG idempotentCommandCache (#4196)
---
 .../ignite/internal/metastorage/CommandId.java     | 27 ++++++++++++++++++++++
 .../server/persistence/RocksDbKeyValueStorage.java |  7 +++---
 .../server/raft/MetaStorageWriteHandler.java       | 17 ++++++--------
 .../server/SimpleInMemoryKeyValueStorage.java      |  8 +++----
 4 files changed, 40 insertions(+), 19 deletions(-)

diff --git 
a/modules/metastorage-api/src/main/java/org/apache/ignite/internal/metastorage/CommandId.java
 
b/modules/metastorage-api/src/main/java/org/apache/ignite/internal/metastorage/CommandId.java
index db276400c4..6364cd1709 100644
--- 
a/modules/metastorage-api/src/main/java/org/apache/ignite/internal/metastorage/CommandId.java
+++ 
b/modules/metastorage-api/src/main/java/org/apache/ignite/internal/metastorage/CommandId.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.metastorage;
 import java.io.Serializable;
 import java.util.UUID;
 import org.apache.ignite.internal.metastorage.dsl.MetaStorageMessageGroup;
+import org.apache.ignite.internal.metastorage.dsl.MetaStorageMessagesFactory;
 import org.apache.ignite.internal.network.NetworkMessage;
 import org.apache.ignite.internal.network.annotations.Transferable;
 
@@ -29,7 +30,33 @@ import 
org.apache.ignite.internal.network.annotations.Transferable;
  */
 @Transferable(MetaStorageMessageGroup.COMMAND_ID)
 public interface CommandId extends NetworkMessage, Serializable {
+    MetaStorageMessagesFactory MSG_FACTORY = new MetaStorageMessagesFactory();
+
     UUID nodeId();
 
     long counter();
+
+    /**
+     * Returns string representation of a CommandId to use as a human readable 
meta storage key.
+     *
+     * @return String representation of a CommandId to use as a human readable 
meta storage key.
+     */
+    default String toMgKeyAsString() {
+        return nodeId() + "_cnt_" + counter();
+    }
+
+    /**
+     * Meta storage key as string to CommandId converter. See {@link 
CommandId#toMgKeyAsString()} for more details.
+     *
+     * @param mgKeyString String representation of a CommandId.
+     * @return CommandId instance.
+     */
+    static CommandId fromString(String mgKeyString) {
+        String[] parts = mgKeyString.split("_cnt_");
+
+        return MSG_FACTORY.commandId()
+                .nodeId(UUID.fromString(parts[0]))
+                .counter(Long.parseLong(parts[1]))
+                .build();
+    }
 }
diff --git 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/persistence/RocksDbKeyValueStorage.java
 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/persistence/RocksDbKeyValueStorage.java
index 713a85951f..599ad85802 100644
--- 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/persistence/RocksDbKeyValueStorage.java
+++ 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/persistence/RocksDbKeyValueStorage.java
@@ -32,7 +32,7 @@ import static 
org.apache.ignite.internal.metastorage.server.persistence.StorageC
 import static 
org.apache.ignite.internal.metastorage.server.persistence.StorageColumnFamilyType.INDEX;
 import static 
org.apache.ignite.internal.metastorage.server.persistence.StorageColumnFamilyType.REVISION_TO_TS;
 import static 
org.apache.ignite.internal.metastorage.server.persistence.StorageColumnFamilyType.TS_TO_REVISION;
-import static 
org.apache.ignite.internal.metastorage.server.raft.MetaStorageWriteHandler.IDEMPOTENT_COMMAND_PREFIX_BYTES;
+import static 
org.apache.ignite.internal.metastorage.server.raft.MetaStorageWriteHandler.IDEMPOTENT_COMMAND_PREFIX;
 import static org.apache.ignite.internal.rocksdb.RocksUtils.incrementPrefix;
 import static 
org.apache.ignite.internal.rocksdb.snapshot.ColumnFamilyRange.fullRange;
 import static org.apache.ignite.internal.util.ArrayUtils.LONG_EMPTY_ARRAY;
@@ -94,7 +94,6 @@ import 
org.apache.ignite.internal.rocksdb.RocksIteratorAdapter;
 import org.apache.ignite.internal.rocksdb.RocksUtils;
 import org.apache.ignite.internal.rocksdb.snapshot.RocksSnapshotManager;
 import org.apache.ignite.internal.thread.NamedThreadFactory;
-import org.apache.ignite.internal.util.ArrayUtils;
 import org.apache.ignite.internal.util.ByteUtils;
 import org.apache.ignite.internal.util.Cursor;
 import org.apache.ignite.internal.util.IgniteUtils;
@@ -683,7 +682,7 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
             Collection<Operation> ops = branch ? new ArrayList<>(success) : 
new ArrayList<>(failure);
 
             ops.add(Operations.put(
-                    new 
ByteArray(ArrayUtils.concat(IDEMPOTENT_COMMAND_PREFIX_BYTES, 
ByteUtils.toBytes(commandId))),
+                    new ByteArray(IDEMPOTENT_COMMAND_PREFIX + 
commandId.toMgKeyAsString()),
                     branch ? INVOKE_RESULT_TRUE_BYTES : 
INVOKE_RESULT_FALSE_BYTES)
             );
 
@@ -723,7 +722,7 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
                     Collection<Operation> ops = new 
ArrayList<>(update.operations());
 
                     ops.add(Operations.put(
-                            new 
ByteArray(ArrayUtils.concat(IDEMPOTENT_COMMAND_PREFIX_BYTES, 
ByteUtils.toBytes(commandId))),
+                            new ByteArray(IDEMPOTENT_COMMAND_PREFIX + 
commandId.toMgKeyAsString()),
                             update.result().result())
                     );
 
diff --git 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/raft/MetaStorageWriteHandler.java
 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/raft/MetaStorageWriteHandler.java
index e63b29fff5..f6fd3b827e 100644
--- 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/raft/MetaStorageWriteHandler.java
+++ 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/raft/MetaStorageWriteHandler.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.metastorage.server.raft;
 
-import static java.util.Arrays.copyOfRange;
 import static java.util.stream.Collectors.toList;
 import static org.apache.ignite.internal.util.ByteUtils.byteToBoolean;
 import static org.apache.ignite.internal.util.ByteUtils.toByteArray;
@@ -78,7 +77,9 @@ public class MetaStorageWriteHandler {
     /** Logger. */
     private static final IgniteLogger LOG = 
Loggers.forClass(MetaStorageWriteHandler.class);
 
-    public static final byte[] IDEMPOTENT_COMMAND_PREFIX_BYTES = 
"icp.".getBytes(StandardCharsets.UTF_8);
+    public static final String IDEMPOTENT_COMMAND_PREFIX = "icp.";
+
+    public static final byte[] IDEMPOTENT_COMMAND_PREFIX_BYTES = 
IDEMPOTENT_COMMAND_PREFIX.getBytes(StandardCharsets.UTF_8);
 
     private static final MetaStorageMessagesFactory MSG_FACTORY = new 
MetaStorageMessagesFactory();
 
@@ -350,8 +351,8 @@ public class MetaStorageWriteHandler {
         try (cursor) {
             for (Entry entry : cursor) {
                 if (!entry.tombstone()) {
-                    byte[] commandIdBytes = copyOfRange(entry.key(), 
IDEMPOTENT_COMMAND_PREFIX_BYTES.length, entry.key().length);
-                    CommandId commandId = ByteUtils.fromBytes(commandIdBytes);
+                    CommandId commandId = CommandId.fromString(
+                            
ByteUtils.stringFromBytes(entry.key()).substring(IDEMPOTENT_COMMAND_PREFIX.length()));
 
                     Serializable result;
                     if (entry.value().length == 1) {
@@ -387,13 +388,9 @@ public class MetaStorageWriteHandler {
                     .map(Entry::key)
                     .collect(toList());
 
-            // TODO https://issues.apache.org/jira/browse/IGNITE-22828
             evictionCandidateKeys.forEach(evictionCandidateKeyBytes -> {
-                CommandId commandId = ByteUtils.fromBytes(
-                        evictionCandidateKeyBytes,
-                        IDEMPOTENT_COMMAND_PREFIX_BYTES.length,
-                        evictionCandidateKeyBytes.length
-                );
+                CommandId commandId = CommandId.fromString(
+                        
ByteUtils.stringFromBytes(evictionCandidateKeyBytes).substring(IDEMPOTENT_COMMAND_PREFIX.length()));
 
                 idempotentCommandCache.remove(commandId);
             });
diff --git 
a/modules/metastorage/src/testFixtures/java/org/apache/ignite/internal/metastorage/server/SimpleInMemoryKeyValueStorage.java
 
b/modules/metastorage/src/testFixtures/java/org/apache/ignite/internal/metastorage/server/SimpleInMemoryKeyValueStorage.java
index 3822585e73..e36020f933 100644
--- 
a/modules/metastorage/src/testFixtures/java/org/apache/ignite/internal/metastorage/server/SimpleInMemoryKeyValueStorage.java
+++ 
b/modules/metastorage/src/testFixtures/java/org/apache/ignite/internal/metastorage/server/SimpleInMemoryKeyValueStorage.java
@@ -20,7 +20,7 @@ package org.apache.ignite.internal.metastorage.server;
 import static java.util.stream.Collectors.collectingAndThen;
 import static java.util.stream.Collectors.toList;
 import static org.apache.ignite.internal.metastorage.server.Value.TOMBSTONE;
-import static 
org.apache.ignite.internal.metastorage.server.raft.MetaStorageWriteHandler.IDEMPOTENT_COMMAND_PREFIX_BYTES;
+import static 
org.apache.ignite.internal.metastorage.server.raft.MetaStorageWriteHandler.IDEMPOTENT_COMMAND_PREFIX;
 import static org.apache.ignite.internal.rocksdb.RocksUtils.incrementPrefix;
 import static org.apache.ignite.internal.util.ByteUtils.toByteArray;
 import static org.apache.ignite.lang.ErrorGroups.MetaStorage.OP_EXECUTION_ERR;
@@ -55,8 +55,6 @@ import 
org.apache.ignite.internal.metastorage.dsl.StatementResult;
 import org.apache.ignite.internal.metastorage.exceptions.MetaStorageException;
 import org.apache.ignite.internal.metastorage.impl.EntryImpl;
 import org.apache.ignite.internal.metastorage.impl.MetaStorageManagerImpl;
-import org.apache.ignite.internal.util.ArrayUtils;
-import org.apache.ignite.internal.util.ByteUtils;
 import org.apache.ignite.internal.util.Cursor;
 import org.jetbrains.annotations.Nullable;
 
@@ -255,7 +253,7 @@ public class SimpleInMemoryKeyValueStorage implements 
KeyValueStorage {
             // In case of in-memory storage, there's no sense in "persisting" 
invoke result, however same persistent source operations
             // were added in order to have matching revisions count through 
all storages.
             ops.add(Operations.put(
-                    new 
ByteArray(ArrayUtils.concat(IDEMPOTENT_COMMAND_PREFIX_BYTES, 
ByteUtils.toBytes(commandId))),
+                    new ByteArray(IDEMPOTENT_COMMAND_PREFIX + 
commandId.toMgKeyAsString()),
                     branch ? INVOKE_RESULT_TRUE_BYTES : 
INVOKE_RESULT_FALSE_BYTES)
             );
 
@@ -312,7 +310,7 @@ public class SimpleInMemoryKeyValueStorage implements 
KeyValueStorage {
                     // In case of in-memory storage, there's no sense in 
"persisting" invoke result, however same persistent source
                     // operations were added in order to have matching 
revisions count through all storages.
                     ops.add(Operations.put(
-                            new 
ByteArray(ArrayUtils.concat(IDEMPOTENT_COMMAND_PREFIX_BYTES, 
ByteUtils.toBytes(commandId))),
+                            new ByteArray(IDEMPOTENT_COMMAND_PREFIX + 
commandId.toMgKeyAsString()),
                             branch.update().result().result())
                     );
 

Reply via email to