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

shishkovilja pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new 20f5040d7dc IGNITE-26629 Refactor GridDistributedTxPrepareResponse and 
successors (#12398)
20f5040d7dc is described below

commit 20f5040d7dcde7c4e8e0b1f4a5d49fa94704f811
Author: Ilya Shishkov <[email protected]>
AuthorDate: Wed Oct 22 20:52:01 2025 +0300

    IGNITE-26629 Refactor GridDistributedTxPrepareResponse and successors 
(#12398)
---
 .../communication/GridIoMessageFactory.java        |   9 +-
 .../distributed/GridDistributedBaseMessage.java    | 108 +------
 .../GridDistributedTxPrepareResponse.java          | 177 +++-------
 .../distributed/dht/GridDhtTxPrepareFuture.java    |   6 +-
 .../distributed/dht/GridDhtTxPrepareResponse.java  | 175 +++-------
 .../cache/distributed/near/GridNearLockFuture.java |   8 +-
 .../near/GridNearTransactionalCache.java           |   4 +-
 .../near/GridNearTxPrepareFutureAdapter.java       |   6 +-
 .../near/GridNearTxPrepareResponse.java            | 358 ++++++++-------------
 .../cache/transactions/IgniteTxHandler.java        |   4 +-
 .../main/resources/META-INF/classnames.properties  |   1 -
 11 files changed, 245 insertions(+), 611 deletions(-)

diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java
index 752448712fc..1987c5aacbb 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java
@@ -59,12 +59,14 @@ import 
org.apache.ignite.internal.codegen.GridDhtTxFinishRequestSerializer;
 import org.apache.ignite.internal.codegen.GridDhtTxFinishResponseSerializer;
 import 
org.apache.ignite.internal.codegen.GridDhtTxOnePhaseCommitAckRequestSerializer;
 import org.apache.ignite.internal.codegen.GridDhtTxPrepareRequestSerializer;
+import org.apache.ignite.internal.codegen.GridDhtTxPrepareResponseSerializer;
 import org.apache.ignite.internal.codegen.GridDhtUnlockRequestSerializer;
 import org.apache.ignite.internal.codegen.GridDistributedLockRequestSerializer;
 import 
org.apache.ignite.internal.codegen.GridDistributedLockResponseSerializer;
 import 
org.apache.ignite.internal.codegen.GridDistributedTxFinishRequestSerializer;
 import 
org.apache.ignite.internal.codegen.GridDistributedTxFinishResponseSerializer;
 import 
org.apache.ignite.internal.codegen.GridDistributedTxPrepareRequestSerializer;
+import 
org.apache.ignite.internal.codegen.GridDistributedTxPrepareResponseSerializer;
 import org.apache.ignite.internal.codegen.GridJobCancelRequestSerializer;
 import org.apache.ignite.internal.codegen.GridJobSiblingsRequestSerializer;
 import 
org.apache.ignite.internal.codegen.GridNearAtomicCheckUpdateRequestSerializer;
@@ -78,6 +80,7 @@ import 
org.apache.ignite.internal.codegen.GridNearSingleGetRequestSerializer;
 import org.apache.ignite.internal.codegen.GridNearTxFinishRequestSerializer;
 import org.apache.ignite.internal.codegen.GridNearTxFinishResponseSerializer;
 import org.apache.ignite.internal.codegen.GridNearTxPrepareRequestSerializer;
+import org.apache.ignite.internal.codegen.GridNearTxPrepareResponseSerializer;
 import org.apache.ignite.internal.codegen.GridNearUnlockRequestSerializer;
 import org.apache.ignite.internal.codegen.GridQueryCancelRequestSerializer;
 import org.apache.ignite.internal.codegen.GridQueryFailResponseSerializer;
@@ -302,7 +305,7 @@ public class GridIoMessageFactory implements 
MessageFactoryProvider {
         factory.register((short)23, GridDistributedTxFinishRequest::new, new 
GridDistributedTxFinishRequestSerializer());
         factory.register((short)24, GridDistributedTxFinishResponse::new, new 
GridDistributedTxFinishResponseSerializer());
         factory.register((short)25, GridDistributedTxPrepareRequest::new, new 
GridDistributedTxPrepareRequestSerializer());
-        factory.register((short)26, GridDistributedTxPrepareResponse::new);
+        factory.register((short)26, GridDistributedTxPrepareResponse::new, new 
GridDistributedTxPrepareResponseSerializer());
         // Type 27 is former GridDistributedUnlockRequest
         factory.register((short)28, GridDhtAffinityAssignmentRequest::new, new 
GridDhtAffinityAssignmentRequestSerializer());
         factory.register((short)29, GridDhtAffinityAssignmentResponse::new);
@@ -311,7 +314,7 @@ public class GridIoMessageFactory implements 
MessageFactoryProvider {
         factory.register((short)32, GridDhtTxFinishRequest::new, new 
GridDhtTxFinishRequestSerializer());
         factory.register((short)33, GridDhtTxFinishResponse::new, new 
GridDhtTxFinishResponseSerializer());
         factory.register((short)34, GridDhtTxPrepareRequest::new, new 
GridDhtTxPrepareRequestSerializer());
-        factory.register((short)35, GridDhtTxPrepareResponse::new);
+        factory.register((short)35, GridDhtTxPrepareResponse::new, new 
GridDhtTxPrepareResponseSerializer());
         factory.register((short)36, GridDhtUnlockRequest::new, new 
GridDhtUnlockRequestSerializer());
         factory.register((short)37, GridDhtAtomicDeferredUpdateResponse::new);
         factory.register((short)38, GridDhtAtomicUpdateRequest::new);
@@ -331,7 +334,7 @@ public class GridIoMessageFactory implements 
MessageFactoryProvider {
         factory.register((short)53, GridNearTxFinishRequest::new, new 
GridNearTxFinishRequestSerializer());
         factory.register((short)54, GridNearTxFinishResponse::new, new 
GridNearTxFinishResponseSerializer());
         factory.register((short)55, GridNearTxPrepareRequest::new, new 
GridNearTxPrepareRequestSerializer());
-        factory.register((short)56, GridNearTxPrepareResponse::new);
+        factory.register((short)56, GridNearTxPrepareResponse::new, new 
GridNearTxPrepareResponseSerializer());
         factory.register((short)57, GridNearUnlockRequest::new, new 
GridNearUnlockRequestSerializer());
         factory.register((short)58, GridCacheQueryRequest::new);
         factory.register((short)59, GridCacheQueryResponse::new);
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedBaseMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedBaseMessage.java
index 264caa27e6c..a4bb44cfa72 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedBaseMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedBaseMessage.java
@@ -17,11 +17,7 @@
 
 package org.apache.ignite.internal.processors.cache.distributed;
 
-import java.nio.ByteBuffer;
 import java.util.Collection;
-import java.util.Collections;
-import org.apache.ignite.internal.GridDirectCollection;
-import org.apache.ignite.internal.GridDirectTransient;
 import org.apache.ignite.internal.Order;
 import org.apache.ignite.internal.processors.cache.GridCacheDeployable;
 import org.apache.ignite.internal.processors.cache.GridCacheIdMessage;
@@ -29,9 +25,7 @@ import 
org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
 import 
org.apache.ignite.internal.processors.cache.version.GridCacheVersionable;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.internal.S;
-import 
org.apache.ignite.plugin.extensions.communication.MessageCollectionItemType;
-import org.apache.ignite.plugin.extensions.communication.MessageReader;
-import org.apache.ignite.plugin.extensions.communication.MessageWriter;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * Base for all messages in replicated cache.
@@ -46,18 +40,15 @@ public abstract class GridDistributedBaseMessage extends 
GridCacheIdMessage impl
     /** Committed versions with order higher than one for this message (needed 
for commit ordering). */
     @Order(value = 5, method = "committedVersions")
     @GridToStringInclude
-    @GridDirectCollection(GridCacheVersion.class)
-    private Collection<GridCacheVersion> committedVers;
+    private @Nullable Collection<GridCacheVersion> committedVers;
 
     /** Rolled back versions with order higher than one for this message 
(needed for commit ordering). */
     @Order(value = 6, method = "rolledbackVersions")
     @GridToStringInclude
-    @GridDirectCollection(GridCacheVersion.class)
-    private Collection<GridCacheVersion> rolledbackVers;
+    private @Nullable Collection<GridCacheVersion> rolledbackVers;
 
     /** Count of keys referenced in candidates array (needed only locally for 
optimization). */
     @GridToStringInclude
-    @GridDirectTransient
     private int cnt;
 
     /**
@@ -114,8 +105,8 @@ public abstract class GridDistributedBaseMessage extends 
GridCacheIdMessage impl
      * @param committedVers Committed versions.
      * @param rolledbackVers Rolled back versions.
      */
-    public void completedVersions(Collection<GridCacheVersion> committedVers,
-        Collection<GridCacheVersion> rolledbackVers) {
+    public void completedVersions(@Nullable Collection<GridCacheVersion> 
committedVers,
+        @Nullable Collection<GridCacheVersion> rolledbackVers) {
         this.committedVers = committedVers;
         this.rolledbackVers = rolledbackVers;
     }
@@ -123,28 +114,28 @@ public abstract class GridDistributedBaseMessage extends 
GridCacheIdMessage impl
     /**
      * @return Committed versions.
      */
-    public Collection<GridCacheVersion> committedVersions() {
-        return committedVers == null ? 
Collections.<GridCacheVersion>emptyList() : committedVers;
+    public @Nullable Collection<GridCacheVersion> committedVersions() {
+        return committedVers;
     }
 
     /**
      * @param committedVers Committed versions.
      */
-    public void committedVersions(Collection<GridCacheVersion> committedVers) {
+    public void committedVersions(@Nullable Collection<GridCacheVersion> 
committedVers) {
         this.committedVers = committedVers;
     }
 
     /**
      * @return Rolled back versions.
      */
-    public Collection<GridCacheVersion> rolledbackVersions() {
-        return rolledbackVers == null ? 
Collections.<GridCacheVersion>emptyList() : rolledbackVers;
+    public @Nullable Collection<GridCacheVersion> rolledbackVersions() {
+        return rolledbackVers;
     }
 
     /**
      * @param rolledbackVers Rolled back versions.
      */
-    public void rolledbackVersions(Collection<GridCacheVersion> 
rolledbackVers) {
+    public void rolledbackVersions(@Nullable Collection<GridCacheVersion> 
rolledbackVers) {
         this.rolledbackVers = rolledbackVers;
     }
 
@@ -155,83 +146,6 @@ public abstract class GridDistributedBaseMessage extends 
GridCacheIdMessage impl
         return cnt;
     }
 
-    /** {@inheritDoc} */
-    @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
-        // TODO: Remove #writeTo() after all inheritors have migrated to the 
new ser/der scheme (IGNITE-25490).
-        writer.setBuffer(buf);
-
-        if (!super.writeTo(buf, writer))
-            return false;
-
-        if (!writer.isHeaderWritten()) {
-            if (!writer.writeHeader(directType()))
-                return false;
-
-            writer.onHeaderWritten();
-        }
-
-        switch (writer.state()) {
-            case 4:
-                if (!writer.writeCollection(committedVers, 
MessageCollectionItemType.MSG))
-                    return false;
-
-                writer.incrementState();
-
-            case 5:
-                if (!writer.writeCollection(rolledbackVers, 
MessageCollectionItemType.MSG))
-                    return false;
-
-                writer.incrementState();
-
-            case 6:
-                if (!writer.writeMessage(ver))
-                    return false;
-
-                writer.incrementState();
-
-        }
-
-        return true;
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
-        // TODO: Remove #readFrom() after all inheritors have migrated to the 
new ser/der scheme (IGNITE-25490).
-        reader.setBuffer(buf);
-
-        if (!super.readFrom(buf, reader))
-            return false;
-
-        switch (reader.state()) {
-            case 4:
-                committedVers = 
reader.readCollection(MessageCollectionItemType.MSG);
-
-                if (!reader.isLastRead())
-                    return false;
-
-                reader.incrementState();
-
-            case 5:
-                rolledbackVers = 
reader.readCollection(MessageCollectionItemType.MSG);
-
-                if (!reader.isLastRead())
-                    return false;
-
-                reader.incrementState();
-
-            case 6:
-                ver = reader.readMessage();
-
-                if (!reader.isLastRead())
-                    return false;
-
-                reader.incrementState();
-
-        }
-
-        return true;
-    }
-
     /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(GridDistributedBaseMessage.class, this, "super", 
super.toString());
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxPrepareResponse.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxPrepareResponse.java
index 8b131faee99..446227578a8 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxPrepareResponse.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxPrepareResponse.java
@@ -17,42 +17,33 @@
 
 package org.apache.ignite.internal.processors.cache.distributed;
 
-import java.nio.ByteBuffer;
-import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteLogger;
-import org.apache.ignite.internal.GridDirectTransient;
+import org.apache.ignite.internal.Order;
+import org.apache.ignite.internal.managers.communication.ErrorMessage;
 import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
 import org.apache.ignite.internal.processors.cache.transactions.IgniteTxState;
 import 
org.apache.ignite.internal.processors.cache.transactions.IgniteTxStateAware;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
 import org.apache.ignite.internal.util.tostring.GridToStringBuilder;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
-import org.apache.ignite.internal.util.typedef.internal.U;
-import org.apache.ignite.plugin.extensions.communication.MessageReader;
-import org.apache.ignite.plugin.extensions.communication.MessageWriter;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * Response to prepare request.
  */
 public class GridDistributedTxPrepareResponse extends 
GridDistributedBaseMessage implements IgniteTxStateAware {
-    /** Error. */
+    /** Error message. */
     @GridToStringExclude
-    @GridDirectTransient
-    private Throwable err;
+    @Order(value = 7, method = "errorMessage")
+    private @Nullable ErrorMessage errMsg;
 
-    /** Serialized error. */
-    private byte[] errBytes;
-
-    /** Transient TX state. */
-    @GridDirectTransient
+    /** TX state. */
     private IgniteTxState txState;
 
-    /** */
+    /** Partition ID this message is targeted to. */
+    @Order(value = 8, method = "partition")
     private int part;
 
-    /** */
-    protected byte flags;
-
     /**
      * Empty constructor.
      */
@@ -77,31 +68,13 @@ public class GridDistributedTxPrepareResponse extends 
GridDistributedBaseMessage
      * @param err Error.
      * @param addDepInfo Deployment info flag.
      */
-    public GridDistributedTxPrepareResponse(int part, GridCacheVersion xid, 
Throwable err, boolean addDepInfo) {
+    public GridDistributedTxPrepareResponse(int part, GridCacheVersion xid, 
@Nullable Throwable err, boolean addDepInfo) {
         super(xid, 0, addDepInfo);
 
         this.part = part;
-        this.err = err;
-    }
 
-    /**
-     * Sets flag mask.
-     *
-     * @param flag Set or clear.
-     * @param mask Mask.
-     */
-    protected final void setFlag(boolean flag, int mask) {
-        flags = flag ? (byte)(flags | mask) : (byte)(flags & ~mask);
-    }
-
-    /**
-     * Reags flag mask.
-     *
-     * @param mask Mask to read.
-     * @return Flag value.
-     */
-    protected final boolean isFlag(int mask) {
-        return (flags & mask) != 0;
+        if (err != null)
+            errMsg = new ErrorMessage(err);
     }
 
     /** {@inheritDoc} */
@@ -109,23 +82,24 @@ public class GridDistributedTxPrepareResponse extends 
GridDistributedBaseMessage
         return part;
     }
 
-    /** {@inheritDoc} */
-    @Override public Throwable error() {
-        return err;
-    }
-
     /**
-     * @param err Error to set.
+     * @param part New Partition ID this message is targeted to.
      */
-    public void error(Throwable err) {
-        this.err = err;
+    public void partition(int part) {
+        this.part = part;
+    }
+
+    /** {@inheritDoc} */
+    @Override @Nullable public Throwable error() {
+        return ErrorMessage.error(errMsg);
     }
 
     /**
-     * @return Rollback flag.
+     * @param err Error to set.
      */
-    public boolean isRollback() {
-        return err != null;
+    public void error(@Nullable Throwable err) {
+        if (err != null)
+            errMsg = new ErrorMessage(err);
     }
 
     /** {@inheritDoc} */
@@ -144,104 +118,27 @@ public class GridDistributedTxPrepareResponse extends 
GridDistributedBaseMessage
     }
 
     /** {@inheritDoc} */
-    @Override public void prepareMarshal(GridCacheSharedContext<?, ?> ctx) 
throws IgniteCheckedException {
-        super.prepareMarshal(ctx);
-
-        if (err != null && errBytes == null)
-            errBytes = U.marshal(ctx, err);
-    }
-
-    /** {@inheritDoc} */
-    @Override public void finishUnmarshal(GridCacheSharedContext<?, ?> ctx, 
ClassLoader ldr) throws IgniteCheckedException {
-        super.finishUnmarshal(ctx, ldr);
-
-        if (errBytes != null && err == null)
-            err = U.unmarshal(ctx, errBytes, U.resolveClassLoader(ldr, 
ctx.gridConfig()));
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
-        writer.setBuffer(buf);
-
-        if (!super.writeTo(buf, writer))
-            return false;
-
-        if (!writer.isHeaderWritten()) {
-            if (!writer.writeHeader(directType()))
-                return false;
-
-            writer.onHeaderWritten();
-        }
-
-        switch (writer.state()) {
-            case 7:
-                if (!writer.writeByteArray(errBytes))
-                    return false;
-
-                writer.incrementState();
-
-            case 8:
-                if (!writer.writeByte(flags))
-                    return false;
-
-                writer.incrementState();
-
-            case 9:
-                if (!writer.writeInt(part))
-                    return false;
-
-                writer.incrementState();
-
-        }
-
-        return true;
+    @Override public short directType() {
+        return 26;
     }
 
-    /** {@inheritDoc} */
-    @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
-        reader.setBuffer(buf);
-
-        if (!super.readFrom(buf, reader))
-            return false;
-
-        switch (reader.state()) {
-            case 7:
-                errBytes = reader.readByteArray();
-
-                if (!reader.isLastRead())
-                    return false;
-
-                reader.incrementState();
-
-            case 8:
-                flags = reader.readByte();
-
-                if (!reader.isLastRead())
-                    return false;
-
-                reader.incrementState();
-
-            case 9:
-                part = reader.readInt();
-
-                if (!reader.isLastRead())
-                    return false;
-
-                reader.incrementState();
-
-        }
-
-        return true;
+    /**
+     * @return Error message.
+     */
+    public @Nullable ErrorMessage errorMessage() {
+        return errMsg;
     }
 
-    /** {@inheritDoc} */
-    @Override public short directType() {
-        return 26;
+    /**
+     * @param errMsg New error message.
+     */
+    public void errorMessage(@Nullable ErrorMessage errMsg) {
+        this.errMsg = errMsg;
     }
 
     /** {@inheritDoc} */
     @Override public String toString() {
         return 
GridToStringBuilder.toString(GridDistributedTxPrepareResponse.class, this, 
"err",
-            err == null ? "null" : err.toString(), "super", super.toString());
+            error() == null ? "null" : error().toString(), "super", 
super.toString());
     }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
index 97f5e35eb3a..5d4cb463892 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
@@ -1921,8 +1921,8 @@ public final class GridDhtTxPrepareFuture extends 
GridCacheCompoundFuture<Ignite
                 }
 
                 // Process invalid partitions (no need to remap).
-                if (!F.isEmpty(res.invalidPartitionsByCacheId())) {
-                    Map<Integer, int[]> invalidPartsMap = 
res.invalidPartitionsByCacheId();
+                if (!F.isEmpty(res.invalidPartitions())) {
+                    Map<Integer, int[]> invalidPartsMap = 
res.invalidPartitions();
 
                     for (Iterator<IgniteTxEntry> it = 
dhtMapping.entries().iterator(); it.hasNext();) {
                         IgniteTxEntry entry = it.next();
@@ -1951,7 +1951,7 @@ public final class GridDhtTxPrepareFuture extends 
GridCacheCompoundFuture<Ignite
 
                 boolean rec = 
cctx.gridEvents().isRecordable(EVT_CACHE_REBALANCE_OBJECT_LOADED);
 
-                for (GridCacheEntryInfo info : res.preloadEntries()) {
+                for (GridCacheEntryInfo info : 
F.emptyIfNull(res.preloadEntries())) {
                     GridCacheContext<?, ?> cacheCtx = 
cctx.cacheContext(info.cacheId());
 
                     GridCacheAdapter<?, ?> cache0 = cacheCtx.cache();
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareResponse.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareResponse.java
index 7a42845b099..7d13e13a41d 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareResponse.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareResponse.java
@@ -17,16 +17,12 @@
 
 package org.apache.ignite.internal.processors.cache.distributed.dht;
 
-import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import org.apache.ignite.IgniteCheckedException;
-import org.apache.ignite.internal.GridDirectCollection;
-import org.apache.ignite.internal.GridDirectMap;
+import org.apache.ignite.internal.Order;
 import org.apache.ignite.internal.processors.cache.GridCacheContext;
 import org.apache.ignite.internal.processors.cache.GridCacheEntryInfo;
 import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
@@ -34,12 +30,9 @@ import 
org.apache.ignite.internal.processors.cache.distributed.GridDistributedTx
 import org.apache.ignite.internal.processors.cache.transactions.IgniteTxKey;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
-import org.apache.ignite.internal.util.typedef.internal.CU;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgniteUuid;
-import 
org.apache.ignite.plugin.extensions.communication.MessageCollectionItemType;
-import org.apache.ignite.plugin.extensions.communication.MessageReader;
-import org.apache.ignite.plugin.extensions.communication.MessageWriter;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * DHT transaction prepare response.
@@ -47,22 +40,24 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageWriter;
 public class GridDhtTxPrepareResponse extends GridDistributedTxPrepareResponse 
{
     /** Evicted readers. */
     @GridToStringInclude
-    @GridDirectCollection(IgniteTxKey.class)
-    private Collection<IgniteTxKey> nearEvicted;
+    @Order(9)
+    private @Nullable Collection<IgniteTxKey> nearEvicted;
 
     /** Future ID.  */
+    @Order(value = 10, method = "futureId")
     private IgniteUuid futId;
 
     /** Mini future ID. */
+    @Order(11)
     private int miniId;
 
     /** Invalid partitions by cache ID. */
-    @GridDirectMap(keyType = Integer.class, valueType = int[].class)
-    private Map<Integer, int[]> invalidParts;
+    @Order(value = 12, method = "invalidPartitions")
+    private @Nullable Map<Integer, int[]> invalidParts;
 
-    /** Preload entries. */
-    @GridDirectCollection(GridCacheEntryInfo.class)
-    private List<GridCacheEntryInfo> preloadEntries;
+    /** Preload entries found on backup node. */
+    @Order(13)
+    private @Nullable List<GridCacheEntryInfo> preloadEntries;
 
     /**
      * Empty constructor.
@@ -120,14 +115,14 @@ public class GridDhtTxPrepareResponse extends 
GridDistributedTxPrepareResponse {
     /**
      * @return Evicted readers.
      */
-    public Collection<IgniteTxKey> nearEvicted() {
+    public @Nullable Collection<IgniteTxKey> nearEvicted() {
         return nearEvicted;
     }
 
     /**
-     * @param nearEvicted Evicted readers.
+     * @param nearEvicted New evicted readers.
      */
-    public void nearEvicted(Collection<IgniteTxKey> nearEvicted) {
+    public void nearEvicted(@Nullable Collection<IgniteTxKey> nearEvicted) {
         this.nearEvicted = nearEvicted;
     }
 
@@ -138,6 +133,13 @@ public class GridDhtTxPrepareResponse extends 
GridDistributedTxPrepareResponse {
         return futId;
     }
 
+    /**
+     * @param futId New future ID.
+     */
+    public void futureId(IgniteUuid futId) {
+        this.futId = futId;
+    }
+
     /**
      * @return Mini future ID.
      */
@@ -146,26 +148,38 @@ public class GridDhtTxPrepareResponse extends 
GridDistributedTxPrepareResponse {
     }
 
     /**
-     * @return Map from cacheId to an array of invalid partitions.
+     * @param miniId New mini future ID.
      */
-    Map<Integer, int[]> invalidPartitionsByCacheId() {
+    public void miniId(int miniId) {
+        this.miniId = miniId;
+    }
+
+    /**
+     * @return Invalid partitions by cache ID.
+     */
+    public @Nullable Map<Integer, int[]> invalidPartitions() {
         return invalidParts;
     }
 
     /**
-     * @param invalidPartsByCacheId Map from cache ID to an array of invalid 
partitions.
+     * @param invalidParts New invalid partitions by cache ID.
      */
-    public void invalidPartitionsByCacheId(Map<Integer, Set<Integer>> 
invalidPartsByCacheId) {
-        invalidParts = CU.convertInvalidPartitions(invalidPartsByCacheId);
+    public void invalidPartitions(@Nullable Map<Integer, int[]> invalidParts) {
+        this.invalidParts = invalidParts;
     }
 
     /**
-     * Gets preload entries found on backup node.
-     *
-     * @return Collection of entry infos need to be preloaded.
+     * @return Preload entries found on backup node.
+     */
+    public @Nullable Collection<GridCacheEntryInfo> preloadEntries() {
+        return preloadEntries;
+    }
+
+    /**
+     * @param preloadEntries New preload entries found on backup node.
      */
-    Collection<GridCacheEntryInfo> preloadEntries() {
-        return preloadEntries == null ? Collections.emptyList() : 
preloadEntries;
+    public void preloadEntries(@Nullable List<GridCacheEntryInfo> 
preloadEntries) {
+        this.preloadEntries = preloadEntries;
     }
 
     /**
@@ -226,109 +240,6 @@ public class GridDhtTxPrepareResponse extends 
GridDistributedTxPrepareResponse {
         }
     }
 
-    /** {@inheritDoc} */
-    @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
-        writer.setBuffer(buf);
-
-        if (!super.writeTo(buf, writer))
-            return false;
-
-        if (!writer.isHeaderWritten()) {
-            if (!writer.writeHeader(directType()))
-                return false;
-
-            writer.onHeaderWritten();
-        }
-
-        switch (writer.state()) {
-            case 10:
-                if (!writer.writeIgniteUuid(futId))
-                    return false;
-
-                writer.incrementState();
-
-            case 11:
-                if (!writer.writeMap(invalidParts, 
MessageCollectionItemType.INT, MessageCollectionItemType.INT_ARR))
-                    return false;
-
-                writer.incrementState();
-
-            case 12:
-                if (!writer.writeInt(miniId))
-                    return false;
-
-                writer.incrementState();
-
-            case 13:
-                if (!writer.writeCollection(nearEvicted, 
MessageCollectionItemType.MSG))
-                    return false;
-
-                writer.incrementState();
-
-            case 14:
-                if (!writer.writeCollection(preloadEntries, 
MessageCollectionItemType.MSG))
-                    return false;
-
-                writer.incrementState();
-
-        }
-
-        return true;
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
-        reader.setBuffer(buf);
-
-        if (!super.readFrom(buf, reader))
-            return false;
-
-        switch (reader.state()) {
-            case 10:
-                futId = reader.readIgniteUuid();
-
-                if (!reader.isLastRead())
-                    return false;
-
-                reader.incrementState();
-
-            case 11:
-                invalidParts = reader.readMap(MessageCollectionItemType.INT, 
MessageCollectionItemType.INT_ARR, false);
-
-                if (!reader.isLastRead())
-                    return false;
-
-                reader.incrementState();
-
-            case 12:
-                miniId = reader.readInt();
-
-                if (!reader.isLastRead())
-                    return false;
-
-                reader.incrementState();
-
-            case 13:
-                nearEvicted = 
reader.readCollection(MessageCollectionItemType.MSG);
-
-                if (!reader.isLastRead())
-                    return false;
-
-                reader.incrementState();
-
-            case 14:
-                preloadEntries = 
reader.readCollection(MessageCollectionItemType.MSG);
-
-                if (!reader.isLastRead())
-                    return false;
-
-                reader.incrementState();
-
-        }
-
-        return true;
-    }
-
     /** {@inheritDoc} */
     @Override public short directType() {
         return 35;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearLockFuture.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearLockFuture.java
index ee1ec02e8b4..27c01c51658 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearLockFuture.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearLockFuture.java
@@ -1245,8 +1245,8 @@ public final class GridNearLockFuture extends 
GridCacheCompoundIdentityFuture<Bo
                                         // returned value if any.
                                         entry.resetFromPrimary(newVal, 
lockVer, dhtVer, node.id(), topVer);
 
-                                        entry.readyNearLock(lockVer, 
mappedVer, res.committedVersions(),
-                                            res.rolledbackVersions(), 
res.pending());
+                                        entry.readyNearLock(lockVer, 
mappedVer, F.emptyIfNull(res.committedVersions()),
+                                            
F.emptyIfNull(res.rolledbackVersions()), res.pending());
 
                                         if (inTx() && implicitTx() && 
tx.onePhaseCommit()) {
                                             boolean pass = res.filterResult(i);
@@ -1671,8 +1671,8 @@ public final class GridNearLockFuture extends 
GridCacheCompoundIdentityFuture<Bo
 
                         entry.readyNearLock(lockVer,
                             mappedVer,
-                            res.committedVersions(),
-                            res.rolledbackVersions(),
+                            F.emptyIfNull(res.committedVersions()),
+                            F.emptyIfNull(res.rolledbackVersions()),
                             res.pending());
 
                         if (retval) {
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTransactionalCache.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTransactionalCache.java
index bd6dab6f579..d084ea3f335 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTransactionalCache.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTransactionalCache.java
@@ -228,8 +228,8 @@ public class GridNearTransactionalCache<K, V> extends 
GridNearCacheAdapter<K, V>
                                 req.version(),
                                 req.version(),
                                 null,
-                                req.committedVersions(),
-                                req.rolledbackVersions(),
+                                F.emptyIfNull(req.committedVersions()),
+                                F.emptyIfNull(req.rolledbackVersions()),
                                 /*system invalidate*/false);
 
                             // Note that we don't reorder completed versions 
here,
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareFutureAdapter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareFutureAdapter.java
index eac1bb81d3c..4c6ace62bf1 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareFutureAdapter.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareFutureAdapter.java
@@ -38,6 +38,7 @@ import 
org.apache.ignite.internal.processors.cache.transactions.IgniteTxKey;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
+import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.CU;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteReducer;
@@ -247,7 +248,7 @@ public abstract class GridNearTxPrepareFutureAdapter extends
 
         tx.implicitSingleResult(res.returnValue());
 
-        for (IgniteTxKey key : res.filterFailedKeys()) {
+        for (IgniteTxKey key : F.emptyIfNull(res.filterFailedKeys())) {
             IgniteTxEntry txEntry = tx.entry(key);
 
             assert txEntry != null : "Missing tx entry for write key: " + key;
@@ -280,7 +281,8 @@ public abstract class GridNearTxPrepareFutureAdapter extends
                 if (map != null)
                     map.dhtVersion(res.dhtVersion(), writeVer);
 
-                tx.readyNearLocks(m, res.pending(), res.committedVersions(), 
res.rolledbackVersions());
+                tx.readyNearLocks(m, F.emptyIfNull(res.pending()), 
F.emptyIfNull(res.committedVersions()),
+                    F.emptyIfNull(res.rolledbackVersions()));
             }
         }
     }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareResponse.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareResponse.java
index 666b18c8dcd..8d1ec23b760 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareResponse.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareResponse.java
@@ -17,15 +17,13 @@
 
 package org.apache.ignite.internal.processors.cache.distributed.near;
 
-import java.nio.ByteBuffer;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 import org.apache.ignite.IgniteCheckedException;
-import org.apache.ignite.internal.GridDirectCollection;
-import org.apache.ignite.internal.GridDirectTransient;
+import org.apache.ignite.internal.Order;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.CacheObject;
 import org.apache.ignite.internal.processors.cache.GridCacheContext;
@@ -34,64 +32,65 @@ import 
org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
 import 
org.apache.ignite.internal.processors.cache.distributed.GridDistributedTxPrepareResponse;
 import org.apache.ignite.internal.processors.cache.transactions.IgniteTxKey;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
-import org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
+import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteUuid;
-import 
org.apache.ignite.plugin.extensions.communication.MessageCollectionItemType;
-import org.apache.ignite.plugin.extensions.communication.MessageReader;
-import org.apache.ignite.plugin.extensions.communication.MessageWriter;
 import org.jetbrains.annotations.Nullable;
 
 /**
  * Near cache prepare response.
  */
 public class GridNearTxPrepareResponse extends 
GridDistributedTxPrepareResponse {
-    /** Tx onePhaseCommit flag on primary node. */
-    private static final int NEAR_PREPARE_ONE_PHASE_COMMIT_FLAG_MASK = 0x01;
-
-    /** Collection of versions that are pending and less than lock version. */
+    /** Versions that are less than lock version ({@link #version()}). */
     @GridToStringInclude
-    @GridDirectCollection(GridCacheVersion.class)
-    private Collection<GridCacheVersion> pending;
+    @Order(9)
+    private @Nullable Collection<GridCacheVersion> pending;
 
     /** Future ID.  */
+    @Order(value = 10, method = "futureId")
     private IgniteUuid futId;
 
     /** Mini future ID. */
+    @Order(11)
     private int miniId;
 
     /** DHT version. */
+    @Order(value = 12, method = "dhtVersion")
     private GridCacheVersion dhtVer;
 
     /** Write version. */
+    @Order(value = 13, method = "writeVersion")
     private GridCacheVersion writeVer;
 
     /** Map of owned values to set on near node. */
     @GridToStringInclude
-    @GridDirectTransient
     private Map<IgniteTxKey, CacheVersionedValue> ownedVals;
 
     /** OwnedVals' keys for marshalling. */
-    @GridToStringExclude
-    @GridDirectCollection(IgniteTxKey.class)
-    private Collection<IgniteTxKey> ownedValKeys;
+    @Order(value = 14, method = "ownedValuesKeys")
+    private @Nullable Collection<IgniteTxKey> ownedValKeys;
 
     /** OwnedVals' values for marshalling. */
-    @GridToStringExclude
-    @GridDirectCollection(CacheVersionedValue.class)
-    private Collection<CacheVersionedValue> ownedValVals;
+    @Order(value = 15, method = "ownedValuesValues")
+    private @Nullable Collection<CacheVersionedValue> ownedValVals;
 
     /** Cache return value. */
+    @Order(value = 16, method = "returnValue")
     private GridCacheReturn retVal;
 
-    /** Filter failed keys. */
-    @GridDirectCollection(IgniteTxKey.class)
-    private Collection<IgniteTxKey> filterFailedKeys;
+    /** Keys that did not pass the filter. */
+    @Order(17)
+    private @Nullable Collection<IgniteTxKey> filterFailedKeys;
+
+    /** Topology version, which is set when client node should remap lock 
request. */
+    @Order(value = 18, method = "clientRemapVersion")
+    private @Nullable AffinityTopologyVersion clientRemapVer;
 
-    /** Not {@code null} if client node should remap transaction. */
-    private AffinityTopologyVersion clientRemapVer;
+    /** One-phase commit on primary flag. */
+    @Order(19)
+    private boolean onePhaseCommit;
 
     /**
      * Empty constructor.
@@ -120,8 +119,8 @@ public class GridNearTxPrepareResponse extends 
GridDistributedTxPrepareResponse
         GridCacheVersion dhtVer,
         GridCacheVersion writeVer,
         GridCacheReturn retVal,
-        Throwable err,
-        AffinityTopologyVersion clientRemapVer,
+        @Nullable Throwable err,
+        @Nullable AffinityTopologyVersion clientRemapVer,
         boolean onePhaseCommit,
         boolean addDepInfo
     ) {
@@ -136,40 +135,48 @@ public class GridNearTxPrepareResponse extends 
GridDistributedTxPrepareResponse
         this.writeVer = writeVer;
         this.retVal = retVal;
         this.clientRemapVer = clientRemapVer;
-
-        if (onePhaseCommit)
-            flags |= NEAR_PREPARE_ONE_PHASE_COMMIT_FLAG_MASK;
+        this.onePhaseCommit = onePhaseCommit;
     }
 
     /**
-     * @return One-phase commit state on primary node.
+     * @return One-phase commit on primary flag.
      */
     public boolean onePhaseCommit() {
-        return isFlag(NEAR_PREPARE_ONE_PHASE_COMMIT_FLAG_MASK);
+        return onePhaseCommit;
+    }
+
+    /**
+     * @param onePhaseCommit New one-phase commit on primary flag.
+     */
+    public void onePhaseCommit(boolean onePhaseCommit) {
+        this.onePhaseCommit = onePhaseCommit;
     }
 
     /**
-     * @return {@code True} if client node should remap transaction.
+     * @return Topology version, which is set when client node should remap 
lock request.
      */
-    @Nullable AffinityTopologyVersion clientRemapVersion() {
+    @Nullable public AffinityTopologyVersion clientRemapVersion() {
         return clientRemapVer;
     }
 
     /**
-     * Gets pending versions that are less than {@link #version()}.
-     *
-     * @return Pending versions.
+     * @param clientRemapVer New topology version, which is set when client 
node should remap lock request.
      */
-    public Collection<GridCacheVersion> pending() {
-        return pending == null ? Collections.emptyList() : pending;
+    public void clientRemapVersion(@Nullable AffinityTopologyVersion 
clientRemapVer) {
+        this.clientRemapVer = clientRemapVer;
     }
 
     /**
-     * Sets pending versions that are less than {@link #version()}.
-     *
-     * @param pending Pending versions.
+     * @return Versions that are less than lock version ({@link #version()}).
+     */
+    public @Nullable Collection<GridCacheVersion> pending() {
+        return pending;
+    }
+
+    /**
+     * @param pending New versions that are less than lock version ({@link 
#version()}).
      */
-    public void pending(Collection<GridCacheVersion> pending) {
+    public void pending(@Nullable Collection<GridCacheVersion> pending) {
         this.pending = pending;
     }
 
@@ -180,6 +187,13 @@ public class GridNearTxPrepareResponse extends 
GridDistributedTxPrepareResponse
         return miniId;
     }
 
+    /**
+     * @param miniId New mini future ID.
+     */
+    public void miniId(int miniId) {
+        this.miniId = miniId;
+    }
+
     /**
      * @return Future ID.
      */
@@ -187,6 +201,13 @@ public class GridNearTxPrepareResponse extends 
GridDistributedTxPrepareResponse
         return futId;
     }
 
+    /**
+     * @param futId New future ID.
+     */
+    public void futureId(IgniteUuid futId) {
+        this.futId = futId;
+    }
+
     /**
      * @return DHT version.
      */
@@ -194,6 +215,13 @@ public class GridNearTxPrepareResponse extends 
GridDistributedTxPrepareResponse
         return dhtVer;
     }
 
+    /**
+     * @param dhtVer New DHT version.
+     */
+    public void dhtVersion(GridCacheVersion dhtVer) {
+        this.dhtVer = dhtVer;
+    }
+
     /**
      * @return Write version.
      */
@@ -201,6 +229,13 @@ public class GridNearTxPrepareResponse extends 
GridDistributedTxPrepareResponse
         return writeVer;
     }
 
+    /**
+     * @param writeVer New write version.
+     */
+    public void writeVersion(GridCacheVersion writeVer) {
+        this.writeVer = writeVer;
+    }
+
     /**
      * Adds owned value.
      *
@@ -221,31 +256,38 @@ public class GridNearTxPrepareResponse extends 
GridDistributedTxPrepareResponse
     }
 
     /**
-     * @return Owned values map.
+     * @return Map of owned values to set on near node.
      */
     public Map<IgniteTxKey, CacheVersionedValue> ownedValues() {
         return ownedVals == null ? Collections.emptyMap() : 
Collections.unmodifiableMap(ownedVals);
     }
 
     /**
-     * @return Return value.
+     * @return Cache return value.
      */
     public GridCacheReturn returnValue() {
         return retVal;
     }
 
     /**
-     * @param filterFailedKeys Collection of keys that did not pass the filter.
+     * @param retVal New cache return value.
+     */
+    public void returnValue(GridCacheReturn retVal) {
+        this.retVal = retVal;
+    }
+
+    /**
+     * @param filterFailedKeys Keys that did not pass the filter.
      */
-    public void filterFailedKeys(Collection<IgniteTxKey> filterFailedKeys) {
+    public void filterFailedKeys(@Nullable Collection<IgniteTxKey> 
filterFailedKeys) {
         this.filterFailedKeys = filterFailedKeys;
     }
 
     /**
-     * @return Collection of keys that did not pass the filter.
+     * @return New keys that did not pass the filter.
      */
-    public Collection<IgniteTxKey> filterFailedKeys() {
-        return filterFailedKeys == null ? Collections.emptyList() : 
filterFailedKeys;
+    public @Nullable Collection<IgniteTxKey> filterFailedKeys() {
+        return filterFailedKeys;
     }
 
     /**
@@ -253,14 +295,46 @@ public class GridNearTxPrepareResponse extends 
GridDistributedTxPrepareResponse
      * @return {@code True} if response has owned value for given key.
      */
     public boolean hasOwnedValue(IgniteTxKey key) {
-        return ownedVals != null && ownedVals.containsKey(key);
+        return F.mapContainsKey(ownedVals, key);
+    }
+
+    /**
+     * @return OwnedVals' keys for marshalling.
+     */
+    public @Nullable Collection<IgniteTxKey> ownedValuesKeys() {
+        return ownedValKeys;
+    }
+
+    /**
+     * @param ownedValKeys New ownedVals' keys for marshalling.
+     */
+    public void ownedValuesKeys(@Nullable Collection<IgniteTxKey> 
ownedValKeys) {
+        this.ownedValKeys = ownedValKeys;
+    }
+
+    /**
+     * @return OwnedVals' values for marshalling.
+     */
+    public @Nullable Collection<CacheVersionedValue> ownedValuesValues() {
+        return ownedValVals;
     }
 
-    /** {@inheritDoc}
-     * @param ctx*/
+    /**
+     * @param ownedValVals New ownedVals' values for marshalling.
+     */
+    public void ownedValuesValues(@Nullable Collection<CacheVersionedValue> 
ownedValVals) {
+        this.ownedValVals = ownedValVals;
+    }
+
+    /** {@inheritDoc} */
     @Override public void prepareMarshal(GridCacheSharedContext<?, ?> ctx) 
throws IgniteCheckedException {
         super.prepareMarshal(ctx);
 
+        // There are separate collections for keys and values of the 
'ownedVals' map, because IgniteTxKey
+        // can not be inserted directly in a map as a key during invocation of 
MessageReader#read.
+        // The IgniteTxKey's hash code calculation will fail due to delegation 
of calculation
+        // to KeyCacheObjectImpl#hashCode, which in turn fails with assertion 
error if KeyCacheObjectImpl#val
+        // has not initialized yet in KeyCacheObjectImpl#finishUnmarshal.
         if (ownedVals != null && ownedValKeys == null) {
             ownedValKeys = ownedVals.keySet();
 
@@ -296,6 +370,11 @@ public class GridNearTxPrepareResponse extends 
GridDistributedTxPrepareResponse
     @Override public void finishUnmarshal(GridCacheSharedContext<?, ?> ctx, 
ClassLoader ldr) throws IgniteCheckedException {
         super.finishUnmarshal(ctx, ldr);
 
+        // There are separate collections for keys and values of the 
'ownedVals' map, because IgniteTxKey
+        // can not be inserted directly in a map as a key during invocation of 
MessageReader#read.
+        // The IgniteTxKey's hash code calculation will fail due to delegation 
of calculation
+        // to KeyCacheObjectImpl#hashCode, which in turn fails with assertion 
error if KeyCacheObjectImpl#val
+        // has not initialized yet in KeyCacheObjectImpl#finishUnmarshal.
         if (ownedValKeys != null && ownedVals == null) {
             ownedVals = U.newHashMap(ownedValKeys.size());
 
@@ -329,7 +408,7 @@ public class GridNearTxPrepareResponse extends 
GridDistributedTxPrepareResponse
         }
 
         if (filterFailedKeys != null) {
-            for (IgniteTxKey key :filterFailedKeys) {
+            for (IgniteTxKey key : filterFailedKeys) {
                 GridCacheContext<?, ?> cctx = ctx.cacheContext(key.cacheId());
 
                 key.finishUnmarshal(cctx, ldr);
@@ -337,177 +416,6 @@ public class GridNearTxPrepareResponse extends 
GridDistributedTxPrepareResponse
         }
     }
 
-    /** {@inheritDoc} */
-    @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
-        writer.setBuffer(buf);
-
-        if (!super.writeTo(buf, writer))
-            return false;
-
-        if (!writer.isHeaderWritten()) {
-            if (!writer.writeHeader(directType()))
-                return false;
-
-            writer.onHeaderWritten();
-        }
-
-        switch (writer.state()) {
-            case 10:
-                if (!writer.writeAffinityTopologyVersion(clientRemapVer))
-                    return false;
-
-                writer.incrementState();
-
-            case 11:
-                if (!writer.writeMessage(dhtVer))
-                    return false;
-
-                writer.incrementState();
-
-            case 12:
-                if (!writer.writeCollection(filterFailedKeys, 
MessageCollectionItemType.MSG))
-                    return false;
-
-                writer.incrementState();
-
-            case 13:
-                if (!writer.writeIgniteUuid(futId))
-                    return false;
-
-                writer.incrementState();
-
-            case 14:
-                if (!writer.writeInt(miniId))
-                    return false;
-
-                writer.incrementState();
-
-            case 15:
-                if (!writer.writeCollection(ownedValKeys, 
MessageCollectionItemType.MSG))
-                    return false;
-
-                writer.incrementState();
-
-            case 16:
-                if (!writer.writeCollection(ownedValVals, 
MessageCollectionItemType.MSG))
-                    return false;
-
-                writer.incrementState();
-
-            case 17:
-                if (!writer.writeCollection(pending, 
MessageCollectionItemType.MSG))
-                    return false;
-
-                writer.incrementState();
-
-            case 18:
-                if (!writer.writeMessage(retVal))
-                    return false;
-
-                writer.incrementState();
-
-            case 19:
-                if (!writer.writeMessage(writeVer))
-                    return false;
-
-                writer.incrementState();
-        }
-
-        return true;
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
-        reader.setBuffer(buf);
-
-        if (!super.readFrom(buf, reader))
-            return false;
-
-        switch (reader.state()) {
-            case 10:
-                clientRemapVer = reader.readAffinityTopologyVersion();
-
-                if (!reader.isLastRead())
-                    return false;
-
-                reader.incrementState();
-
-            case 11:
-                dhtVer = reader.readMessage();
-
-                if (!reader.isLastRead())
-                    return false;
-
-                reader.incrementState();
-
-            case 12:
-                filterFailedKeys = 
reader.readCollection(MessageCollectionItemType.MSG);
-
-                if (!reader.isLastRead())
-                    return false;
-
-                reader.incrementState();
-
-            case 13:
-                futId = reader.readIgniteUuid();
-
-                if (!reader.isLastRead())
-                    return false;
-
-                reader.incrementState();
-
-            case 14:
-                miniId = reader.readInt();
-
-                if (!reader.isLastRead())
-                    return false;
-
-                reader.incrementState();
-
-            case 15:
-                ownedValKeys = 
reader.readCollection(MessageCollectionItemType.MSG);
-
-                if (!reader.isLastRead())
-                    return false;
-
-                reader.incrementState();
-
-            case 16:
-                ownedValVals = 
reader.readCollection(MessageCollectionItemType.MSG);
-
-                if (!reader.isLastRead())
-                    return false;
-
-                reader.incrementState();
-
-            case 17:
-                pending = reader.readCollection(MessageCollectionItemType.MSG);
-
-                if (!reader.isLastRead())
-                    return false;
-
-                reader.incrementState();
-
-            case 18:
-                retVal = reader.readMessage();
-
-                if (!reader.isLastRead())
-                    return false;
-
-                reader.incrementState();
-
-            case 19:
-                writeVer = reader.readMessage();
-
-                if (!reader.isLastRead())
-                    return false;
-
-                reader.incrementState();
-        }
-
-        return true;
-    }
-
     /** {@inheritDoc} */
     @Override public short directType() {
         return 56;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java
index e7db4d35009..989065fa15b 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java
@@ -1228,7 +1228,7 @@ public class IgniteTxHandler {
                     req.txState(nearTx.txState());
 
                 if (dhtTx != null && !F.isEmpty(dhtTx.invalidPartitions()))
-                    res.invalidPartitionsByCacheId(dhtTx.invalidPartitions());
+                    
res.invalidPartitions(CU.convertInvalidPartitions(dhtTx.invalidPartitions()));
 
                 if (req.onePhaseCommit()) {
                     assert req.last();
@@ -1856,7 +1856,7 @@ public class IgniteTxHandler {
                 tx.state(PREPARED);
             }
 
-            res.invalidPartitionsByCacheId(tx.invalidPartitions());
+            
res.invalidPartitions(CU.convertInvalidPartitions(tx.invalidPartitions()));
 
             if (tx.empty() && req.last()) {
                 tx.skipCompletedVersions(req.skipCompletedVersion());
diff --git a/modules/core/src/main/resources/META-INF/classnames.properties 
b/modules/core/src/main/resources/META-INF/classnames.properties
index ce5be10be7d..8b4f49c41ad 100644
--- a/modules/core/src/main/resources/META-INF/classnames.properties
+++ b/modules/core/src/main/resources/META-INF/classnames.properties
@@ -1151,7 +1151,6 @@ 
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomic
 
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicSingleUpdateRequest
 
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicUpdateRequest
 
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicUpdateResponse
-org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicAbstractSingleUpdateRequest
 
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicAbstractUpdateFuture$1
 
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicAbstractUpdateFuture$DhtLeftResult
 
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicAbstractUpdateFuture$UpdateReplyClosureContextAware

Reply via email to