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())
);