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} */