Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id A2F3E200CA4 for ; Tue, 23 May 2017 14:34:14 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id A1C48160BC3; Tue, 23 May 2017 12:34:14 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id E568C160BB6 for ; Tue, 23 May 2017 14:34:13 +0200 (CEST) Received: (qmail 30878 invoked by uid 500); 23 May 2017 12:34:13 -0000 Mailing-List: contact commits-help@ignite.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ignite.apache.org Delivered-To: mailing list commits@ignite.apache.org Received: (qmail 30869 invoked by uid 99); 23 May 2017 12:34:13 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 23 May 2017 12:34:13 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 0BF7CDFC2E; Tue, 23 May 2017 12:34:13 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: sboikov@apache.org To: commits@ignite.apache.org Date: Tue, 23 May 2017 12:34:13 -0000 Message-Id: X-Mailer: ASF-Git Admin Mailer Subject: [1/2] ignite git commit: ignite-5212 Allow custom affinity function for data structures cache archived-at: Tue, 23 May 2017 12:34:14 -0000 Repository: ignite Updated Branches: refs/heads/master 1554a1606 -> c04b39a1b 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/master Commit: f353faf1be5f26cf4ea069d13a9194bcf18840bb Parents: 42018e6 Author: Vladislav Pyatkov Authored: Tue May 23 15:33:39 2017 +0300 Committer: sboikov 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; } }