anton-vinogradov commented on code in PR #13447:
URL: https://github.com/apache/ignite/pull/13447#discussion_r3753940822


##########
modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryInfo.java:
##########
@@ -64,58 +68,70 @@ 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.
+     * see {@link #expireTimeDelta}.
      */
-    public void cacheId(int cacheId) {
+    public GridCacheEntryInfo() {
+        initTime = U.currentTimeMillis();

Review Comment:
   Yes, always: expireTime() asserts initTime > 0 before the check that would 
return 0, so for a cache without an expiry policy it throws inside the near 
lock future listener and the future never completes, 
GridCacheNearPrimarySyncSelfTest hangs 18 minutes on f95cc504. Please set 
initTime unconditionally, the same test then passes in 0.25 s.



##########
modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryInfo.java:
##########
@@ -64,58 +68,70 @@ 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.
+     * see {@link #expireTimeDelta}.
      */
-    public void cacheId(int cacheId) {
+    public GridCacheEntryInfo() {
+        initTime = U.currentTimeMillis();
+    }
+
+    /** */
+    public GridCacheEntryInfo(int cacheId, KeyCacheObject key, @Nullable 
CacheObject val, GridCacheVersion ver, long expireTime, long ttl) {
+        assert expireTime >= 0;
+
+        if (expireTime != 0) {
+            initTime = U.currentTimeMillis();
+
+            expireTimeDelta = expireTime - initTime;
+
+            // In theory, here we can get the thread paused causing a negative 
delta value. Possible negative values
+            // shouldn't be treated as disabled expiration. Correct behavior 
is expired timeout.
+            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;
-    }
+        assert initTime > 0;
+        assert expireTimeDelta >= -1L;
 
-    /**
-     * @param expireTime Expiration time.
-     */
-    public void expireTime(long expireTime) {
-        this.expireTime = expireTime;
+        return expireTimeDelta == -1L ? 0L : initTime + expireTimeDelta;

Review Comment:
   initTime + expireTimeDelta has no overflow guard, while the removed 
selfUnmarshal had one with the comment "Account for overflow" and 
GridDhtPartitionDemander.preloadEntry asserts row.expireTime() >= 0. 
selfUnmarshal also read any negative remainder as no expiration, while the 
getter now compares with -1 only, so a foreign negative value becomes a time in 
the past instead of eternal.



##########
modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryInfo.java:
##########
@@ -190,30 +192,6 @@ public int marshalledSize(CacheObjectContext ctx) throws 
IgniteCheckedException
         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() {

Review Comment:
   Agreed, nothing is missed, initTime is not transferred and the wire still 
carries two longs. Worth a separate ticket though: the constant counts Java 
object sizes while both users of marshalledSize() treat the result as wire 
bytes, so supply batches and the rebalance bytes metric are off several times 
for small entries.



##########
modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java:
##########
@@ -396,23 +396,14 @@ protected GridDhtLocalPartition localPartition() {
 
         try {
             if (!obsolete()) {
-                info = new GridCacheEntryInfo();
-
-                info.key(key);
-                info.cacheId(cctx.cacheId());
-
                 long expireTime = expireTimeExtras();
 
-                boolean expired = expireTime != 0 && expireTime <= 
U.currentTimeMillis();
+                CacheObject val0 = expireTime == 0 || expireTime > 
U.currentTimeMillis() ? val : null;

Review Comment:
   The decision is currently split across two clock reads, expireTime > 
U.currentTimeMillis() here and expireTime - U.currentTimeMillis() in the 
constructor. On different ticks the entry goes out with its value while the 
delta is clamped to 0, so the value arrives already expired.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to