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:
For a cache without an expiry policy the constructor skips the branch that
sets initTime, so expireTime() hits assert initTime > 0 before the check that
would return 0, and GridNearCacheAdapter.entryEx reaches it through
GridNearCacheEntry.initializeFromDht on every near entry lookup. Please move
the initTime assignment above the if (expireTime != 0) branch so it is set for
every entry.
##########
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 clamped a negative result back to 0 with the comment Account for
overflow, and GridDhtPartitionDemander.preloadEntry asserts row.expireTime() >=
0. Please clamp the sum in expireTime() the same way, and compare the delta
with < 0 rather than == -1L, since selfUnmarshal read the whole negative range
as no expiration.
##########
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:
initTime is not transferred and the wire still carries two longs, so the
count is unchanged. The terms of the constant are Java object sizes while both
users of marshalledSize(), the batch cut-off in
GridDhtPartitionSupplyMessage.addEntry0 and the rebalance bytes metric in
GridDhtPartitionDemander, read the result as bytes on the wire, so please raise
a separate ticket to settle which of the two it estimates.
--
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]