| /* |
| * 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 java.util.HashMap; |
| import java.util.Map; |
| import java.util.concurrent.Callable; |
| import org.apache.ignite.IgniteCache; |
| import org.apache.ignite.cache.CacheAtomicityMode; |
| import org.apache.ignite.cache.CacheMode; |
| import org.apache.ignite.configuration.CacheConfiguration; |
| import org.apache.ignite.configuration.IgniteConfiguration; |
| import org.apache.ignite.configuration.NearCacheConfiguration; |
| import org.apache.ignite.events.Event; |
| import org.apache.ignite.internal.IgniteInternalFuture; |
| import org.apache.ignite.internal.util.typedef.P1; |
| import org.apache.ignite.lang.IgnitePredicate; |
| import org.apache.ignite.testframework.GridTestUtils; |
| import org.jetbrains.annotations.NotNull; |
| |
| import static org.apache.ignite.IgniteSystemProperties.IGNITE_DISCOVERY_HISTORY_SIZE; |
| import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC; |
| import static org.apache.ignite.cache.CacheMode.PARTITIONED; |
| import static org.apache.ignite.events.EventType.EVT_NODE_FAILED; |
| import static org.apache.ignite.events.EventType.EVT_NODE_JOINED; |
| import static org.apache.ignite.events.EventType.EVT_NODE_LEFT; |
| import static org.apache.ignite.internal.events.DiscoveryCustomEvent.EVT_DISCOVERY_CUSTOM_EVT; |
| |
| /** |
| * Test discovery history overflow. |
| */ |
| public class PartitionsExchangeOnDiscoveryHistoryOverflowTest extends IgniteCacheAbstractTest { |
| /** */ |
| private static final int CACHES_COUNT = 50; |
| |
| /** */ |
| private static final int DISCOVERY_HISTORY_SIZE = 10; |
| |
| /** */ |
| private static String histSize; |
| |
| /** {@inheritDoc} */ |
| @Override protected void beforeTestsStarted() throws Exception { |
| histSize = System.getProperty(IGNITE_DISCOVERY_HISTORY_SIZE); |
| |
| System.setProperty(IGNITE_DISCOVERY_HISTORY_SIZE, String.valueOf(DISCOVERY_HISTORY_SIZE)); |
| |
| super.beforeTestsStarted(); |
| } |
| |
| /** {@inheritDoc} */ |
| @Override protected void afterTestsStopped() throws Exception { |
| if (histSize != null) |
| System.setProperty(IGNITE_DISCOVERY_HISTORY_SIZE, histSize); |
| else |
| System.getProperties().remove(IGNITE_DISCOVERY_HISTORY_SIZE); |
| |
| super.afterTestsStopped(); |
| } |
| |
| /** {@inheritDoc} */ |
| @Override protected int gridCount() { |
| return 4; |
| } |
| |
| /** {@inheritDoc} */ |
| @Override protected CacheMode cacheMode() { |
| return PARTITIONED; |
| } |
| |
| /** {@inheritDoc} */ |
| @Override protected CacheAtomicityMode atomicityMode() { |
| return ATOMIC; |
| } |
| |
| /** {@inheritDoc} */ |
| @Override protected NearCacheConfiguration nearConfiguration() { |
| return null; |
| } |
| |
| /** {@inheritDoc} */ |
| @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception { |
| IgniteConfiguration cfg = super.getConfiguration(gridName); |
| |
| Map<IgnitePredicate<? extends Event>, int[]> map = new HashMap<>(); |
| |
| // To make partitions exchanges longer. |
| map.put(new P1<Event>() { |
| @Override public boolean apply(Event evt) { |
| try { |
| Thread.sleep(10); |
| } |
| catch (InterruptedException e) { |
| // No op. |
| } |
| |
| return false; |
| } |
| }, new int[]{EVT_NODE_JOINED, EVT_NODE_FAILED, EVT_NODE_LEFT, EVT_DISCOVERY_CUSTOM_EVT}); |
| |
| cfg.setLocalEventListeners(map); |
| |
| return cfg; |
| } |
| |
| /** |
| * @throws Exception In case of error. |
| */ |
| public void testDynamicCacheCreation() throws Exception { |
| for (int iter = 0; iter < 5; iter++) { |
| log.info("Iteration: " + iter); |
| |
| IgniteInternalFuture[] futs = new IgniteInternalFuture[CACHES_COUNT]; |
| |
| for (int i = 0; i < CACHES_COUNT; i ++) { |
| final int cacheIdx = i; |
| |
| final int gridIdx = cacheIdx % gridCount(); |
| |
| futs[i] = GridTestUtils.runAsync(new Callable<IgniteCache>() { |
| @Override public IgniteCache call() throws Exception { |
| return grid(gridIdx).createCache(cacheConfiguration(gridIdx, cacheIdx)); |
| } |
| }); |
| } |
| |
| for (IgniteInternalFuture fut : futs) { |
| assertNotNull(fut); |
| |
| fut.get(); |
| } |
| |
| for (int i = 0; i < CACHES_COUNT; i ++) { |
| final int cacheIdx = i; |
| |
| final int gridIdx = cacheIdx % gridCount(); |
| |
| futs[i] = GridTestUtils.runAsync(new Callable<Void>() { |
| @Override public Void call() throws Exception { |
| grid(gridIdx).destroyCache(cacheConfiguration(gridIdx, cacheIdx).getName()); |
| |
| return null; |
| } |
| }); |
| } |
| |
| for (IgniteInternalFuture fut : futs) { |
| assertNotNull(fut); |
| |
| fut.get(); |
| } |
| } |
| } |
| |
| /** |
| * @param gridIdx Grid index. |
| * @param cacheIdx Cache index. |
| * @return Newly created cache configuration. |
| * @throws Exception In case of error. |
| */ |
| @NotNull private CacheConfiguration cacheConfiguration(int gridIdx, int cacheIdx) throws Exception { |
| CacheConfiguration cfg = cacheConfiguration(getTestIgniteInstanceName(gridIdx)); |
| |
| cfg.setName("dynamic-cache-" + cacheIdx); |
| |
| return cfg; |
| } |
| } |