IGNITE-443 Moved CacheConflictResolver interfaces to Ignite.

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

Branch: refs/heads/ignite-443
Commit: 2f17a25bdb10d8392fd0de122d94667fcfd87b19
Parents: 9426a74
Author: nikolay_tikhonov <ntikho...@gridgain.com>
Authored: Wed Mar 11 17:28:04 2015 +0300
Committer: nikolay_tikhonov <ntikho...@gridgain.com>
Committed: Wed Mar 11 17:28:04 2015 +0300

----------------------------------------------------------------------
 .../ignite/internal/GridKernalContextImpl.java  |  3 +
 .../cache/CacheConflictResolverManager.java     | 28 +++++++
 .../processors/cache/CacheResolveEntryImpl.java | 79 ++++++++++++++++++++
 .../DrReceiverCacheConflictContextImpl.java     | 64 ++++++++++++++++
 .../processors/cache/GridCacheContext.java      | 18 ++---
 .../GridCacheEntryAbstractConflictResolver.java | 57 ++++++++++++++
 .../processors/cache/GridCacheProcessor.java    |  7 +-
 .../IgniteCacheConflictResolverManager.java     | 33 ++++++++
 .../processors/cache/dr/GridCacheDrManager.java |  5 --
 .../cache/dr/os/GridOsCacheDrManager.java       |  5 --
 ...ridCacheVersionAbstractConflictResolver.java | 56 --------------
 .../GridCacheVersionConflictResolver.java       | 76 +++++++++++++------
 .../loadtests/hashmap/GridCacheTestContext.java |  4 +-
 13 files changed, 334 insertions(+), 101 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2f17a25b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
index 2bc44a3..455819c 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal;
 
 import org.apache.ignite.*;
+import org.apache.ignite.cache.*;
 import org.apache.ignite.configuration.*;
 import org.apache.ignite.internal.managers.checkpoint.*;
 import org.apache.ignite.internal.managers.collision.*;
@@ -789,6 +790,8 @@ public class GridKernalContextImpl implements 
GridKernalContext, Externalizable
             return (T)new GridOsPortableProcessor(this);
         else if (cls.equals(IgniteCacheSerializationManager.class))
             return (T)new IgniteCacheOsSerializationManager();
+        else if (cls.equals(CacheConflictResolver.class))
+            return (T)new IgniteCacheConflictResolverManager();
 
         throw new IgniteException("Unsupported component type: " + cls);
     }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2f17a25b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheConflictResolverManager.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheConflictResolverManager.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheConflictResolverManager.java
new file mode 100644
index 0000000..ea1e1b0
--- /dev/null
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheConflictResolverManager.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+/**
+ *
+ */
+public abstract class CacheConflictResolverManager<K, V> extends 
GridCacheManagerAdapter<K, V> {
+    /**
+     * @return Cache conflict resolver.
+     */
+    public abstract GridCacheEntryAbstractConflictResolver conflictResolver();
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2f17a25b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheResolveEntryImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheResolveEntryImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheResolveEntryImpl.java
new file mode 100644
index 0000000..c966f13
--- /dev/null
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheResolveEntryImpl.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import org.apache.ignite.cache.*;
+import org.apache.ignite.internal.processors.cache.version.*;
+import org.jetbrains.annotations.*;
+
+/**
+ * DR cache entry implementation.
+ */
+public class CacheResolveEntryImpl<K, V> implements CacheResolveEntry<K, V> {
+    /** Underlying cache versioned entry. */
+    private final GridCacheVersionedEntry<K, V> entry;
+
+    /**
+     * Constructor.
+     *
+     * @param entry Underlying cache versioned entry.
+     */
+    public CacheResolveEntryImpl(GridCacheVersionedEntry<K, V> entry) {
+        this.entry = entry;
+    }
+
+    /** {@inheritDoc} */
+    @Override public K key() {
+        return entry.key();
+    }
+
+    /** {@inheritDoc} */
+    @Nullable @Override public V value() {
+        return entry.value();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long ttl() {
+        return entry.ttl();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long expireTime() {
+        return entry.expireTime();
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte dataCenterId() {
+        return entry.dataCenterId();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int topologyVersion() {
+        return entry.topologyVersion();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long order() {
+        return entry.order();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long globalTime() {
+        return entry.globalTime();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2f17a25b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DrReceiverCacheConflictContextImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DrReceiverCacheConflictContextImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DrReceiverCacheConflictContextImpl.java
new file mode 100644
index 0000000..99c19f4
--- /dev/null
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DrReceiverCacheConflictContextImpl.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import org.apache.ignite.cache.*;
+import org.apache.ignite.internal.processors.cache.version.*;
+import org.jetbrains.annotations.*;
+
+/**
+ * DR conflict context implementation.
+ */
+public class DrReceiverCacheConflictContextImpl<K, V> implements 
CacheConflictContext<K, V> {
+    /** Underlying cache conflict context. */
+    private final GridCacheVersionConflictContext<K, V> ctx;
+
+    /**
+     * Constructor.
+     *
+     * @param ctx Underlying cache conflict context.
+     */
+    public 
DrReceiverCacheConflictContextImpl(GridCacheVersionConflictContext<K, V> ctx) {
+        this.ctx = ctx;
+    }
+
+    /** {@inheritDoc} */
+    @Override public CacheResolveEntry<K, V> oldEntry() {
+        return new CacheResolveEntryImpl<>(ctx.oldEntry());
+    }
+
+    /** {@inheritDoc} */
+    @Override public CacheResolveEntry<K, V> newEntry() {
+        return new CacheResolveEntryImpl<>(ctx.newEntry());
+    }
+
+    /** {@inheritDoc} */
+    @Override public void useOld() {
+        ctx.useOld();
+    }
+
+    /** {@inheritDoc} */
+    @Override public void useNew() {
+        ctx.useNew();
+    }
+
+    /** {@inheritDoc} */
+    @Override public void merge(@Nullable V mergeVal, long ttl) {
+        ctx.merge(mergeVal, ttl);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2f17a25b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
index 44f8e69..0493085 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
@@ -138,6 +138,9 @@ public class GridCacheContext<K, V> implements 
Externalizable {
     /** JTA manager. */
     private CacheJtaManagerAdapter<K, V> jtaMgr;
 
+    /** Conflict resolver manager. */
+    private CacheConflictResolverManager rslvrMgr;
+
     /** Managers. */
     private List<GridCacheManager<K, V>> mgrs = new LinkedList<>();
 
@@ -202,7 +205,7 @@ public class GridCacheContext<K, V> implements 
Externalizable {
     private CacheWeakQueryIteratorsHolder<Map.Entry<K, V>> itHolder;
 
     /** Conflict resolver. */
-    private GridCacheVersionAbstractConflictResolver conflictRslvr;
+    private GridCacheEntryAbstractConflictResolver conflictRslvr;
 
     /**
      * Empty constructor required for {@link Externalizable}.
@@ -249,7 +252,8 @@ public class GridCacheContext<K, V> implements 
Externalizable {
         CacheDataStructuresManager<K, V> dataStructuresMgr,
         GridCacheTtlManager<K, V> ttlMgr,
         GridCacheDrManager<K, V> drMgr,
-        CacheJtaManagerAdapter<K, V> jtaMgr) {
+        CacheJtaManagerAdapter<K, V> jtaMgr,
+        CacheConflictResolverManager<K, V> rslvrMgr) {
         assert ctx != null;
         assert sharedCtx != null;
         assert cacheCfg != null;
@@ -263,6 +267,7 @@ public class GridCacheContext<K, V> implements 
Externalizable {
         assert affMgr != null;
         assert dataStructuresMgr != null;
         assert ttlMgr != null;
+        assert rslvrMgr != null;
 
         this.ctx = ctx;
         this.sharedCtx = sharedCtx;
@@ -284,6 +289,7 @@ public class GridCacheContext<K, V> implements 
Externalizable {
         this.ttlMgr = add(ttlMgr);
         this.drMgr = add(drMgr);
         this.jtaMgr = add(jtaMgr);
+        this.rslvrMgr = add(rslvrMgr);
 
         log = ctx.log(getClass());
 
@@ -330,13 +336,7 @@ public class GridCacheContext<K, V> implements 
Externalizable {
      * Initialize conflict resolver after all managers are started.
      */
     void initConflictResolver() {
-        // Conflict resolver is determined in two stages:
-        // 1. If DR receiver hub is enabled, then pick it from DR manager.
-        // 2. Otherwise instantiate default resolver in case local store is 
configured.
-        conflictRslvr = drMgr.conflictResolver();
-
-        if (conflictRslvr == null && storeMgr.isLocalStore())
-            conflictRslvr = new GridCacheVersionConflictResolver();
+        conflictRslvr = rslvrMgr.conflictResolver();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2f17a25b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryAbstractConflictResolver.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryAbstractConflictResolver.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryAbstractConflictResolver.java
new file mode 100644
index 0000000..ad6a60d
--- /dev/null
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryAbstractConflictResolver.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import org.apache.ignite.*;
+import org.apache.ignite.internal.processors.cache.version.*;
+
+/**
+ * Cache version conflict resolver.
+ */
+public abstract class GridCacheEntryAbstractConflictResolver {
+    /**
+     * Resolve the conflict.
+     *
+     * @param oldEntry Old entry.
+     * @param newEntry New entry.
+     * @param atomicVerComparator Whether to use atomic version comparator.
+     * @return Conflict resolution context.
+     * @throws IgniteCheckedException If failed.
+     */
+    public <K, V> GridCacheVersionConflictContext<K, V> 
resolve(GridCacheVersionedEntryEx<K, V> oldEntry,
+        GridCacheVersionedEntryEx<K, V> newEntry, boolean atomicVerComparator) 
throws IgniteCheckedException {
+        GridCacheVersionConflictContext<K, V> ctx = new 
GridCacheVersionConflictContext<>(oldEntry, newEntry);
+
+        resolve0(ctx, oldEntry, newEntry, atomicVerComparator);
+
+        return ctx;
+    }
+
+    /**
+     * Internal conflict resolution routine.
+     *
+     * @param ctx Context.
+     * @param oldEntry Old entry.
+     * @param newEntry New entry.
+     * @param atomicVerComparator Whether to use atomic version comparator.
+     * @throws IgniteCheckedException If failed.
+     */
+    protected abstract <K, V> void resolve0(GridCacheVersionConflictContext<K, 
V> ctx,
+        GridCacheVersionedEntryEx<K, V> oldEntry, GridCacheVersionedEntryEx<K, 
V> newEntry,
+        boolean atomicVerComparator) throws IgniteCheckedException;
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2f17a25b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
index 7f945da..70e6328 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
@@ -640,6 +640,7 @@ public class GridCacheProcessor extends 
GridProcessorAdapter {
             GridCacheTtlManager ttlMgr = new GridCacheTtlManager();
             GridCacheDrManager drMgr = 
ctx.createComponent(GridCacheDrManager.class);
             IgniteCacheSerializationManager serMgr = 
ctx.createComponent(IgniteCacheSerializationManager.class);
+            CacheConflictResolverManager rslvrMgr = 
ctx.createComponent(CacheConflictResolverManager.class);
 
             GridCacheStoreManager storeMgr = new GridCacheStoreManager(ctx, 
sesHolders, cfgStore, cfg);
 
@@ -663,7 +664,8 @@ public class GridCacheProcessor extends 
GridProcessorAdapter {
                 dataStructuresMgr,
                 ttlMgr,
                 drMgr,
-                jta);
+                jta,
+                rslvrMgr);
 
             cacheCtx.defaultAffMapper(dfltAffMapper);
 
@@ -803,7 +805,8 @@ public class GridCacheProcessor extends 
GridProcessorAdapter {
                     dataStructuresMgr,
                     ttlMgr,
                     drMgr,
-                    jta);
+                    jta,
+                    rslvrMgr);
 
                 cacheCtx.defaultAffMapper(dfltAffMapper);
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2f17a25b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheConflictResolverManager.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheConflictResolverManager.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheConflictResolverManager.java
new file mode 100644
index 0000000..50cc508
--- /dev/null
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheConflictResolverManager.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import org.apache.ignite.internal.processors.cache.version.*;
+
+/**
+ *
+ */
+public class IgniteCacheConflictResolverManager<K ,V> extends 
CacheConflictResolverManager<K ,V> {
+    /**
+     * @return Cache conflict resolver.
+     */
+    @Override public GridCacheEntryAbstractConflictResolver conflictResolver() 
{
+        return new 
GridCacheVersionConflictResolver(cctx.config().getConflictResolverMode(),
+            cctx.config().getConflictResolver());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2f17a25b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/dr/GridCacheDrManager.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/dr/GridCacheDrManager.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/dr/GridCacheDrManager.java
index 85831a8..4162af4 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/dr/GridCacheDrManager.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/dr/GridCacheDrManager.java
@@ -33,11 +33,6 @@ public interface GridCacheDrManager<K, V> extends 
GridCacheManager<K, V> {
     public byte dataCenterId();
 
     /**
-     * @return Cache version conflict resolver.
-     */
-    public GridCacheVersionAbstractConflictResolver conflictResolver();
-
-    /**
      * Performs replication.
      *
      * @param key Key.

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2f17a25b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/dr/os/GridOsCacheDrManager.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/dr/os/GridOsCacheDrManager.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/dr/os/GridOsCacheDrManager.java
index 49f617b..e3744fb 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/dr/os/GridOsCacheDrManager.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/dr/os/GridOsCacheDrManager.java
@@ -64,11 +64,6 @@ public class GridOsCacheDrManager<K, V> implements 
GridCacheDrManager<K, V> {
     }
 
     /** {@inheritDoc} */
-    @Override public GridCacheVersionAbstractConflictResolver 
conflictResolver() {
-        return null;
-    }
-
-    /** {@inheritDoc} */
     @Override public void replicate(K key,
         @Nullable byte[] keyBytes,
         @Nullable V val,

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2f17a25b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionAbstractConflictResolver.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionAbstractConflictResolver.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionAbstractConflictResolver.java
deleted file mode 100644
index 8bc6425..0000000
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionAbstractConflictResolver.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.processors.cache.version;
-
-import org.apache.ignite.*;
-
-/**
- * Cache version conflict resolver.
- */
-public abstract class GridCacheVersionAbstractConflictResolver {
-    /**
-     * Resolve the conflict.
-     *
-     * @param oldEntry Old entry.
-     * @param newEntry New entry.
-     * @param atomicVerComparator Whether to use atomic version comparator.
-     * @return Conflict resolution context.
-     * @throws IgniteCheckedException If failed.
-     */
-    public <K, V> GridCacheVersionConflictContext<K, V> 
resolve(GridCacheVersionedEntryEx<K, V> oldEntry,
-        GridCacheVersionedEntryEx<K, V> newEntry, boolean atomicVerComparator) 
throws IgniteCheckedException {
-        GridCacheVersionConflictContext<K, V> ctx = new 
GridCacheVersionConflictContext<>(oldEntry, newEntry);
-
-        resolve0(ctx, oldEntry, newEntry, atomicVerComparator);
-
-        return ctx;
-    }
-
-    /**
-     * Internal conflict resolution routine.
-     *
-     * @param ctx Context.
-     * @param oldEntry Old entry.
-     * @param newEntry New entry.
-     * @param atomicVerComparator Whether to use atomic version comparator.
-     * @throws IgniteCheckedException If failed.
-     */
-    protected abstract <K, V> void resolve0(GridCacheVersionConflictContext<K, 
V> ctx,
-        GridCacheVersionedEntryEx<K, V> oldEntry, GridCacheVersionedEntryEx<K, 
V> newEntry,
-        boolean atomicVerComparator) throws IgniteCheckedException;
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2f17a25b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionConflictResolver.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionConflictResolver.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionConflictResolver.java
index 869993c..896d151 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionConflictResolver.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionConflictResolver.java
@@ -18,41 +18,71 @@
 package org.apache.ignite.internal.processors.cache.version;
 
 import org.apache.ignite.*;
+import org.apache.ignite.cache.*;
 import org.apache.ignite.internal.processors.cache.*;
 
+import static org.apache.ignite.cache.CacheConflictResolverMode.*;
+
 /**
  * Default conflict resolver.
  */
-public class GridCacheVersionConflictResolver extends 
GridCacheVersionAbstractConflictResolver {
+public class GridCacheVersionConflictResolver extends 
GridCacheEntryAbstractConflictResolver {
+    /** Mode. */
+    protected final CacheConflictResolverMode mode;
+
+    /** Resolver. */
+    protected final CacheConflictResolver rslvr;
+
+    /**
+     * Constructor.
+     *
+     * @param mode Mode.
+     * @param rslvr Resolver.
+     */
+    public GridCacheVersionConflictResolver(CacheConflictResolverMode mode, 
CacheConflictResolver rslvr) {
+        this.mode = mode;
+        this.rslvr = rslvr;
+    }
+
     /** {@inheritDoc} */
     @Override protected <K, V> void 
resolve0(GridCacheVersionConflictContext<K, V> ctx,
         GridCacheVersionedEntryEx<K, V> oldEntry, GridCacheVersionedEntryEx<K, 
V> newEntry,
         boolean atomicVerComparator) throws IgniteCheckedException {
-        if (newEntry.dataCenterId() != oldEntry.dataCenterId())
+        if (mode == ALWAYS) {
+            if (rslvr != null) {
+                // Try falling back to user resolver.
+                rslvr.resolve(new DrReceiverCacheConflictContextImpl(ctx));
+
+                ctx.manualResolve();
+            }
+            else
+                // No other option, but to use new entry.
+                ctx.useNew();
+
+            return;
+        }
+
+        if (oldEntry.isStartVersion())
             ctx.useNew();
         else {
-            if (oldEntry.isStartVersion())
-                ctx.useNew();
+            if (atomicVerComparator) {
+                // Handle special case when version check using ATOMIC cache 
comparator is required.
+                if 
(GridCacheMapEntry.ATOMIC_VER_COMPARATOR.compare(oldEntry.version(), 
newEntry.version()) >= 0)
+                    ctx.useOld();
+                else
+                    ctx.useNew();
+            }
             else {
-                if (atomicVerComparator) {
-                    // Handle special case when version check using ATOMIC 
cache comparator is required.
-                    if 
(GridCacheMapEntry.ATOMIC_VER_COMPARATOR.compare(oldEntry.version(), 
newEntry.version()) >= 0)
-                        ctx.useOld();
-                    else
-                        ctx.useNew();
-                }
-                else {
-                    long topVerDiff = newEntry.topologyVersion() - 
oldEntry.topologyVersion();
-
-                    if (topVerDiff > 0)
-                        ctx.useNew();
-                    else if (topVerDiff < 0)
-                        ctx.useOld();
-                    else if (newEntry.order() > oldEntry.order())
-                        ctx.useNew();
-                    else
-                        ctx.useOld();
-                }
+                long topVerDiff = newEntry.topologyVersion() - 
oldEntry.topologyVersion();
+
+                if (topVerDiff > 0)
+                    ctx.useNew();
+                else if (topVerDiff < 0)
+                    ctx.useOld();
+                else if (newEntry.order() > oldEntry.order())
+                    ctx.useNew();
+                else
+                    ctx.useOld();
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2f17a25b/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridCacheTestContext.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridCacheTestContext.java
 
b/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridCacheTestContext.java
index 8ba8966..44ac6a1 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridCacheTestContext.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridCacheTestContext.java
@@ -69,6 +69,8 @@ public class GridCacheTestContext<K, V> extends 
GridCacheContext<K, V> {
             new CacheDataStructuresManager<K, V>(),
             new GridCacheTtlManager<K, V>(),
             new GridOsCacheDrManager<K, V>(),
-            new CacheNoopJtaManager<K, V>());
+            new CacheNoopJtaManager<K, V>(),
+            new IgniteCacheConflictResolverManager<K, V>()
+        );
     }
 }

Reply via email to