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

anton-vinogradov 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 341b2557a01 IGNITE-28920 Reduce MarshallableMessage scope: 
GridCacheEntryInfo uses marshal hooks only to rebase expireTime (#13447)
341b2557a01 is described below

commit 341b2557a014d0f3e97608598a01bfe117dfdc9e
Author: Vladimir Steshin <[email protected]>
AuthorDate: Wed Aug 12 14:09:54 2026 +0300

    IGNITE-28920 Reduce MarshallableMessage scope: GridCacheEntryInfo uses 
marshal hooks only to rebase expireTime (#13447)
---
 .../processors/cache/GridCacheEntryInfo.java       | 128 ++++++++++-----------
 .../processors/cache/GridCacheMapEntry.java        |  16 +--
 .../cache/distributed/dht/GridDhtGetFuture.java    |  20 ++--
 .../distributed/dht/GridDhtGetSingleFuture.java    |  20 ++--
 .../dht/preloader/GridDhtPartitionSupplier.java    |  20 ++--
 .../processors/cache/GridCacheTestEntryEx.java     |  11 +-
 6 files changed, 96 insertions(+), 119 deletions(-)

diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryInfo.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryInfo.java
index 90012c72bda..05e812ca8b2 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryInfo.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryInfo.java
@@ -19,24 +19,25 @@ package org.apache.ignite.internal.processors.cache;
 
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.Order;
-import org.apache.ignite.internal.SelfMarshallingMessage;
 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.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.plugin.extensions.communication.CacheIdAware;
+import org.apache.ignite.plugin.extensions.communication.Message;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * Entry information that gets passed over wire.
  */
-public class GridCacheEntryInfo implements SelfMarshallingMessage, 
CacheIdAware {
+public class GridCacheEntryInfo implements CacheIdAware, Message {
     /** */
     private static final int SIZE_OVERHEAD = 3 * 8 /* reference */ + 4 /* int 
*/ + 2 * 8 /* long */ + 32 /* version */;
 
     /** Cache key. */
     @Order(0)
     @GridToStringInclude
-    KeyCacheObject key;
+    @Nullable KeyCacheObject key;
 
     /** Cache ID. */
     @Order(1)
@@ -44,15 +45,18 @@ public class GridCacheEntryInfo implements 
SelfMarshallingMessage, CacheIdAware
 
     /** Cache value. */
     @Order(2)
-    CacheObject val;
+    @Nullable CacheObject val;
 
     /** Time to live. */
     @Order(3)
     long ttl;
 
-    /** Expiration time. */
+    /** Base time to calculate {@link #expireTime()}. */
+    private long initTime;
+
+    /** Expiration time delta to transfer. -1 if no expiration is used. */
     @Order(4)
-    long expireTime;
+    long expireTimeDelta = -1L;
 
     /** Entry version. */
     @Order(5)
@@ -64,58 +68,82 @@ public class GridCacheEntryInfo implements 
SelfMarshallingMessage, CacheIdAware
     /** Deleted flag. */
     private boolean deleted;
 
-    /** {@inheritDoc} */
-    @Override public int cacheId() {
-        return cacheId;
-    }
-
     /**
-     * @param cacheId Cache ID.
+     * Empty constructor for serialization purposes. Initializes {@link 
#initTime} to properly calculate {@link #expireTime()}
+     * if {@link #expireTimeDelta} and the expiration is effective. If no 
expiration is set, initialization of {@link #initTime}
+     * is not required, but it is a tradeoff for absence of the message 
serealization lifecycle awareness.
      */
-    public void cacheId(int cacheId) {
+    public GridCacheEntryInfo() {
+        initTime = U.currentTimeMillis();
+    }
+
+    /** */
+    public GridCacheEntryInfo(
+        int cacheId,
+        KeyCacheObject key,
+        @Nullable CacheObject val,
+        GridCacheVersion ver,
+        long initTime,
+        long expireTime,
+        long ttl
+    ) {
+        assert expireTime >= 0;
+        assert initTime > 0;
+
+        this.initTime = initTime;
+
+        if (expireTime > 0) {
+            expireTimeDelta = expireTime - initTime;
+
+            // Timeout mark.
+            if (expireTimeDelta < 0)
+                expireTimeDelta = 0;
+        }
+
         this.cacheId = cacheId;
+        this.key = key;
+        this.val = val;
+        this.ver = ver;
+        this.ttl = ttl;
+    }
+
+    /** {@inheritDoc} */
+    @Override public int cacheId() {
+        return cacheId;
     }
 
     /**
      * @param key Entry key.
      */
-    public void key(KeyCacheObject key) {
+    public void key(@Nullable KeyCacheObject key) {
         this.key = key;
     }
 
     /**
      * @return Entry key.
      */
-    public KeyCacheObject key() {
+    @Nullable public KeyCacheObject key() {
         return key;
     }
 
     /**
      * @return Entry value.
      */
-    public CacheObject value() {
+    public @Nullable CacheObject value() {
         return val;
     }
 
     /**
-     * @param val Entry value.
-     */
-    public void value(CacheObject val) {
-        this.val = val;
-    }
-
-    /**
-     * @return Expire time.
+     * @return Expire time >= 0. 0 means no expiration is set.
      */
     public long expireTime() {
-        return expireTime;
-    }
+        if (expireTimeDelta == -1L)
+            return 0L;
 
-    /**
-     * @param expireTime Expiration time.
-     */
-    public void expireTime(long expireTime) {
-        this.expireTime = expireTime;
+        long res = initTime + expireTimeDelta;
+
+        // Overflow protection.
+        return res < 0 ? 0 : res;
     }
 
     /**
@@ -125,13 +153,6 @@ public class GridCacheEntryInfo implements 
SelfMarshallingMessage, CacheIdAware
         return ttl;
     }
 
-    /**
-     * @param ttl Time to live.
-     */
-    public void ttl(long ttl) {
-        this.ttl = ttl;
-    }
-
     /**
      * @return Version.
      */
@@ -139,13 +160,6 @@ public class GridCacheEntryInfo implements 
SelfMarshallingMessage, CacheIdAware
         return ver;
     }
 
-    /**
-     * @param ver Version.
-     */
-    public void version(GridCacheVersion ver) {
-        this.ver = ver;
-    }
-
     /**
      * @return New flag.
      */
@@ -190,30 +204,6 @@ public class GridCacheEntryInfo implements 
SelfMarshallingMessage, CacheIdAware
         return SIZE_OVERHEAD + size;
     }
 
-    // TODO IGNITE-28920: the rebase still runs inside the message; move it to 
the code filling and reading the entry.
-    /** {@inheritDoc} */
-    @Override public void selfMarshal() {
-        if (expireTime == 0)
-            expireTime = -1;
-        else {
-            expireTime -= U.currentTimeMillis();
-
-            if (expireTime < 0)
-                expireTime = 0;
-        }
-    }
-
-    /** {@inheritDoc} */
-    @Override public void selfUnmarshal() {
-        long remaining = expireTime;
-
-        expireTime = remaining < 0 ? 0 : U.currentTimeMillis() + remaining;
-
-        // Account for overflow.
-        if (expireTime < 0)
-            expireTime = 0;
-    }
-
     /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(GridCacheEntryInfo.class, this);
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
index e50b225d1ef..021fdd0408d 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
@@ -396,23 +396,15 @@ public abstract class GridCacheMapEntry extends 
GridMetadataAwareAdapter impleme
 
         try {
             if (!obsolete()) {
-                info = new GridCacheEntryInfo();
-
-                info.key(key);
-                info.cacheId(cctx.cacheId());
-
+                long curTime = U.currentTimeMillis();
                 long expireTime = expireTimeExtras();
 
-                boolean expired = expireTime != 0 && expireTime <= 
U.currentTimeMillis();
+                CacheObject val0 = expireTime == 0 || expireTime > curTime ? 
val : null;
+
+                info = new GridCacheEntryInfo(cctx.cacheId(), key, val0, ver, 
curTime, expireTime, ttlExtras());
 
-                info.ttl(ttlExtras());
-                info.expireTime(expireTime);
-                info.version(ver);
                 info.setNew(isStartVersion());
                 info.setDeleted(deletedUnlocked());
-
-                if (!expired)
-                    info.value(val);
             }
         }
         finally {
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetFuture.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetFuture.java
index 5a758535315..8d52758910c 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetFuture.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetFuture.java
@@ -29,7 +29,6 @@ import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.internal.IgniteInternalFuture;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
-import org.apache.ignite.internal.processors.cache.CacheObject;
 import org.apache.ignite.internal.processors.cache.EntryGetResult;
 import org.apache.ignite.internal.processors.cache.GridCacheContext;
 import org.apache.ignite.internal.processors.cache.GridCacheEntryInfo;
@@ -497,19 +496,22 @@ public final class GridDhtGetFuture<K, V> extends 
GridCompoundIdentityFuture<Col
 
         Collection<GridCacheEntryInfo> infos = new ArrayList<>(map.size());
 
+        long curTime = U.currentTimeMillis();
+
         for (Map.Entry<KeyCacheObject, EntryGetResult> entry : map.entrySet()) 
{
             EntryGetResult val = entry.getValue();
 
             assert val != null;
 
-            GridCacheEntryInfo info = new GridCacheEntryInfo();
-
-            info.cacheId(cctx.cacheId());
-            info.key(entry.getKey());
-            info.value(skipVals ? null : (CacheObject)val.value());
-            info.version(val.version());
-            info.expireTime(val.expireTime());
-            info.ttl(val.ttl());
+            GridCacheEntryInfo info = new GridCacheEntryInfo(
+                cctx.cacheId(),
+                entry.getKey(),
+                skipVals ? null : val.value(),
+                val.version(),
+                curTime,
+                val.expireTime(),
+                val.ttl()
+            );
 
             infos.add(info);
         }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetSingleFuture.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetSingleFuture.java
index f58ac9d30b8..24ce1643fea 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetSingleFuture.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetSingleFuture.java
@@ -27,7 +27,6 @@ import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.internal.IgniteInternalFuture;
 import org.apache.ignite.internal.NodeStoppingException;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
-import org.apache.ignite.internal.processors.cache.CacheObject;
 import org.apache.ignite.internal.processors.cache.EntryGetResult;
 import org.apache.ignite.internal.processors.cache.GridCacheContext;
 import org.apache.ignite.internal.processors.cache.GridCacheEntryInfo;
@@ -463,16 +462,15 @@ public final class GridDhtGetSingleFuture<K, V> extends 
GridFutureAdapter<GridCa
 
         assert val != null;
 
-        GridCacheEntryInfo info = new GridCacheEntryInfo();
-
-        info.cacheId(cctx.cacheId());
-        info.key(key);
-        info.value(skipVals ? null : (CacheObject)val.value());
-        info.version(val.version());
-        info.expireTime(val.expireTime());
-        info.ttl(val.ttl());
-
-        return info;
+        return new GridCacheEntryInfo(
+            cctx.cacheId(),
+            key,
+            skipVals ? null : val.value(),
+            val.version(),
+            U.currentTimeMillis(),
+            val.expireTime(),
+            val.ttl()
+        );
     }
 
     /**
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionSupplier.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionSupplier.java
index 25157306343..2f760c976fe 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionSupplier.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionSupplier.java
@@ -294,8 +294,8 @@ public class GridDhtPartitionSupplier {
                 remainingParts = sctx.remainingParts;
             }
 
-            final int msgMaxSize = grp.preloader().batchSize();
-
+            int msgMaxSize = grp.preloader().batchSize();
+            long curTime = U.currentTimeMillis();
             long batchesCnt = 0;
 
             while (iter.hasNext()) {
@@ -349,13 +349,15 @@ public class GridDhtPartitionSupplier {
                 if (!remainingParts.contains(part))
                     continue;
 
-                GridCacheEntryInfo info = new GridCacheEntryInfo();
-
-                info.key(row.key());
-                info.cacheId(row.cacheId());
-                info.value(row.value());
-                info.version(row.version());
-                info.expireTime(row.expireTime());
+                GridCacheEntryInfo info = new GridCacheEntryInfo(
+                    row.cacheId(),
+                    row.key(),
+                    row.value(),
+                    row.version(),
+                    curTime,
+                    row.expireTime(),
+                    0
+                );
 
                 supplyMsg.addEntry0(part, iter.historical(part), info, 
grp.shared(), grp.cacheObjectContext());
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java
index 640cd98a8aa..d4971a8b26e 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java
@@ -33,6 +33,7 @@ import 
org.apache.ignite.internal.processors.cache.version.GridCacheVersionedEnt
 import org.apache.ignite.internal.processors.dr.GridDrType;
 import 
org.apache.ignite.internal.processors.query.schema.SchemaIndexCacheVisitorClosure;
 import org.apache.ignite.internal.util.lang.GridMetadataAwareAdapter;
+import org.apache.ignite.internal.util.typedef.internal.U;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -269,15 +270,7 @@ public class GridCacheTestEntryEx extends 
GridMetadataAwareAdapter implements Gr
 
     /** {@inheritDoc} */
     @Override public GridCacheEntryInfo info() {
-        GridCacheEntryInfo info = new GridCacheEntryInfo();
-
-        info.key(key());
-        info.value(val);
-        info.ttl(ttl());
-        info.expireTime(expireTime());
-        info.version(version());
-
-        return info;
+        return new GridCacheEntryInfo(0, key(), val, version(), 
U.currentTimeMillis(), expireTime(), ttl());
     }
 
     /** {@inheritDoc} */

Reply via email to