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

ibessonov 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 9b95c8ac09 IGNITE-18707 Make Meta Storage Entry serializable (#1628)
9b95c8ac09 is described below

commit 9b95c8ac092b94e7ffd1b4376c32e020fb7a2974
Author: Alexander Polovtcev <[email protected]>
AuthorDate: Mon Feb 6 09:10:56 2023 +0200

    IGNITE-18707 Make Meta Storage Entry serializable (#1628)
---
 ...ibutionZoneManagerConfigurationChangesTest.java |  8 +-
 ...butionZoneManagerLogicalTopologyEventsTest.java |  8 +-
 .../DistributionZoneManagerScaleUpTest.java        | 14 +---
 .../DistributionZoneManagerWatchListenerTest.java  | 10 +--
 .../apache/ignite/internal/metastorage/Entry.java  |  3 +-
 .../metastorage/command/MultipleEntryResponse.java | 47 ------------
 .../metastorage/command/SingleEntryResponse.java   | 89 ----------------------
 .../internal/metastorage/impl/CursorImpl.java      | 47 ++++--------
 .../internal/metastorage/impl/EntryImpl.java       |  2 +
 .../metastorage/impl/MetaStorageServiceImpl.java   | 59 +++++---------
 .../server/raft/MetaStorageListener.java           | 22 ++----
 .../server/raft/MetaStorageWriteHandler.java       | 25 ++----
 12 files changed, 60 insertions(+), 274 deletions(-)

diff --git 
a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerConfigurationChangesTest.java
 
b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerConfigurationChangesTest.java
index 0d55d7f9fe..dde5995b89 100644
--- 
a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerConfigurationChangesTest.java
+++ 
b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerConfigurationChangesTest.java
@@ -59,8 +59,6 @@ import 
org.apache.ignite.internal.metastorage.MetaStorageManager;
 import org.apache.ignite.internal.metastorage.command.GetAllCommand;
 import 
org.apache.ignite.internal.metastorage.command.MetaStorageCommandsFactory;
 import org.apache.ignite.internal.metastorage.command.MultiInvokeCommand;
-import org.apache.ignite.internal.metastorage.command.MultipleEntryResponse;
-import org.apache.ignite.internal.metastorage.command.SingleEntryResponse;
 import org.apache.ignite.internal.metastorage.dsl.Iif;
 import org.apache.ignite.internal.metastorage.impl.EntryImpl;
 import 
org.apache.ignite.internal.metastorage.server.SimpleInMemoryKeyValueStorage;
@@ -269,12 +267,10 @@ public class 
DistributionZoneManagerConfigurationChangesTest extends IgniteAbstr
                     
keysSet.stream().map(ByteArray::bytes).collect(Collectors.toList())
             ).revision(0).build();
 
-            return metaStorageService.run(getAllCommand).thenApply(bi -> {
-                MultipleEntryResponse resp = (MultipleEntryResponse) bi;
-
+            return 
metaStorageService.<List<Entry>>run(getAllCommand).thenApply(entries -> {
                 Map<ByteArray, Entry> res = new HashMap<>();
 
-                for (SingleEntryResponse e : resp.entries()) {
+                for (Entry e : entries) {
                     ByteArray key = new ByteArray(e.key());
 
                     res.put(key, new EntryImpl(key.bytes(), e.value(), 
e.revision(), e.updateCounter()));
diff --git 
a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerLogicalTopologyEventsTest.java
 
b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerLogicalTopologyEventsTest.java
index 984f35e2a0..99aaaf4202 100644
--- 
a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerLogicalTopologyEventsTest.java
+++ 
b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerLogicalTopologyEventsTest.java
@@ -58,9 +58,7 @@ import 
org.apache.ignite.internal.metastorage.MetaStorageManager;
 import org.apache.ignite.internal.metastorage.command.GetCommand;
 import 
org.apache.ignite.internal.metastorage.command.MetaStorageCommandsFactory;
 import org.apache.ignite.internal.metastorage.command.MultiInvokeCommand;
-import org.apache.ignite.internal.metastorage.command.SingleEntryResponse;
 import org.apache.ignite.internal.metastorage.dsl.Iif;
-import org.apache.ignite.internal.metastorage.impl.EntryImpl;
 import 
org.apache.ignite.internal.metastorage.server.SimpleInMemoryKeyValueStorage;
 import org.apache.ignite.internal.metastorage.server.raft.MetaStorageListener;
 import org.apache.ignite.internal.raft.Command;
@@ -257,11 +255,7 @@ public class 
DistributionZoneManagerLogicalTopologyEventsTest {
 
             GetCommand getCommand = 
commandsFactory.getCommand().key(key.bytes()).build();
 
-            return metaStorageService.run(getCommand).thenApply(bi -> {
-                SingleEntryResponse resp = (SingleEntryResponse) bi;
-
-                return new EntryImpl(resp.key(), resp.value(), 
resp.revision(), resp.updateCounter());
-            });
+            return metaStorageService.run(getCommand);
         }).when(metaStorageManager).get(any());
 
         return distributionZoneManager;
diff --git 
a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerScaleUpTest.java
 
b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerScaleUpTest.java
index d66caacba7..4b9d52aeb7 100644
--- 
a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerScaleUpTest.java
+++ 
b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerScaleUpTest.java
@@ -72,8 +72,6 @@ import 
org.apache.ignite.internal.metastorage.command.GetAllCommand;
 import org.apache.ignite.internal.metastorage.command.GetCommand;
 import 
org.apache.ignite.internal.metastorage.command.MetaStorageCommandsFactory;
 import org.apache.ignite.internal.metastorage.command.MultiInvokeCommand;
-import org.apache.ignite.internal.metastorage.command.MultipleEntryResponse;
-import org.apache.ignite.internal.metastorage.command.SingleEntryResponse;
 import org.apache.ignite.internal.metastorage.dsl.Iif;
 import org.apache.ignite.internal.metastorage.impl.EntryImpl;
 import 
org.apache.ignite.internal.metastorage.server.SimpleInMemoryKeyValueStorage;
@@ -299,12 +297,10 @@ public class DistributionZoneManagerScaleUpTest {
                     
keysSet.stream().map(ByteArray::bytes).collect(Collectors.toList())
             ).revision(0).build();
 
-            return metaStorageService.run(getAllCommand).thenApply(bi -> {
-                MultipleEntryResponse resp = (MultipleEntryResponse) bi;
-
+            return 
metaStorageService.<List<Entry>>run(getAllCommand).thenApply(entries -> {
                 Map<ByteArray, Entry> res = new HashMap<>();
 
-                for (SingleEntryResponse e : resp.entries()) {
+                for (Entry e : entries) {
                     ByteArray key = new ByteArray(e.key());
 
                     res.put(key, new EntryImpl(key.bytes(), e.value(), 
e.revision(), e.updateCounter()));
@@ -319,11 +315,7 @@ public class DistributionZoneManagerScaleUpTest {
 
             GetCommand getCommand = 
commandsFactory.getCommand().key(key.bytes()).build();
 
-            return metaStorageService.run(getCommand).thenApply(bi -> {
-                SingleEntryResponse resp = (SingleEntryResponse) bi;
-
-                return new EntryImpl(resp.key(), resp.value(), 
resp.revision(), resp.updateCounter());
-            });
+            return metaStorageService.<Entry>run(getCommand);
         }).when(metaStorageManager).get(any());
     }
 
diff --git 
a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerWatchListenerTest.java
 
b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerWatchListenerTest.java
index e2631a0a57..c984406d5e 100644
--- 
a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerWatchListenerTest.java
+++ 
b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerWatchListenerTest.java
@@ -74,8 +74,6 @@ import org.apache.ignite.internal.metastorage.WatchListener;
 import org.apache.ignite.internal.metastorage.command.GetAllCommand;
 import 
org.apache.ignite.internal.metastorage.command.MetaStorageCommandsFactory;
 import org.apache.ignite.internal.metastorage.command.MultiInvokeCommand;
-import org.apache.ignite.internal.metastorage.command.MultipleEntryResponse;
-import org.apache.ignite.internal.metastorage.command.SingleEntryResponse;
 import org.apache.ignite.internal.metastorage.dsl.Iif;
 import org.apache.ignite.internal.metastorage.impl.EntryImpl;
 import 
org.apache.ignite.internal.metastorage.server.SimpleInMemoryKeyValueStorage;
@@ -293,12 +291,10 @@ public class DistributionZoneManagerWatchListenerTest 
extends IgniteAbstractTest
                     
keysSet.stream().map(ByteArray::bytes).collect(Collectors.toList())
             ).revision(0).build();
 
-            return metaStorageService.run(getAllCommand).thenApply(bi -> {
-                MultipleEntryResponse resp = (MultipleEntryResponse) bi;
+            return 
metaStorageService.<List<Entry>>run(getAllCommand).thenApply(entries -> {
+                Map<ByteArray, Entry> res = new HashMap<>();
 
-                Map<ByteArray, org.apache.ignite.internal.metastorage.Entry> 
res = new HashMap<>();
-
-                for (SingleEntryResponse e : resp.entries()) {
+                for (Entry e : entries) {
                     ByteArray key = new ByteArray(e.key());
 
                     res.put(key, new EntryImpl(key.bytes(), e.value(), 
e.revision(), e.updateCounter()));
diff --git 
a/modules/metastorage-api/src/main/java/org/apache/ignite/internal/metastorage/Entry.java
 
b/modules/metastorage-api/src/main/java/org/apache/ignite/internal/metastorage/Entry.java
index 8945b17f28..1d72229898 100644
--- 
a/modules/metastorage-api/src/main/java/org/apache/ignite/internal/metastorage/Entry.java
+++ 
b/modules/metastorage-api/src/main/java/org/apache/ignite/internal/metastorage/Entry.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.metastorage;
 
+import java.io.Serializable;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -29,7 +30,7 @@ import org.jetbrains.annotations.Nullable;
  *     <li>revision - a number which denotes a version of whole meta storage. 
Each change increments the revision.</li>
  * </ul>
  */
-public interface Entry {
+public interface Entry extends Serializable {
     /**
      * Returns a key.
      *
diff --git 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/command/MultipleEntryResponse.java
 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/command/MultipleEntryResponse.java
deleted file mode 100644
index 65b99f414a..0000000000
--- 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/command/MultipleEntryResponse.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.metastorage.command;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * Defines response for command which returns a number of results.
- */
-public class MultipleEntryResponse implements Serializable {
-    /** Single responses. */
-    private final List<SingleEntryResponse> entries;
-
-    /**
-     * Constructs multiple entries response.
-     *
-     * @param entries The ;list of single responses.
-     */
-    public MultipleEntryResponse(List<SingleEntryResponse> entries) {
-        this.entries = entries;
-    }
-
-    /**
-     * Returns the list of single responses.
-     *
-     * @return The list of single responses.
-     */
-    public List<SingleEntryResponse> entries() {
-        return entries;
-    }
-}
diff --git 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/command/SingleEntryResponse.java
 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/command/SingleEntryResponse.java
deleted file mode 100644
index 1fa4b59a30..0000000000
--- 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/command/SingleEntryResponse.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.metastorage.command;
-
-import java.io.Serializable;
-import org.jetbrains.annotations.Nullable;
-
-/**
- * Defines response for command which returns exactly one result (entry).
- */
-public class SingleEntryResponse implements Serializable {
-    /** Key. */
-    private final byte[] key;
-
-    /** Value. */
-    private final byte @Nullable [] val;
-
-    /** Revision. */
-    private final long rev;
-
-    /** Update counter. */
-    private final long updCntr;
-
-    /**
-     * Constructs single entry response.
-     *
-     * @param key     Key. Couldn't be {@code null}.
-     * @param val     Value. Could be {@code null} for empty and tombstone 
entries.
-     * @param rev     Revision number.
-     * @param updCntr Update counter.
-     */
-    public SingleEntryResponse(byte[] key, byte @Nullable [] val, long rev, 
long updCntr) {
-        this.key = key;
-        this.val = val;
-        this.rev = rev;
-        this.updCntr = updCntr;
-    }
-
-    /**
-     * Returns key.
-     *
-     * @return Entry key. Couldn't be {@code null}.
-     */
-    public byte[] key() {
-        return key;
-    }
-
-    /**
-     * Returns value.
-     *
-     * @return Entry value. Could be {@code null} for empty and tombstone 
entries.
-     */
-    public byte @Nullable [] value() {
-        return val;
-    }
-
-    /**
-     * Returns revision.
-     *
-     * @return Entry revision.
-     */
-    public long revision() {
-        return rev;
-    }
-
-    /**
-     * Returns update counter.
-     *
-     * @return Entry update counter.
-     */
-    public long updateCounter() {
-        return updCntr;
-    }
-}
diff --git 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/CursorImpl.java
 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/CursorImpl.java
index 0cd297fa7e..93bf0f68a0 100644
--- 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/CursorImpl.java
+++ 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/CursorImpl.java
@@ -22,15 +22,15 @@ import static 
org.apache.ignite.lang.ErrorGroups.MetaStorage.CURSOR_CLOSING_ERR;
 import static 
org.apache.ignite.lang.ErrorGroups.MetaStorage.CURSOR_EXECUTION_ERR;
 
 import java.util.Iterator;
+import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
-import java.util.function.Function;
 import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.logger.Loggers;
+import org.apache.ignite.internal.metastorage.Entry;
 import 
org.apache.ignite.internal.metastorage.command.MetaStorageCommandsFactory;
 import 
org.apache.ignite.internal.metastorage.command.cursor.CursorCloseCommand;
-import org.apache.ignite.internal.metastorage.command.cursor.CursorNextCommand;
 import org.apache.ignite.internal.metastorage.exceptions.MetaStorageException;
 import org.apache.ignite.internal.raft.service.RaftGroupService;
 import org.apache.ignite.internal.util.Cursor;
@@ -40,10 +40,8 @@ import org.jetbrains.annotations.Nullable;
 
 /**
  * Meta storage service side implementation of cursor.
- *
- * @param <T> Cursor parameter.
  */
-public class CursorImpl<T> implements Cursor<T> {
+public class CursorImpl implements Cursor<Entry> {
     /** The logger. */
     private static final IgniteLogger LOG = Loggers.forClass(CursorImpl.class);
 
@@ -56,7 +54,7 @@ public class CursorImpl<T> implements Cursor<T> {
     /** Meta storage raft group service. */
     private final RaftGroupService metaStorageRaftGrpSvc;
 
-    private final Iterator<T> it;
+    private final InnerIterator it;
 
     /**
      * Constructor.
@@ -64,19 +62,16 @@ public class CursorImpl<T> implements Cursor<T> {
      * @param commandsFactory Commands factory.
      * @param metaStorageRaftGrpSvc Meta storage raft group service.
      * @param initOp                Future that runs meta storage service 
operation that provides cursor.
-     * @param fn                    Function transforming the result of {@link 
CursorNextCommand} to the type of {@link T},
-     *                              or to the {@link Iterable} of type {@link 
T} if needed.
      */
     CursorImpl(
             MetaStorageCommandsFactory commandsFactory,
             RaftGroupService metaStorageRaftGrpSvc,
-            CompletableFuture<IgniteUuid> initOp,
-            Function<Object, Object> fn
+            CompletableFuture<IgniteUuid> initOp
     ) {
         this.commandsFactory = commandsFactory;
         this.metaStorageRaftGrpSvc = metaStorageRaftGrpSvc;
         this.initOp = initOp;
-        this.it = new InnerIterator(fn);
+        this.it = new InnerIterator();
     }
 
     /** {@inheritDoc} */
@@ -89,7 +84,7 @@ public class CursorImpl<T> implements Cursor<T> {
                 return metaStorageRaftGrpSvc.run(cursorCloseCommand);
             }).get();
 
-            ((InnerIterator) it).close();
+            it.close();
         } catch (InterruptedException | ExecutionException e) {
             if (e.getCause() instanceof NodeStoppingException) {
                 return;
@@ -109,22 +104,16 @@ public class CursorImpl<T> implements Cursor<T> {
 
     /** {@inheritDoc} */
     @Override
-    public T next() {
+    public Entry next() {
         return it.next();
     }
 
     /**
      * Extension of {@link Iterator}.
      */
-    private class InnerIterator implements Iterator<T> {
-        private final Function<Object, Object> fn;
-
+    private class InnerIterator implements Iterator<Entry> {
         @Nullable
-        private Iterator<T> internalCacheIterator;
-
-        public InnerIterator(Function<Object, Object> fn) {
-            this.fn = fn;
-        }
+        private Iterator<Entry> internalCacheIterator;
 
         /** {@inheritDoc} */
         @Override
@@ -151,25 +140,19 @@ public class CursorImpl<T> implements Cursor<T> {
 
         /** {@inheritDoc} */
         @Override
-        public T next() {
+        public Entry next() {
             try {
                 if (internalCacheIterator != null && 
internalCacheIterator.hasNext()) {
                     return internalCacheIterator.next();
                 } else {
-                    Object res = initOp
+                    List<Entry> res = initOp
                             .thenCompose(cursorId ->
-                                    
metaStorageRaftGrpSvc.run(commandsFactory.cursorNextCommand().cursorId(cursorId).build()))
+                                    
metaStorageRaftGrpSvc.<List<Entry>>run(commandsFactory.cursorNextCommand().cursorId(cursorId).build()))
                             .get();
 
-                    Object transformed = fn.apply(res);
-
-                    if (transformed instanceof Iterable) {
-                        internalCacheIterator = ((Iterable<T>) 
transformed).iterator();
+                    internalCacheIterator = res.iterator();
 
-                        return internalCacheIterator.next();
-                    } else {
-                        return (T) transformed;
-                    }
+                    return internalCacheIterator.next();
                 }
             } catch (InterruptedException | ExecutionException e) {
                 Throwable cause = e.getCause();
diff --git 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/EntryImpl.java
 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/EntryImpl.java
index 1b38283b52..123b022779 100644
--- 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/EntryImpl.java
+++ 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/EntryImpl.java
@@ -43,6 +43,8 @@ import org.jetbrains.annotations.Nullable;
  * </ul>
  */
 public final class EntryImpl implements Entry {
+    private static final long serialVersionUID = 3636551347117181271L;
+
     /** Key. */
     private final byte[] key;
 
diff --git 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageServiceImpl.java
 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageServiceImpl.java
index b27046728c..99c5a8171b 100644
--- 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageServiceImpl.java
+++ 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageServiceImpl.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.metastorage.impl;
 
-import static java.util.stream.Collectors.toList;
 import static 
org.apache.ignite.internal.metastorage.command.GetAllCommand.getAllCommand;
 import static 
org.apache.ignite.internal.metastorage.command.GetAndPutAllCommand.getAndPutAllCommand;
 import static 
org.apache.ignite.internal.metastorage.command.GetAndRemoveAllCommand.getAndRemoveAllCommand;
@@ -25,7 +24,6 @@ import static 
org.apache.ignite.internal.metastorage.command.PutAllCommand.putAl
 import static 
org.apache.ignite.internal.metastorage.command.RemoveAllCommand.removeAllCommand;
 
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -41,20 +39,19 @@ import 
org.apache.ignite.internal.metastorage.command.GetCommand;
 import org.apache.ignite.internal.metastorage.command.InvokeCommand;
 import 
org.apache.ignite.internal.metastorage.command.MetaStorageCommandsFactory;
 import org.apache.ignite.internal.metastorage.command.MultiInvokeCommand;
-import org.apache.ignite.internal.metastorage.command.MultipleEntryResponse;
 import org.apache.ignite.internal.metastorage.command.PrefixCommand;
 import org.apache.ignite.internal.metastorage.command.PutAllCommand;
 import org.apache.ignite.internal.metastorage.command.PutCommand;
 import org.apache.ignite.internal.metastorage.command.RangeCommand;
 import org.apache.ignite.internal.metastorage.command.RemoveAllCommand;
 import org.apache.ignite.internal.metastorage.command.RemoveCommand;
-import org.apache.ignite.internal.metastorage.command.SingleEntryResponse;
 import org.apache.ignite.internal.metastorage.dsl.Condition;
 import org.apache.ignite.internal.metastorage.dsl.Iif;
 import org.apache.ignite.internal.metastorage.dsl.Operation;
 import org.apache.ignite.internal.metastorage.dsl.StatementResult;
 import org.apache.ignite.internal.raft.service.RaftGroupService;
 import org.apache.ignite.internal.util.Cursor;
+import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.lang.ByteArray;
 import org.apache.ignite.lang.IgniteUuidGenerator;
 import org.apache.ignite.network.ClusterNode;
@@ -96,7 +93,7 @@ public class MetaStorageServiceImpl implements 
MetaStorageService {
     public CompletableFuture<Entry> get(ByteArray key) {
         GetCommand getCommand = 
commandsFactory.getCommand().key(key.bytes()).build();
 
-        return 
metaStorageRaftGrpSvc.run(getCommand).thenApply(MetaStorageServiceImpl::singleEntryResult);
+        return metaStorageRaftGrpSvc.run(getCommand);
     }
 
     /** {@inheritDoc} */
@@ -104,7 +101,7 @@ public class MetaStorageServiceImpl implements 
MetaStorageService {
     public CompletableFuture<Entry> get(ByteArray key, long revUpperBound) {
         GetCommand getCommand = 
commandsFactory.getCommand().key(key.bytes()).revision(revUpperBound).build();
 
-        return 
metaStorageRaftGrpSvc.run(getCommand).thenApply(MetaStorageServiceImpl::singleEntryResult);
+        return metaStorageRaftGrpSvc.run(getCommand);
     }
 
     /** {@inheritDoc} */
@@ -112,7 +109,8 @@ public class MetaStorageServiceImpl implements 
MetaStorageService {
     public CompletableFuture<Map<ByteArray, Entry>> getAll(Set<ByteArray> 
keys) {
         GetAllCommand getAllCommand = getAllCommand(commandsFactory, keys, 0);
 
-        return 
metaStorageRaftGrpSvc.run(getAllCommand).thenApply(MetaStorageServiceImpl::multipleEntryResult);
+        return metaStorageRaftGrpSvc.<List<Entry>>run(getAllCommand)
+                .thenApply(MetaStorageServiceImpl::multipleEntryResult);
     }
 
     /** {@inheritDoc} */
@@ -120,7 +118,8 @@ public class MetaStorageServiceImpl implements 
MetaStorageService {
     public CompletableFuture<Map<ByteArray, Entry>> getAll(Set<ByteArray> 
keys, long revUpperBound) {
         GetAllCommand getAllCommand = getAllCommand(commandsFactory, keys, 
revUpperBound);
 
-        return 
metaStorageRaftGrpSvc.run(getAllCommand).thenApply(MetaStorageServiceImpl::multipleEntryResult);
+        return metaStorageRaftGrpSvc.<List<Entry>>run(getAllCommand)
+                .thenApply(MetaStorageServiceImpl::multipleEntryResult);
     }
 
     /** {@inheritDoc} */
@@ -136,7 +135,7 @@ public class MetaStorageServiceImpl implements 
MetaStorageService {
     public CompletableFuture<Entry> getAndPut(ByteArray key, byte[] value) {
         GetAndPutCommand getAndPutCommand = 
commandsFactory.getAndPutCommand().key(key.bytes()).value(value).build();
 
-        return 
metaStorageRaftGrpSvc.run(getAndPutCommand).thenApply(MetaStorageServiceImpl::singleEntryResult);
+        return metaStorageRaftGrpSvc.run(getAndPutCommand);
     }
 
     /** {@inheritDoc} */
@@ -152,7 +151,8 @@ public class MetaStorageServiceImpl implements 
MetaStorageService {
     public CompletableFuture<Map<ByteArray, Entry>> 
getAndPutAll(Map<ByteArray, byte[]> vals) {
         GetAndPutAllCommand getAndPutAllCommand = 
getAndPutAllCommand(commandsFactory, vals);
 
-        return 
metaStorageRaftGrpSvc.run(getAndPutAllCommand).thenApply(MetaStorageServiceImpl::multipleEntryResult);
+        return metaStorageRaftGrpSvc.<List<Entry>>run(getAndPutAllCommand)
+                .thenApply(MetaStorageServiceImpl::multipleEntryResult);
     }
 
     /** {@inheritDoc} */
@@ -168,7 +168,7 @@ public class MetaStorageServiceImpl implements 
MetaStorageService {
     public CompletableFuture<Entry> getAndRemove(ByteArray key) {
         GetAndRemoveCommand getAndRemoveCommand = 
commandsFactory.getAndRemoveCommand().key(key.bytes()).build();
 
-        return 
metaStorageRaftGrpSvc.run(getAndRemoveCommand).thenApply(MetaStorageServiceImpl::singleEntryResult);
+        return metaStorageRaftGrpSvc.run(getAndRemoveCommand);
     }
 
     /** {@inheritDoc} */
@@ -184,7 +184,8 @@ public class MetaStorageServiceImpl implements 
MetaStorageService {
     public CompletableFuture<Map<ByteArray, Entry>> 
getAndRemoveAll(Set<ByteArray> keys) {
         GetAndRemoveAllCommand getAndRemoveAllCommand = 
getAndRemoveAllCommand(commandsFactory, keys);
 
-        return 
metaStorageRaftGrpSvc.run(getAndRemoveAllCommand).thenApply(MetaStorageServiceImpl::multipleEntryResult);
+        return metaStorageRaftGrpSvc.<List<Entry>>run(getAndRemoveAllCommand)
+                .thenApply(MetaStorageServiceImpl::multipleEntryResult);
     }
 
     @Override
@@ -236,7 +237,7 @@ public class MetaStorageServiceImpl implements 
MetaStorageService {
             long revUpperBound,
             boolean includeTombstones
     ) {
-        return new CursorImpl<>(
+        return new CursorImpl(
                 commandsFactory,
                 metaStorageRaftGrpSvc,
                 metaStorageRaftGrpSvc.run(
@@ -249,8 +250,7 @@ public class MetaStorageServiceImpl implements 
MetaStorageService {
                                 .includeTombstones(includeTombstones)
                                 .batchSize(RangeCommand.DEFAULT_BATCH_SIZE)
                                 .build()
-                ),
-                MetaStorageServiceImpl::multipleEntryResultForCache
+                )
         );
     }
 
@@ -268,7 +268,7 @@ public class MetaStorageServiceImpl implements 
MetaStorageService {
 
     @Override
     public Cursor<Entry> prefix(ByteArray prefix, long revUpperBound) {
-        return new CursorImpl<>(
+        return new CursorImpl(
                 commandsFactory,
                 metaStorageRaftGrpSvc,
                 metaStorageRaftGrpSvc.run(
@@ -280,8 +280,7 @@ public class MetaStorageServiceImpl implements 
MetaStorageService {
                                 .includeTombstones(false)
                                 .batchSize(PrefixCommand.DEFAULT_BATCH_SIZE)
                                 .build()
-                ),
-                MetaStorageServiceImpl::multipleEntryResultForCache
+                )
         );
     }
 
@@ -302,29 +301,13 @@ public class MetaStorageServiceImpl implements 
MetaStorageService {
         metaStorageRaftGrpSvc.shutdown();
     }
 
-    private static Map<ByteArray, Entry> multipleEntryResult(Object obj) {
-        MultipleEntryResponse resp = (MultipleEntryResponse) obj;
+    private static Map<ByteArray, Entry> multipleEntryResult(List<Entry> 
entries) {
+        Map<ByteArray, Entry> res = IgniteUtils.newHashMap(entries.size());
 
-        Map<ByteArray, Entry> res = new HashMap<>();
-
-        for (SingleEntryResponse e : resp.entries()) {
-            res.put(new ByteArray(e.key()), new EntryImpl(e.key(), e.value(), 
e.revision(), e.updateCounter()));
+        for (Entry e : entries) {
+            res.put(new ByteArray(e.key()), e);
         }
 
         return res;
     }
-
-    private static List<Entry> multipleEntryResultForCache(Object obj) {
-        MultipleEntryResponse resp = (MultipleEntryResponse) obj;
-
-        return resp.entries().stream()
-                .map(MetaStorageServiceImpl::singleEntryResult)
-                .collect(toList());
-    }
-
-    private static Entry singleEntryResult(Object obj) {
-        SingleEntryResponse resp = (SingleEntryResponse) obj;
-
-        return new EntryImpl(resp.key(), resp.value(), resp.revision(), 
resp.updateCounter());
-    }
 }
diff --git 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/raft/MetaStorageListener.java
 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/raft/MetaStorageListener.java
index ded27cc751..dc18da854a 100644
--- 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/raft/MetaStorageListener.java
+++ 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/raft/MetaStorageListener.java
@@ -20,11 +20,11 @@ package org.apache.ignite.internal.metastorage.server.raft;
 import static java.util.Objects.requireNonNull;
 import static 
org.apache.ignite.lang.ErrorGroups.MetaStorage.CURSOR_CLOSING_ERR;
 
+import java.io.Serializable;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.concurrent.ConcurrentHashMap;
@@ -32,10 +32,8 @@ import java.util.function.Consumer;
 import org.apache.ignite.internal.metastorage.Entry;
 import org.apache.ignite.internal.metastorage.command.GetAllCommand;
 import org.apache.ignite.internal.metastorage.command.GetCommand;
-import org.apache.ignite.internal.metastorage.command.MultipleEntryResponse;
 import org.apache.ignite.internal.metastorage.command.PrefixCommand;
 import org.apache.ignite.internal.metastorage.command.RangeCommand;
-import org.apache.ignite.internal.metastorage.command.SingleEntryResponse;
 import 
org.apache.ignite.internal.metastorage.command.cursor.CursorCloseCommand;
 import 
org.apache.ignite.internal.metastorage.command.cursor.CursorHasNextCommand;
 import org.apache.ignite.internal.metastorage.command.cursor.CursorNextCommand;
@@ -93,9 +91,7 @@ public class MetaStorageListener implements RaftGroupListener 
{
                     e = storage.get(getCmd.key());
                 }
 
-                SingleEntryResponse resp = new SingleEntryResponse(e.key(), 
e.value(), e.revision(), e.updateCounter());
-
-                clo.result(resp);
+                clo.result(e);
             } else if (command instanceof GetAllCommand) {
                 GetAllCommand getAllCmd = (GetAllCommand) command;
 
@@ -107,13 +103,7 @@ public class MetaStorageListener implements 
RaftGroupListener {
                     entries = storage.getAll(getAllCmd.keys());
                 }
 
-                List<SingleEntryResponse> res = new 
ArrayList<>(entries.size());
-
-                for (Entry e : entries) {
-                    res.add(new SingleEntryResponse(e.key(), e.value(), 
e.revision(), e.updateCounter()));
-                }
-
-                clo.result(new MultipleEntryResponse(res));
+                clo.result((Serializable) entries);
             } else if (command instanceof CursorHasNextCommand) {
                 CursorHasNextCommand cursorHasNextCmd = (CursorHasNextCommand) 
command;
 
@@ -180,17 +170,17 @@ public class MetaStorageListener implements 
RaftGroupListener {
                 try {
                     int batchSize = requireNonNull(cursorDesc.batchSize());
 
-                    var resp = new ArrayList<SingleEntryResponse>(batchSize);
+                    var resp = new ArrayList<Entry>(batchSize);
 
                     Cursor<Entry> cursor = cursorDesc.cursor();
 
                     for (int i = 0; i < batchSize && cursor.hasNext(); i++) {
                         Entry e = cursor.next();
 
-                        resp.add(new SingleEntryResponse(e.key(), e.value(), 
e.revision(), e.updateCounter()));
+                        resp.add(e);
                     }
 
-                    clo.result(new MultipleEntryResponse(resp));
+                    clo.result(resp);
                 } catch (NoSuchElementException e) {
                     clo.result(e);
                 }
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 14db5071c3..ddc91f2f65 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,9 +17,8 @@
 
 package org.apache.ignite.internal.metastorage.server.raft;
 
-import java.util.ArrayList;
+import java.io.Serializable;
 import java.util.Collection;
-import java.util.List;
 import org.apache.ignite.internal.metastorage.Entry;
 import org.apache.ignite.internal.metastorage.command.GetAndPutAllCommand;
 import org.apache.ignite.internal.metastorage.command.GetAndPutCommand;
@@ -27,12 +26,10 @@ import 
org.apache.ignite.internal.metastorage.command.GetAndRemoveAllCommand;
 import org.apache.ignite.internal.metastorage.command.GetAndRemoveCommand;
 import org.apache.ignite.internal.metastorage.command.InvokeCommand;
 import org.apache.ignite.internal.metastorage.command.MultiInvokeCommand;
-import org.apache.ignite.internal.metastorage.command.MultipleEntryResponse;
 import org.apache.ignite.internal.metastorage.command.PutAllCommand;
 import org.apache.ignite.internal.metastorage.command.PutCommand;
 import org.apache.ignite.internal.metastorage.command.RemoveAllCommand;
 import org.apache.ignite.internal.metastorage.command.RemoveCommand;
-import org.apache.ignite.internal.metastorage.command.SingleEntryResponse;
 import org.apache.ignite.internal.metastorage.dsl.CompoundCondition;
 import org.apache.ignite.internal.metastorage.dsl.ConditionType;
 import org.apache.ignite.internal.metastorage.dsl.Iif;
@@ -80,7 +77,7 @@ class MetaStorageWriteHandler {
 
             Entry e = storage.getAndPut(getAndPutCmd.key(), 
getAndPutCmd.value());
 
-            clo.result(new SingleEntryResponse(e.key(), e.value(), 
e.revision(), e.updateCounter()));
+            clo.result(e);
         } else if (command instanceof PutAllCommand) {
             PutAllCommand putAllCmd = (PutAllCommand) command;
 
@@ -92,13 +89,7 @@ class MetaStorageWriteHandler {
 
             Collection<Entry> entries = 
storage.getAndPutAll(getAndPutAllCmd.keys(), getAndPutAllCmd.values());
 
-            List<SingleEntryResponse> resp = new ArrayList<>(entries.size());
-
-            for (Entry e : entries) {
-                resp.add(new SingleEntryResponse(e.key(), e.value(), 
e.revision(), e.updateCounter()));
-            }
-
-            clo.result(new MultipleEntryResponse(resp));
+            clo.result((Serializable) entries);
         } else if (command instanceof RemoveCommand) {
             RemoveCommand rmvCmd = (RemoveCommand) command;
 
@@ -110,7 +101,7 @@ class MetaStorageWriteHandler {
 
             Entry e = storage.getAndRemove(getAndRmvCmd.key());
 
-            clo.result(new SingleEntryResponse(e.key(), e.value(), 
e.revision(), e.updateCounter()));
+            clo.result(e);
         } else if (command instanceof RemoveAllCommand) {
             RemoveAllCommand rmvAllCmd = (RemoveAllCommand) command;
 
@@ -122,13 +113,7 @@ class MetaStorageWriteHandler {
 
             Collection<Entry> entries = 
storage.getAndRemoveAll(getAndRmvAllCmd.keys());
 
-            List<SingleEntryResponse> resp = new ArrayList<>(entries.size());
-
-            for (Entry e : entries) {
-                resp.add(new SingleEntryResponse(e.key(), e.value(), 
e.revision(), e.updateCounter()));
-            }
-
-            clo.result(new MultipleEntryResponse(resp));
+            clo.result((Serializable) entries);
         } else if (command instanceof InvokeCommand) {
             InvokeCommand cmd = (InvokeCommand) command;
 


Reply via email to