You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ag...@apache.org on 2017/05/24 17:27:01 UTC

[17/41] ignite git commit: ignite-5212 Allow custom affinity function for data structures cache

ignite-5212 Allow custom affinity function for data structures cache


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

Branch: refs/heads/ignite-5267
Commit: f353faf1be5f26cf4ea069d13a9194bcf18840bb
Parents: 42018e6
Author: Vladislav Pyatkov <vl...@gmail.com>
Authored: Tue May 23 15:33:39 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Tue May 23 15:33:39 2017 +0300

----------------------------------------------------------------------
 .../configuration/AtomicConfiguration.java      |  25 +++
 .../org/apache/ignite/internal/IgnitionEx.java  |   1 +
 .../AtomicCacheAffinityConfigurationTest.java   | 175 +++++++++++++++++++
 .../IgniteCacheDataStructuresSelfTestSuite.java |   3 +
 4 files changed, 204 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/f353faf1/modules/core/src/main/java/org/apache/ignite/configuration/AtomicConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/AtomicConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/AtomicConfiguration.java
index 573e803..a9f1ea2 100644
--- a/modules/core/src/main/java/org/apache/ignite/configuration/AtomicConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/configuration/AtomicConfiguration.java
@@ -19,6 +19,7 @@ package org.apache.ignite.configuration;
 
 import org.apache.ignite.IgniteAtomicSequence;
 import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.affinity.AffinityFunction;
 import org.apache.ignite.internal.util.typedef.internal.S;
 
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
@@ -45,6 +46,9 @@ public class AtomicConfiguration {
     /** Number of backups. */
     private int backups = DFLT_BACKUPS;
 
+    /** Affinity function */
+    private AffinityFunction aff;
+
     /**
      * @return Number of backup nodes.
      */
@@ -107,6 +111,27 @@ public class AtomicConfiguration {
         return this;
     }
 
+    /**
+     * Gets atomic cache affinity function.
+     *
+     * @return Affinity function or null, if not set.
+     */
+    public AffinityFunction getAffinity() {
+        return aff;
+    }
+
+    /**
+     * Sets atomic cache affinity function.
+     *
+     * @param aff Affinity function.
+     * @return {@code this} for chaining.
+     */
+    public AtomicConfiguration setAffinity(AffinityFunction aff) {
+        this.aff = aff;
+
+        return this;
+    }
+
     /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(AtomicConfiguration.class, this);

http://git-wip-us.apache.org/repos/asf/ignite/blob/f353faf1/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java b/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
index 4b34891..e19fe70 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
@@ -2421,6 +2421,7 @@ public class IgnitionEx {
             ccfg.setWriteSynchronizationMode(FULL_SYNC);
             ccfg.setCacheMode(cfg.getCacheMode());
             ccfg.setNodeFilter(CacheConfiguration.ALL_NODES);
+            ccfg.setAffinity(cfg.getAffinity());
             ccfg.setRebalanceOrder(-1); //Prior to user caches.
 
             if (cfg.getCacheMode() == PARTITIONED)

http://git-wip-us.apache.org/repos/asf/ignite/blob/f353faf1/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/AtomicCacheAffinityConfigurationTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/AtomicCacheAffinityConfigurationTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/AtomicCacheAffinityConfigurationTest.java
new file mode 100644
index 0000000..7b7d9b5
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/AtomicCacheAffinityConfigurationTest.java
@@ -0,0 +1,175 @@
+/*
+ * 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.Ignite;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.affinity.AffinityFunction;
+import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
+import org.apache.ignite.configuration.AtomicConfiguration;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+/**
+ */
+public class AtomicCacheAffinityConfigurationTest extends GridCommonAbstractTest {
+    /** Affinity function. */
+    private AffinityFunction affinityFunction;
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+        return super.getConfiguration(igniteInstanceName)
+            .setAtomicConfiguration(new AtomicConfiguration()
+            .setCacheMode(CacheMode.PARTITIONED)
+            .setAffinity(affinityFunction));
+    }
+
+    /**
+     * @throws Exception If failed.
+     *
+     */
+    public void testRendezvousAffinity() throws Exception {
+        try {
+            affinityFunction = new RendezvousAffinityFunction(false, 10);
+
+            startGrids(3);
+
+            for (int i = 0; i < 3; i++) {
+                IgniteEx igniteEx = grid(i);
+
+                CacheConfiguration cConf = igniteEx.context().cache().cache("ignite-atomics-sys-cache").configuration();
+
+                AffinityFunction aff = cConf.getAffinity();
+
+                assertNotNull(aff);
+
+                assertEquals(aff.partitions(), affinityFunction.partitions());
+
+                assertEquals(aff.getClass(), affinityFunction.getClass());
+            }
+
+            checkAtomics();
+        }
+        finally {
+            stopAllGrids();
+        }
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testTestAffinity() throws Exception {
+        try {
+            affinityFunction = new TestAffinityFunction("Some value");
+
+            startGrids(3);
+
+            for (int i = 0; i < 3; i++) {
+                IgniteEx igniteEx = grid(i);
+
+                CacheConfiguration cConf = igniteEx.context().cache().cache("ignite-atomics-sys-cache").configuration();
+
+                TestAffinityFunction aff = (TestAffinityFunction)cConf.getAffinity();
+
+                assertNotNull(aff);
+
+                assertEquals(aff.partitions(), affinityFunction.partitions());
+
+                assertEquals(aff.getCustomAttribute(), ((TestAffinityFunction)affinityFunction).getCustomAttribute());
+            }
+
+            checkAtomics();
+        }
+        finally {
+            stopAllGrids();
+        }
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testDefaultAffinity() throws Exception {
+        try {
+            affinityFunction = null;
+
+            startGrids(3);
+
+            for (int i = 0; i < 3; i++) {
+                IgniteEx igniteEx = grid(i);
+
+                CacheConfiguration cConf = igniteEx.context().cache().cache("ignite-atomics-sys-cache").configuration();
+
+                assertNotNull(cConf.getAffinity());
+            }
+
+            checkAtomics();
+        }
+        finally {
+            stopAllGrids();
+        }
+    }
+
+    /**
+     *
+     */
+    private void checkAtomics() {
+        Ignite node0 = grid(0);
+
+        node0.atomicLong("l1", 0, true).incrementAndGet();
+        node0.atomicSequence("s1", 10, true);
+
+        for (int i = 0; i < 3; i++) {
+            assertEquals(1, ignite(i).atomicLong("l1", 0, false).get());
+
+            assertNotNull(ignite(i).atomicSequence("s1", 0, false));
+
+            ignite(i).atomicSequence("s1", 0, false).getAndIncrement();
+        }
+    }
+
+    /**
+     * Test affinity function.
+     */
+    private static class TestAffinityFunction extends RendezvousAffinityFunction {
+        /** */
+        private String customAttr;
+
+        /**
+         * Default constructor.
+         */
+        public TestAffinityFunction() {
+            // No-op.
+        }
+
+        /**
+         * @param customAttr Custom attribute.
+         */
+        TestAffinityFunction(String customAttr) {
+            this.customAttr = customAttr;
+        }
+
+        /**
+         * @return Custom attribute.
+         */
+        String getCustomAttribute() {
+            return customAttr;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/f353faf1/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheDataStructuresSelfTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheDataStructuresSelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheDataStructuresSelfTestSuite.java
index 84e7953..568af94 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheDataStructuresSelfTestSuite.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheDataStructuresSelfTestSuite.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.testsuites;
 
 import junit.framework.TestSuite;
+import org.apache.ignite.internal.processors.cache.AtomicCacheAffinityConfigurationTest;
 import org.apache.ignite.internal.processors.cache.datastructures.GridCacheQueueCleanupSelfTest;
 import org.apache.ignite.internal.processors.cache.datastructures.GridCacheQueueMultiNodeConsistencySelfTest;
 import org.apache.ignite.internal.processors.cache.datastructures.IgniteClientDataStructuresTest;
@@ -168,6 +169,8 @@ public class IgniteCacheDataStructuresSelfTestSuite extends TestSuite {
 
         suite.addTest(new TestSuite(IgnitePartitionedQueueNoBackupsTest.class));
 
+        suite.addTestSuite(AtomicCacheAffinityConfigurationTest.class);
+
         return suite;
     }
 }