Repository: incubator-ignite
Updated Branches:
  refs/heads/ignite-283-tx 7309772dc -> bfaebf2d3


# IGNITE-283: Fixes.


Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/bfaebf2d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/bfaebf2d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/bfaebf2d

Branch: refs/heads/ignite-283-tx
Commit: bfaebf2d3e3d250b851e53cc176de211e085ad1f
Parents: 7309772
Author: vozerov <voze...@gridgain.com>
Authored: Tue Feb 24 10:40:32 2015 +0300
Committer: vozerov <voze...@gridgain.com>
Committed: Tue Feb 24 10:40:32 2015 +0300

----------------------------------------------------------------------
 .../processors/cache/GridCacheMapEntry.java     | 74 ++++++++------------
 .../GridDistributedTxRemoteAdapter.java         |  3 +-
 .../cache/transactions/IgniteTxAdapter.java     | 54 +++++++-------
 3 files changed, 60 insertions(+), 71 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/bfaebf2d/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
----------------------------------------------------------------------
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 653d8ec..cc76206 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
@@ -47,6 +47,7 @@ import java.util.concurrent.atomic.*;
 
 import static org.apache.ignite.events.EventType.*;
 import static org.apache.ignite.internal.processors.cache.CacheFlag.*;
+import static 
org.apache.ignite.internal.processors.cache.GridCacheOperation.DELETE;
 import static org.apache.ignite.internal.processors.dr.GridDrType.*;
 import static org.apache.ignite.transactions.TransactionState.*;
 
@@ -1612,8 +1613,8 @@ public abstract class GridCacheMapEntry<K, V> implements 
GridCacheEntryEx<K, V>
                         valBytes = null;
                     }
 
-                    GridTuple3<Long, Long, Boolean> expiration = 
ttlAndExpireTime(expiryPlc,
-                        explicitTtl, explicitExpireTime);
+                    GridTuple3<Long, Long, Boolean> expiration = 
ttlAndExpireTime(expiryPlc, explicitTtl,
+                        explicitExpireTime);
 
                     // Prepare old and new entries for conflict resolution.
                     GridCacheVersionedEntryEx<K, V> oldEntry = 
versionedEntry();
@@ -2144,60 +2145,41 @@ public abstract class GridCacheMapEntry<K, V> 
implements GridCacheEntryEx<K, V>
      * Get TTL, expire time and remove flag for the given entry, expiration 
policy and explicit TTL and expire time.
      *
      * @param expiry Expiration policy.
-     * @param explicitTtl Explicit TTL.
-     * @param explicitExpireTime Explicit expire time.
+     * @param ttl Explicit TTL.
+     * @param expireTime Explicit expire time.
      * @return Result.
      */
-    private GridTuple3<Long, Long, Boolean> 
ttlAndExpireTime(IgniteCacheExpiryPolicy expiry, long explicitTtl,
-        long explicitExpireTime) {
-        long ttl;
-        long expireTime;
-        boolean rmv;
+    private GridTuple3<Long, Long, Boolean> 
ttlAndExpireTime(IgniteCacheExpiryPolicy expiry, long ttl, long expireTime)
+        throws GridCacheEntryRemovedException {
+        boolean rmv = false;
 
-        if (explicitTtl != CU.TTL_NOT_CHANGED) {
-            // TTL is set explicitly.
-            assert explicitTtl != CU.TTL_MINIMUM && explicitTtl >= 0L;
+        // 1. If TTL is not changed, then calculate it based on expiry.
+        if (ttl == CU.TTL_NOT_CHANGED) {
+            if (expiry != null)
+                ttl = hasValueUnlocked() ? expiry.forUpdate() : 
expiry.forCreate();
+        }
 
-            ttl = explicitTtl;
-            expireTime = explicitExpireTime != CU.EXPIRE_TIME_CALCULATE ?
-                explicitExpireTime : CU.toExpireTime(explicitTtl);
-            rmv = false;
+        // 2. If TTL is zero, then set delete marker.
+        if (ttl == CU.TTL_ZERO) {
+            rmv = true;
+
+            ttl = CU.TTL_ETERNAL;
         }
-        else {
-            // Need to calculate TTL.
-            if (expiry != null) {
-                // Expiry exists.
-                long sysTtl = hasValueUnlocked() ? expiry.forUpdate() : 
expiry.forCreate();
-
-                if (sysTtl == CU.TTL_ZERO) {
-                    // Entry must be expired immediately.
-                    ttl = CU.TTL_MINIMUM;
-                    expireTime = CU.expireTimeInPast();
-                    rmv = true;
-                }
-                else if (sysTtl == CU.TTL_NOT_CHANGED) {
-                    // TTL is not changed.
-                    ttl = ttlExtras();
-                    expireTime = CU.toExpireTime(ttl);
-                    rmv = false;
-                }
-                else {
-                    // TTL is changed.
-                    assert sysTtl >= 0;
 
-                    ttl = sysTtl;
-                    expireTime = CU.toExpireTime(ttl);
-                    rmv = false;
-                }
-            }
-            else {
-                // No expiry, entry is immortal.
+        // 3. If TTL is still not changed, then either use old entry TTL or 
set it to "ETERNAL".
+        if (ttl == CU.TTL_NOT_CHANGED) {
+            if (isNew())
                 ttl = CU.TTL_ETERNAL;
-                expireTime = CU.EXPIRE_TIME_ETERNAL;
-                rmv = false;
+            else {
+                ttl = ttlExtras();
+                expireTime = expireTimeExtras();
             }
         }
 
+        // 1.4 If expire time was not set explicitly, then calculate it.
+        if (expireTime == CU.EXPIRE_TIME_CALCULATE)
+            expireTime = CU.toExpireTime(ttl);
+
         return F.t(ttl, expireTime, rmv);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/bfaebf2d/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxRemoteAdapter.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxRemoteAdapter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxRemoteAdapter.java
index f920e04..473d025 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxRemoteAdapter.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxRemoteAdapter.java
@@ -629,7 +629,8 @@ public class GridDistributedTxRemoteAdapter<K, V> extends 
IgniteTxAdapter<K, V>
                                                         val0 = (V) 
valBytesTuple.get();
                                                     else
                                                         valBytes0 = 
valBytesTuple.get();
-                                                } else
+                                                }
+                                                else
                                                     val0 = cached.rawGet();
 
                                                 
nearCached.updateOrEvict(xidVer, val0, valBytes0, cached.expireTime(),

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/bfaebf2d/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java
index 0dbd552..ae4020a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java
@@ -1296,50 +1296,56 @@ public abstract class IgniteTxAdapter<K, V> extends 
GridMetadataAwareAdapter
      * @throws IgniteCheckedException In case of eny exception.
      * @throws GridCacheEntryRemovedException If entry got removed.
      */
+    @SuppressWarnings({"unchecked", "ConstantConditions"})
     protected IgniteBiTuple<GridCacheOperation, 
GridCacheVersionConflictContext<K, V>> conflictResolve(
         GridCacheOperation op, IgniteTxEntry txEntry, V newVal, byte[] 
newValBytes, GridCacheVersion newVer,
         GridCacheEntryEx<K, V> old)
         throws IgniteCheckedException, GridCacheEntryRemovedException {
         assert newVer != null;
 
-        // 1. Convert TTL and expire time.
+        // 1. Calculate TTL and expire time.
         long newTtl = txEntry.ttl();
         long newExpireTime = txEntry.conflictExpireTime();
 
+        // 1.1. If TTL is not changed, then calculate it based on expiry.
         if (newTtl == CU.TTL_NOT_CHANGED) {
-            assert op == DELETE || newVer.conflictVersion().dataCenterId() == 
cctx.dataCenterId() :
-                "TTL can be not-explicit only for local updates.";
-
             ExpiryPolicy expiry = txEntry.context().expiryForTxEntry(txEntry);
 
-            if (expiry == null) {
-                newTtl = CU.TTL_ETERNAL;
-                newExpireTime = CU.EXPIRE_TIME_ETERNAL;
-            }
-            else {
-                if (op == DELETE) {
-                    newTtl = CU.TTL_ETERNAL;
-                    newExpireTime = CU.EXPIRE_TIME_ETERNAL;
-                }
-                else if (op == CREATE)
-                    newTtl = CU.toTtl(expiry.getExpiryForUpdate());
+            if (expiry != null) {
+                if (op == CREATE)
+                    newTtl = CU.toTtl(expiry.getExpiryForCreation());
                 else if (op == UPDATE)
                     newTtl = CU.toTtl(expiry.getExpiryForUpdate());
             }
+        }
 
-            if (newTtl == CU.TTL_ZERO) {
-                newTtl = CU.TTL_MINIMUM;
-                newExpireTime = CU.expireTimeInPast();
-            }
+        // 1.2. If TTL is set to zero, then mark operation as "DELETE".
+        if (newTtl == CU.TTL_ZERO) {
+            op = DELETE;
+
+            newTtl = CU.TTL_ETERNAL;
         }
-        else if (newTtl == CU.TTL_ZERO) {
-            assert newVer.conflictVersion().dataCenterId() == 
cctx.dataCenterId() :
-                "TTL can be not-explicit only for local updates.";
 
-            newTtl = CU.TTL_MINIMUM;
-            newExpireTime = CU.expireTimeInPast();
+        // 1.3. If TTL is still not changed, then either use old entry TTL or 
set it to "ETERNAL".
+        if (newTtl == CU.TTL_NOT_CHANGED) {
+            if (old.isNew())
+                newTtl = CU.TTL_ETERNAL;
+            else {
+                newTtl = old.rawTtl();
+                newExpireTime = old.rawExpireTime();
+            }
         }
 
+        // TTL must be resolved at this point.
+        assert newTtl != CU.TTL_ZERO && newTtl != CU.TTL_NOT_CHANGED;
+
+        // 1.4 If expire time was not set explicitly, then calculate it.
+        if (newExpireTime == CU.EXPIRE_TIME_CALCULATE)
+            newExpireTime = CU.toExpireTime(newTtl);
+
+        // Expire time must be resolved at this point.
+        assert newExpireTime != CU.EXPIRE_TIME_CALCULATE;
+
         // Construct old entry info.
         GridCacheVersionedEntryEx<K, V> oldEntry = old.versionedEntry();
 

Reply via email to