/hazelcast/src/test/java/com/hazelcast/impl/WanReplicationTest.java

https://bitbucket.org/gabral6_gmailcom/hazelcast · Java · 309 lines · 269 code · 25 blank · 15 comment · 9 complexity · afdaf9d2dbb2f54c5c8192f7098ca1c2 MD5 · raw file

  1. /*
  2. * Copyright (c) 2008-2013, Hazelcast, Inc. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.hazelcast.impl;
  17. import com.hazelcast.config.Config;
  18. import com.hazelcast.config.WanReplicationConfig;
  19. import com.hazelcast.config.WanReplicationRef;
  20. import com.hazelcast.config.WanTargetClusterConfig;
  21. import com.hazelcast.core.Hazelcast;
  22. import com.hazelcast.core.HazelcastInstance;
  23. import com.hazelcast.impl.wan.WanMergeListener;
  24. import com.hazelcast.merge.PassThroughMergePolicy;
  25. import org.junit.After;
  26. import org.junit.Before;
  27. import org.junit.BeforeClass;
  28. import org.junit.Test;
  29. import org.junit.runner.RunWith;
  30. import java.util.concurrent.CountDownLatch;
  31. import java.util.concurrent.TimeUnit;
  32. import java.util.concurrent.atomic.AtomicInteger;
  33. import java.util.concurrent.atomic.AtomicReference;
  34. import static com.hazelcast.impl.TestUtil.getConcurrentMapManager;
  35. import static junit.framework.Assert.assertEquals;
  36. import static junit.framework.Assert.assertTrue;
  37. @RunWith(com.hazelcast.util.RandomBlockJUnit4ClassRunner.class)
  38. public class WanReplicationTest {
  39. @BeforeClass
  40. public static void init() throws Exception {
  41. System.setProperty(GroupProperties.PROP_WAIT_SECONDS_BEFORE_JOIN, "1");
  42. System.setProperty(GroupProperties.PROP_VERSION_CHECK_ENABLED, "false");
  43. Hazelcast.shutdownAll();
  44. }
  45. @After
  46. @Before
  47. public void cleanup() throws Exception {
  48. Hazelcast.shutdownAll();
  49. }
  50. @Test
  51. public void testWANClustering() throws Exception {
  52. Config c1 = new Config();
  53. Config c2 = new Config();
  54. c1.getGroupConfig().setName("newyork");
  55. c1.addWanReplicationConfig(new WanReplicationConfig()
  56. .setName("my-wan")
  57. .addTargetClusterConfig(new WanTargetClusterConfig()
  58. .addEndpoint("127.0.0.1:5702").setGroupName("london")));
  59. c1.getMapConfig("default").setWanReplicationRef(new WanReplicationRef()
  60. .setName("my-wan")
  61. .setMergePolicy(PassThroughMergePolicy.NAME));
  62. c2.getGroupConfig().setName("london");
  63. c2.addWanReplicationConfig(new WanReplicationConfig()
  64. .setName("my-wan")
  65. .addTargetClusterConfig(new WanTargetClusterConfig()
  66. .addEndpoint("127.0.0.1:5701").setGroupName("newyork")));
  67. c2.getMapConfig("default").setWanReplicationRef(new WanReplicationRef()
  68. .setName("my-wan")
  69. .setMergePolicy(PassThroughMergePolicy.NAME));
  70. HazelcastInstance h1 = Hazelcast.newHazelcastInstance(c1);
  71. HazelcastInstance h2 = Hazelcast.newHazelcastInstance(c2);
  72. HazelcastInstance h12 = Hazelcast.newHazelcastInstance(c1);
  73. HazelcastInstance h13 = Hazelcast.newHazelcastInstance(c1);
  74. HazelcastInstance h22 = Hazelcast.newHazelcastInstance(c2);
  75. int size = 100;
  76. MergeLatch mergeLatch1 = new MergeLatch(2 * size);
  77. MergeLatch mergeLatch2 = new MergeLatch(size);
  78. getConcurrentMapManager(h1).addWanMergeListener(mergeLatch1);
  79. getConcurrentMapManager(h12).addWanMergeListener(mergeLatch1);
  80. getConcurrentMapManager(h13).addWanMergeListener(mergeLatch1);
  81. getConcurrentMapManager(h2).addWanMergeListener(mergeLatch2);
  82. getConcurrentMapManager(h22).addWanMergeListener(mergeLatch2);
  83. for (int i = 0; i < size; i++) {
  84. h2.getMap("default").put(i, "value" + i);
  85. h22.getMap("default").put(size + i, "value" + (size + i));
  86. }
  87. assertTrue("Latch state 1: " + mergeLatch1, mergeLatch1.await(60, TimeUnit.SECONDS));
  88. Thread.sleep(5000);
  89. assertEquals(0, mergeLatch2.totalOperations());
  90. assertEquals(2 * size, mergeLatch1.getUpdateCount());
  91. assertEquals(2 * size, mergeLatch1.totalOperations());
  92. assertEquals(2 * size, h2.getMap("default").size());
  93. assertEquals(2 * size, h1.getMap("default").size());
  94. assertEquals(2 * size, h12.getMap("default").size());
  95. assertEquals(2 * size, h13.getMap("default").size());
  96. assertEquals(2 * size, h22.getMap("default").size());
  97. mergeLatch1.reset();
  98. for (int i = 0; i < size / 2; i++) {
  99. h1.getMap("default").remove(i);
  100. h13.getMap("default").remove(size + i);
  101. }
  102. assertTrue("Latch state 2: " + mergeLatch2, mergeLatch2.await(60, TimeUnit.SECONDS));
  103. Thread.sleep(5000);
  104. assertEquals(size, mergeLatch2.getRemoveCount());
  105. assertEquals(size, mergeLatch2.totalOperations());
  106. assertEquals(0, mergeLatch1.totalOperations());
  107. assertEquals(size, h1.getMap("default").size());
  108. assertEquals(size, h2.getMap("default").size());
  109. assertEquals(size, h12.getMap("default").size());
  110. assertEquals(size, h13.getMap("default").size());
  111. assertEquals(size, h22.getMap("default").size());
  112. }
  113. @Test
  114. public void testWANClustering2() throws Exception {
  115. Config c1 = new Config();
  116. Config c2 = new Config();
  117. c1.getGroupConfig().setName("newyork");
  118. c1.addWanReplicationConfig(new WanReplicationConfig()
  119. .setName("my-wan")
  120. .addTargetClusterConfig(new WanTargetClusterConfig()
  121. .addEndpoint("127.0.0.1:5703").setGroupName("london")));
  122. c1.getMapConfig("default").setWanReplicationRef(new WanReplicationRef()
  123. .setName("my-wan")
  124. .setMergePolicy(PassThroughMergePolicy.NAME));
  125. c2.getGroupConfig().setName("london");
  126. c2.addWanReplicationConfig(new WanReplicationConfig()
  127. .setName("my-wan")
  128. .addTargetClusterConfig(new WanTargetClusterConfig()
  129. .addEndpoint("127.0.0.1:5701").setGroupName("newyork")));
  130. c2.getMapConfig("default").setWanReplicationRef(new WanReplicationRef()
  131. .setName("my-wan")
  132. .setMergePolicy(PassThroughMergePolicy.NAME));
  133. HazelcastInstance h10 = Hazelcast.newHazelcastInstance(c1);
  134. HazelcastInstance h11 = Hazelcast.newHazelcastInstance(c1);
  135. int size = 1000;
  136. HazelcastInstance h20 = Hazelcast.newHazelcastInstance(c2);
  137. HazelcastInstance h21 = Hazelcast.newHazelcastInstance(c2);
  138. HazelcastInstance h12 = Hazelcast.newHazelcastInstance(c1);
  139. MergeLatch mergeLatch1 = new MergeLatch(size);
  140. getConcurrentMapManager(h10).addWanMergeListener(mergeLatch1);
  141. getConcurrentMapManager(h11).addWanMergeListener(mergeLatch1);
  142. getConcurrentMapManager(h12).addWanMergeListener(mergeLatch1);
  143. MergeLatch mergeLatch2 = new MergeLatch(size);
  144. getConcurrentMapManager(h20).addWanMergeListener(mergeLatch2);
  145. getConcurrentMapManager(h21).addWanMergeListener(mergeLatch2);
  146. for (int i = 0; i < size; i++) {
  147. h11.getMap("default").put(i, "value" + i);
  148. }
  149. assertTrue("Latch state: " + mergeLatch2, mergeLatch2.await(60, TimeUnit.SECONDS));
  150. Thread.sleep(5000);
  151. assertEquals(size, mergeLatch2.totalOperations());
  152. assertEquals(0, mergeLatch1.totalOperations());
  153. assertEquals(size, h10.getMap("default").size());
  154. assertEquals(size, h20.getMap("default").size());
  155. assertEquals(size, h12.getMap("default").size());
  156. assertEquals(size, h11.getMap("default").size());
  157. assertEquals(size, h21.getMap("default").size());
  158. mergeLatch2.reset();
  159. for (int i = 0; i < size; i++) {
  160. h21.getMap("default").put(size + i, "value" + (size + i));
  161. }
  162. assertTrue("Latch state: " + mergeLatch1, mergeLatch1.await(60, TimeUnit.SECONDS));
  163. Thread.sleep(5000);
  164. assertEquals(size, mergeLatch1.totalOperations());
  165. assertEquals(0, mergeLatch2.totalOperations());
  166. assertEquals(2 * size, h10.getMap("default").size());
  167. assertEquals(2 * size, h20.getMap("default").size());
  168. assertEquals(2 * size, h12.getMap("default").size());
  169. assertEquals(2 * size, h11.getMap("default").size());
  170. assertEquals(2 * size, h21.getMap("default").size());
  171. mergeLatch1.reset(size / 2);
  172. mergeLatch2.reset(size / 2);
  173. for (int i = 0; i < size / 2; i++) {
  174. h10.getMap("default").remove(i);
  175. h21.getMap("default").remove(size + i);
  176. }
  177. assertTrue("Latch state: " + mergeLatch1, mergeLatch1.await(60, TimeUnit.SECONDS));
  178. assertTrue("Latch state: " + mergeLatch2, mergeLatch2.await(60, TimeUnit.SECONDS));
  179. Thread.sleep(5000);
  180. assertEquals(size / 2, mergeLatch1.totalOperations());
  181. assertEquals(size / 2, mergeLatch2.totalOperations());
  182. assertEquals(size, h10.getMap("default").size());
  183. assertEquals(size, h20.getMap("default").size());
  184. assertEquals(size, h12.getMap("default").size());
  185. assertEquals(size, h11.getMap("default").size());
  186. assertEquals(size, h21.getMap("default").size());
  187. }
  188. @Test
  189. public void testWANClusteringActivePassive() throws Exception {
  190. Config c1 = new Config();
  191. Config c2 = new Config();
  192. c1.getGroupConfig().setName("newyork");
  193. c1.addWanReplicationConfig(new WanReplicationConfig()
  194. .setName("my-wan")
  195. .addTargetClusterConfig(new WanTargetClusterConfig()
  196. .addEndpoint("127.0.0.1:5702").setGroupName("london")));
  197. c1.getMapConfig("default").setWanReplicationRef(new WanReplicationRef()
  198. .setName("my-wan")
  199. .setMergePolicy(PassThroughMergePolicy.NAME));
  200. c2.getGroupConfig().setName("london");
  201. c2.getMapConfig("default").setWanReplicationRef(new WanReplicationRef()
  202. .setName("my-wan")
  203. .setMergePolicy(PassThroughMergePolicy.NAME));
  204. HazelcastInstance h10 = Hazelcast.newHazelcastInstance(c1);
  205. HazelcastInstance h20 = Hazelcast.newHazelcastInstance(c2);
  206. int size = 1000;
  207. MergeLatch mergeLatch2 = new MergeLatch(size);
  208. getConcurrentMapManager(h20).addWanMergeListener(mergeLatch2);
  209. for (int i = 0; i < size; i++) {
  210. h10.getMap("default").put(i, "value" + i);
  211. }
  212. assertTrue("Latch state: " + mergeLatch2, mergeLatch2.await(60, TimeUnit.SECONDS));
  213. Thread.sleep(5000);
  214. assertEquals(size, mergeLatch2.totalOperations());
  215. assertEquals(size, h10.getMap("default").size());
  216. assertEquals(size, h20.getMap("default").size());
  217. for (int i = 0; i < size; i++) {
  218. assertEquals("value" + i, h20.getMap("default").get(i));
  219. }
  220. }
  221. class MergeLatch implements WanMergeListener {
  222. final AtomicInteger removeCount = new AtomicInteger();
  223. final AtomicInteger updateCount = new AtomicInteger();
  224. final AtomicInteger ignoreCount = new AtomicInteger();
  225. final AtomicReference<CountDownLatch> latch;
  226. MergeLatch(int count) {
  227. latch = new AtomicReference<CountDownLatch>(new CountDownLatch(count));
  228. }
  229. public long getCount() {
  230. return latch.get().getCount();
  231. }
  232. public void countDown() {
  233. CountDownLatch l = latch.get();
  234. if (l != null) {
  235. l.countDown();
  236. }
  237. }
  238. public void entryRemoved() {
  239. removeCount.incrementAndGet();
  240. countDown();
  241. }
  242. public void entryUpdated() {
  243. updateCount.incrementAndGet();
  244. countDown();
  245. }
  246. public void entryIgnored() {
  247. ignoreCount.incrementAndGet();
  248. countDown();
  249. }
  250. public int totalOperations() {
  251. return getIgnoreCount() + getRemoveCount() + getUpdateCount();
  252. }
  253. public int getRemoveCount() {
  254. return removeCount.get();
  255. }
  256. public int getUpdateCount() {
  257. return updateCount.get();
  258. }
  259. public int getIgnoreCount() {
  260. return ignoreCount.get();
  261. }
  262. public void reset() {
  263. removeCount.set(0);
  264. updateCount.set(0);
  265. ignoreCount.set(0);
  266. }
  267. public void reset(int count) {
  268. latch.set(new CountDownLatch(count));
  269. reset();
  270. }
  271. public boolean await(int time, TimeUnit timeUnit) throws InterruptedException {
  272. return latch.get().await(time, timeUnit);
  273. }
  274. @Override
  275. public String toString() {
  276. return "MergeLatch{" +
  277. "count=" + getCount() +
  278. ", removeCount=" + removeCount.get() +
  279. ", updateCount=" + updateCount.get() +
  280. ", ignoreCount=" + ignoreCount.get() +
  281. '}';
  282. }
  283. }
  284. }