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

https://bitbucket.org/gabral6_gmailcom/hazelcast · Java · 2656 lines · 2397 code · 165 blank · 94 comment · 122 complexity · 3ae228378b54e5f9585ad4e09ed7fb9a MD5 · raw file

Large files are truncated click here to view the full 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.cluster.AddOrRemoveConnection;
  18. import com.hazelcast.config.*;
  19. import com.hazelcast.core.*;
  20. import com.hazelcast.examples.TestApp;
  21. import com.hazelcast.monitor.DistributedMapStatsCallable;
  22. import com.hazelcast.nio.Address;
  23. import com.hazelcast.partition.MigrationEvent;
  24. import com.hazelcast.partition.MigrationListener;
  25. import com.hazelcast.partition.Partition;
  26. import com.hazelcast.util.Clock;
  27. import com.hazelcast.util.ConcurrentHashSet;
  28. import org.junit.*;
  29. import org.junit.runner.RunWith;
  30. import java.io.Serializable;
  31. import java.util.*;
  32. import java.util.concurrent.*;
  33. import java.util.concurrent.atomic.AtomicBoolean;
  34. import java.util.concurrent.atomic.AtomicInteger;
  35. import java.util.concurrent.atomic.AtomicLong;
  36. import static com.hazelcast.impl.TestUtil.*;
  37. import static java.lang.Thread.sleep;
  38. import static org.junit.Assert.*;
  39. /**
  40. * Run these tests with
  41. * -Xms512m -Xmx512m
  42. */
  43. @RunWith(com.hazelcast.util.RandomBlockJUnit4ClassRunner.class)
  44. public class ClusterTest {
  45. @BeforeClass
  46. public static void init() throws Exception {
  47. System.setProperty(GroupProperties.PROP_WAIT_SECONDS_BEFORE_JOIN, "1");
  48. System.setProperty(GroupProperties.PROP_VERSION_CHECK_ENABLED, "false");
  49. Hazelcast.shutdownAll();
  50. }
  51. @After
  52. public void cleanup() throws Exception {
  53. Hazelcast.shutdownAll();
  54. }
  55. @Test
  56. public void testIdle() throws Exception {
  57. Config config = new Config();
  58. MapConfig mapConfig = config.getMapConfig("default");
  59. mapConfig.setMaxIdleSeconds(3);
  60. mapConfig.setEvictionDelaySeconds(10);
  61. HazelcastInstance h1 = Hazelcast.newHazelcastInstance(config);
  62. Map map = h1.getMap("default");
  63. map.put(1, 1);
  64. assertEquals(1, map.get(1));
  65. sleep(2000);
  66. assertEquals(1, map.get(1));
  67. sleep(2000);
  68. assertEquals(1, map.get(1));
  69. sleep(4000);
  70. assertNull(map.get(1));
  71. assertEquals(0, map.size());
  72. }
  73. @Test
  74. public void testPartitions() throws Exception {
  75. final HazelcastInstance h1 = Hazelcast.newHazelcastInstance(new Config());
  76. assertEquals(271, getLocalPartitions(h1).size());
  77. final HazelcastInstance h2 = Hazelcast.newHazelcastInstance(new Config());
  78. assertEquals(271, getLocalPartitions(h1).size() + getLocalPartitions(h2).size());
  79. }
  80. @Test
  81. public void testAtomicNumber() throws Exception {
  82. final HazelcastInstance h1 = Hazelcast.newHazelcastInstance(new Config());
  83. final HazelcastInstance h2 = Hazelcast.newHazelcastInstance(new Config());
  84. AtomicNumber a1 = h1.getAtomicNumber("default");
  85. AtomicNumber a2 = h2.getAtomicNumber("default");
  86. assertEquals(1, a1.incrementAndGet());
  87. assertEquals(1, a1.get());
  88. assertEquals(1, a2.get());
  89. assertEquals(5, a2.addAndGet(4));
  90. assertEquals(5, a1.getAndSet(13));
  91. assertEquals(13, a1.get());
  92. assertEquals(13, a2.get());
  93. h1.getLifecycleService().shutdown();
  94. assertEquals(13, a2.getAndSet(21));
  95. assertEquals(21, a2.get());
  96. final HazelcastInstance h3 = Hazelcast.newHazelcastInstance(new Config());
  97. AtomicNumber a3 = h3.getAtomicNumber("default");
  98. assertEquals(20, a3.decrementAndGet());
  99. assertEquals(20, a2.getAndAdd(-20));
  100. assertFalse(a2.compareAndSet(1, 6));
  101. assertFalse(a3.compareAndSet(1, 6));
  102. assertTrue(a2.compareAndSet(0, 6));
  103. assertTrue(a3.compareAndSet(6, 0));
  104. assertEquals(0, a3.get());
  105. assertEquals(0, a2.get());
  106. h2.getLifecycleService().shutdown();
  107. assertEquals(0, a3.get());
  108. }
  109. @Test
  110. public void testFirstNodeWait() throws Exception {
  111. final Config config = new Config();
  112. final BlockingQueue<Integer> counts = new ArrayBlockingQueue<Integer>(2);
  113. final HazelcastInstance[] instances = new HazelcastInstance[2];
  114. for (int i = 0; i < 2; i++) {
  115. instances[i] = Hazelcast.newHazelcastInstance(config);
  116. }
  117. for (int j = 0; j < 2; j++) {
  118. final int instanceIndex = j;
  119. new Thread(new Runnable() {
  120. public void run() {
  121. final HazelcastInstance h = instances[instanceIndex];
  122. for (int i = 0; i < 3000; i++) {
  123. h.getMap("default").put(i, "value");
  124. }
  125. counts.offer(getLocalPartitions(h).size());
  126. }
  127. }).start();
  128. }
  129. int first = counts.take();
  130. int second = counts.take();
  131. assertTrue("Found " + first, first > 134);
  132. assertTrue("Found " + second, second > 134);
  133. assertEquals(271, second + first);
  134. }
  135. private Set<Partition> getLocalPartitions(HazelcastInstance h) {
  136. Set<Partition> partitions = h.getPartitionService().getPartitions();
  137. Set<Partition> localPartitions = new HashSet<Partition>();
  138. for (Partition partition : partitions) {
  139. if (h.getCluster().getLocalMember().equals(partition.getOwner())) {
  140. localPartitions.add(partition);
  141. }
  142. }
  143. return localPartitions;
  144. }
  145. @Test(timeout = 120000, expected = RuntimeException.class)
  146. public void testPutAfterShutdown() throws InterruptedException {
  147. final HazelcastInstance h1 = Hazelcast.newHazelcastInstance(new Config());
  148. Map map = h1.getMap("default");
  149. h1.shutdown();
  150. map.put("1", "value");
  151. }
  152. @Test(timeout = 120000)
  153. public void testSuperClientPartitionOwnership() throws Exception {
  154. Config configSuperClient = new Config();
  155. configSuperClient.setLiteMember(true);
  156. HazelcastInstance hNormal = Hazelcast.newHazelcastInstance(new Config());
  157. final HazelcastInstance hSuper = Hazelcast.newHazelcastInstance(configSuperClient);
  158. IMap mapSuper = hSuper.getMap("default");
  159. IMap mapNormal = hNormal.getMap("default");
  160. for (int i = 0; i < 1000; i++) {
  161. mapNormal.put("item" + i, "value" + i);
  162. }
  163. for (int i = 1000; i < 2000; i++) {
  164. mapSuper.put("item" + i, "value" + i);
  165. }
  166. Set<Partition> partitions2 = hSuper.getPartitionService().getPartitions();
  167. for (Partition partition : partitions2) {
  168. assertEquals(partition.getOwner(), hNormal.getCluster().getLocalMember());
  169. }
  170. assertEquals(2000, mapNormal.size());
  171. assertEquals(2000, mapSuper.size());
  172. assertEquals(0, mapSuper.getLocalMapStats().getOwnedEntryCount());
  173. assertEquals(0, mapSuper.getLocalMapStats().getBackupEntryCount());
  174. assertEquals(2000, mapNormal.getLocalMapStats().getOwnedEntryCount());
  175. assertEquals(0, mapNormal.getLocalMapStats().getBackupEntryCount());
  176. hNormal.shutdown();
  177. Thread.sleep(3000);
  178. Set<Partition> partitions = hSuper.getPartitionService().getPartitions();
  179. for (Partition partition : partitions) {
  180. assertNull(partition.getOwner());
  181. }
  182. hNormal = Hazelcast.newHazelcastInstance(new Config());
  183. partitions = hSuper.getPartitionService().getPartitions();
  184. for (Partition partition : partitions) {
  185. assertEquals(hNormal.getCluster().getLocalMember(), partition.getOwner());
  186. }
  187. assertNull(mapSuper.put("1", "value"));
  188. hSuper.shutdown();
  189. partitions = hNormal.getPartitionService().getPartitions();
  190. for (Partition partition : partitions) {
  191. assertEquals(hNormal.getCluster().getLocalMember(), partition.getOwner());
  192. }
  193. assertEquals("value", hNormal.getMap("default").get("1"));
  194. }
  195. @Test(timeout = 50000)
  196. public void testPutAfterRestart() {
  197. final HazelcastInstance h1 = Hazelcast.newHazelcastInstance(new Config());
  198. Map map = h1.getMap("default");
  199. h1.getLifecycleService().restart();
  200. map.put("1", "value");
  201. }
  202. @Test
  203. public void testSuperBeingMaster() throws Exception {
  204. Config config = new Config();
  205. config.setLiteMember(true);
  206. final HazelcastInstance hSuper = Hazelcast.newHazelcastInstance(config);
  207. final HazelcastInstance hSuper2 = Hazelcast.newHazelcastInstance(config);
  208. sleep(11000);
  209. HazelcastInstance hNormal = Hazelcast.newHazelcastInstance(new Config());
  210. Map map = hSuper.getMap("default");
  211. map.put("1", "value");
  212. assertEquals("value", hNormal.getMap("default").get("1"));
  213. sleep(10000);
  214. assertEquals("value", hNormal.getMap("default").get("1"));
  215. assertEquals("value", map.get("1"));
  216. }
  217. @Test(timeout = 120000)
  218. public void testSuperClientPutAfterBeforeNormalMember() throws Exception {
  219. final CountDownLatch latch = new CountDownLatch(1);
  220. final CountDownLatch latchSuperPut = new CountDownLatch(1);
  221. new Thread(new Runnable() {
  222. public void run() {
  223. Config config = new Config();
  224. config.setLiteMember(true);
  225. final HazelcastInstance hSuper = Hazelcast.newHazelcastInstance(config);
  226. latch.countDown();
  227. Map map = hSuper.getMap("default");
  228. map.put("1", "value");
  229. latchSuperPut.countDown();
  230. }
  231. }).start();
  232. assertTrue(latch.await(10, TimeUnit.SECONDS));
  233. HazelcastInstance hNormal = Hazelcast.newHazelcastInstance(new Config());
  234. assertTrue(latchSuperPut.await(10, TimeUnit.SECONDS));
  235. assertEquals("value", hNormal.getMap("default").get("1"));
  236. }
  237. @Test(timeout = 120000)
  238. public void testRestart() throws Exception {
  239. final HazelcastInstance h = Hazelcast.newHazelcastInstance(new Config());
  240. IMap map = h.getMap("default");
  241. map.put("1", "value");
  242. final CountDownLatch latch = new CountDownLatch(1);
  243. Thread interrupter = new Thread(new Runnable() {
  244. public void run() {
  245. try {
  246. sleep(1000);
  247. h.getLifecycleService().restart();
  248. latch.countDown();
  249. } catch (Throwable e) {
  250. e.printStackTrace();
  251. }
  252. }
  253. });
  254. interrupter.start();
  255. map.put("1", "value2");
  256. assertTrue(latch.await(10, TimeUnit.SECONDS));
  257. }
  258. @Test(timeout = 120000)
  259. public void testRestart2() throws Exception {
  260. HazelcastInstance h = Hazelcast.newHazelcastInstance(new Config());
  261. HazelcastInstance h2 = Hazelcast.newHazelcastInstance(new Config());
  262. IMap map = h2.getMap("default");
  263. map.put("1", "value1");
  264. assertEquals(2, h.getCluster().getMembers().size());
  265. h2.getLifecycleService().restart();
  266. sleep(400);
  267. assertEquals("value1", map.get("1"));
  268. assertEquals("value1", map.put("1", "value2"));
  269. assertEquals("value2", map.get("1"));
  270. assertEquals("value2", h.getMap("default").get("1"));
  271. }
  272. @Test
  273. public void issue397MapReplaceLeadsToMemoryLeak() {
  274. HazelcastInstance h1 = Hazelcast.newHazelcastInstance(new Config());
  275. HazelcastInstance h2 = Hazelcast.newHazelcastInstance(new Config());
  276. IMap map1 = h1.getMap("def");
  277. Object old = map1.replace(1, "v");
  278. assertNull(old);
  279. old = map1.replace(200, "v");
  280. assertNull(old);
  281. old = map1.replace(140, "v");
  282. assertNull(old);
  283. old = map1.replace(55, "v");
  284. assertNull(old);
  285. assertFalse(map1.containsKey(1));
  286. assertFalse(map1.containsKey(200));
  287. assertFalse(map1.containsKey(55));
  288. assertEquals(0, map1.getLocalMapStats().getBackupEntryCount());
  289. IMap map2 = h2.getMap("def");
  290. assertEquals(0, map2.getLocalMapStats().getBackupEntryCount());
  291. }
  292. @Test
  293. public void issue452SetMigration() throws InterruptedException {
  294. Config config = new Config();
  295. final CountDownLatch latch = new CountDownLatch(1);
  296. config.addListenerConfig(new ListenerConfig(new MigrationListener() {
  297. public void migrationStarted(MigrationEvent migrationEvent) {
  298. }
  299. public void migrationCompleted(MigrationEvent migrationEvent) {
  300. latch.countDown();
  301. }
  302. public void migrationFailed(final MigrationEvent migrationEvent) {
  303. }
  304. }));
  305. HazelcastInstance h1 = Hazelcast.newHazelcastInstance(config);
  306. ISet set1 = h1.getSet("mySet");
  307. for (int i = 0; i < 1000; i++) {
  308. set1.add(i);
  309. }
  310. assertEquals(1000, set1.size());
  311. HazelcastInstance h2 = Hazelcast.newHazelcastInstance(new Config());
  312. HazelcastInstance h3 = Hazelcast.newHazelcastInstance(new Config());
  313. ISet set2 = h2.getSet("mySet");
  314. ISet set3 = h3.getSet("mySet");
  315. assertTrue(latch.await(30, TimeUnit.SECONDS));
  316. assertEquals(1000, set1.size());
  317. assertEquals(1000, set2.size());
  318. assertEquals(1000, set3.size());
  319. h2.getLifecycleService().shutdown();
  320. assertEquals(1000, set1.size());
  321. assertEquals(1000, set3.size());
  322. }
  323. @Test(timeout = 60000)
  324. public void testMapReplaceIfSame() throws Exception {
  325. HazelcastInstance h1 = Hazelcast.newHazelcastInstance(new Config());
  326. HazelcastInstance h2 = Hazelcast.newHazelcastInstance(new Config());
  327. IMap map1 = h1.getMap("default");
  328. IMap map2 = h2.getMap("default");
  329. map1.put("1", "value1");
  330. assertEquals(2, h1.getCluster().getMembers().size());
  331. assertEquals("value1", map1.get("1"));
  332. assertEquals("value1", map2.get("1"));
  333. assertTrue(map2.replace("1", "value1", "value2"));
  334. assertTrue(map1.replace("1", "value2", "value3"));
  335. }
  336. @Test
  337. public void testMapReplaceIfSame2() throws Exception {
  338. HazelcastInstance hz = Hazelcast.newHazelcastInstance(new Config());
  339. final IMap<String, String> map = hz.getMap("default");
  340. final int loop = 50000;
  341. final String key = "key";
  342. final String value = "value";
  343. map.put(key, value);
  344. final int threads = 10;
  345. final CountDownLatch latch = new CountDownLatch(loop);
  346. ExecutorService ex = Executors.newFixedThreadPool(threads);
  347. try {
  348. for (int i = 0; i < loop; i++) {
  349. ex.execute(new Runnable() {
  350. public void run() {
  351. if (map.replace(key, value, value)) {
  352. latch.countDown();
  353. }
  354. }
  355. });
  356. }
  357. } finally {
  358. ex.shutdown();
  359. ex.awaitTermination(5, TimeUnit.SECONDS);
  360. }
  361. assertTrue(latch.await(30, TimeUnit.SECONDS));
  362. }
  363. @Test
  364. public void testMapReplaceIfSame3() throws Exception {
  365. HazelcastInstance hz = Hazelcast.newHazelcastInstance(new Config());
  366. final IMap<String, Counter> map = hz.getMap("default");
  367. final int loop = 10000;
  368. final String id = "key";
  369. map.put(id, new Counter(id, 0L));
  370. Thread[] threads = new Thread[2];
  371. for (int k = 0; k < threads.length; k++) {
  372. threads[k] = new Thread(new Runnable() {
  373. public void run() {
  374. for (int i = 0; i < loop; i++) {
  375. increment();
  376. }
  377. }
  378. void increment() {
  379. for (; ; ) {
  380. Counter oldCounter = map.get(id);
  381. if (oldCounter == null) throw new IllegalArgumentException();
  382. Counter newCounter = new Counter(id, oldCounter.value);
  383. newCounter.inc();
  384. if (map.replace(id, oldCounter, newCounter)) {
  385. return;
  386. }
  387. }
  388. }
  389. });
  390. }
  391. for (Thread thread : threads) thread.start();
  392. for (Thread thread : threads) thread.join();
  393. long actualCount = map.get(id).value;
  394. long expectedCount = loop * threads.length;
  395. assertEquals(expectedCount, actualCount);
  396. }
  397. @Test
  398. public void testMapRemoveIfSame() throws Exception {
  399. HazelcastInstance hz = Hazelcast.newHazelcastInstance(new Config());
  400. final IMap<String, Counter> map = hz.getMap("default");
  401. final int loop = 10000;
  402. final String key = "key";
  403. final int t = 3;
  404. final ExecutorService ex = Executors.newFixedThreadPool(t);
  405. try {
  406. final AtomicInteger k = new AtomicInteger();
  407. for (int i = 0; i < loop; i++) {
  408. final Counter c = new Counter(key, i);
  409. map.put(key, c) ;
  410. final CountDownLatch latch = new CountDownLatch(t);
  411. for (int j = 0; j < t; j++) {
  412. ex.submit(new Runnable() {
  413. public void run() {
  414. if (map.remove(key, c)) {
  415. k.incrementAndGet();
  416. }
  417. latch.countDown();
  418. }
  419. });
  420. }
  421. assertTrue(latch.await(3, TimeUnit.SECONDS));
  422. assertEquals("Remove if same should be successful only once! ["
  423. + i + "]", 1, k.getAndSet(0));
  424. }
  425. } finally {
  426. ex.shutdownNow();
  427. }
  428. }
  429. static class Counter implements Serializable {
  430. private String id;
  431. private long value;
  432. public Counter() {
  433. }
  434. public Counter(String id, long value) {
  435. this.value = value;
  436. this.id = id;
  437. }
  438. public void inc() {
  439. value++;
  440. }
  441. public boolean equals(Object thatObject) {
  442. if (thatObject == this) return true;
  443. if (!(thatObject instanceof Counter)) return false;
  444. Counter that = (Counter) thatObject;
  445. if (!(that.id.equals(this.id))) return false;
  446. if (that.value != this.value) return false;
  447. return true;
  448. }
  449. public int hashCode() {
  450. int hash = id.hashCode();
  451. hash = 31 * hash + ((int) (value ^ (value >>> 32)));
  452. return hash;
  453. }
  454. }
  455. @Test
  456. public void testLockInstance() {
  457. ILock lock = Hazelcast.getLock("testLock");
  458. lock.lock();
  459. Collection<Instance> instances = Hazelcast.getInstances();
  460. boolean found = false;
  461. for (Instance instance : instances) {
  462. if (instance.getInstanceType().isLock()) {
  463. ILock lockInstance = (ILock) instance;
  464. if (lockInstance.getLockObject().equals("testLock")) {
  465. found = true;
  466. }
  467. }
  468. }
  469. Assert.assertTrue(found);
  470. instances = Hazelcast.getInstances();
  471. found = false;
  472. for (Instance instance : instances) {
  473. if (instance.getInstanceType().isLock()) {
  474. ILock lockInstance = (ILock) instance;
  475. if (lockInstance.getLockObject().equals("testLock2")) {
  476. found = true;
  477. }
  478. }
  479. }
  480. assertFalse(found);
  481. Hazelcast.getLock("testLock2");
  482. instances = Hazelcast.getInstances();
  483. found = false;
  484. for (Instance instance : instances) {
  485. if (instance.getInstanceType().isLock()) {
  486. ILock lockInstance = (ILock) instance;
  487. if (lockInstance.getLockObject().equals("testLock2")) {
  488. found = true;
  489. }
  490. }
  491. }
  492. Assert.assertTrue(found);
  493. }
  494. @Test
  495. public void testPutIfAbsentWhenThereIsTTL() throws InterruptedException {
  496. String mapName = "testTTL";
  497. int ttl = 1;
  498. Config myConfig = configTTLForMap(mapName, ttl);
  499. HazelcastInstance hazelcast = Hazelcast.newHazelcastInstance(myConfig);
  500. IMap<String, String> myMap = hazelcast.getMap(mapName);
  501. String key = "1";
  502. String value = "value1";
  503. myMap.put(key, value);
  504. assertEquals(value, myMap.get(key));
  505. assertTrue(myMap.containsKey(key));
  506. sleep((ttl + 1) * 1000);
  507. assertFalse(myMap.containsKey(key));
  508. assertNull(myMap.get(key));
  509. assertNull(myMap.putIfAbsent(key, "value2"));
  510. }
  511. @Test
  512. public void testPutIfAbsentWhenThereIsTTLAndRemovedBeforeTTL() throws InterruptedException {
  513. String mapName = "testTTL";
  514. int ttl = 1;
  515. Config myConfig = configTTLForMap(mapName, ttl);
  516. HazelcastInstance hazelcast = Hazelcast.newHazelcastInstance(myConfig);
  517. IMap<String, String> myMap = hazelcast.getMap(mapName);
  518. String key = "1";
  519. String value = "value1";
  520. myMap.put(key, value);
  521. assertEquals(value, myMap.get(key));
  522. assertTrue(myMap.containsKey(key));
  523. assertEquals(value, myMap.remove(key));
  524. sleep((ttl + 1) * 1000);
  525. assertFalse(myMap.containsKey(key));
  526. assertNull(myMap.get(key));
  527. assertNull(myMap.putIfAbsent(key, "value2"));
  528. }
  529. private Config configTTLForMap(String mapName, int ttl) {
  530. Config myConfig = new Config();
  531. Map<String, MapConfig> myHazelcastMapConfigs = myConfig.getMapConfigs();
  532. MapConfig myMapConfig = myHazelcastMapConfigs.get(mapName);
  533. if (myMapConfig == null) {
  534. myMapConfig = new MapConfig();
  535. myMapConfig.setName(mapName);
  536. myMapConfig.setTimeToLiveSeconds(ttl);
  537. myConfig.addMapConfig(myMapConfig);
  538. } else {
  539. myMapConfig.setTimeToLiveSeconds(ttl);
  540. }
  541. return myConfig;
  542. }
  543. @Test(timeout = 120000)
  544. public void testDifferentGroups() {
  545. Config c1 = new Config();
  546. c1.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false);
  547. c1.getNetworkConfig().getJoin().getTcpIpConfig().setEnabled(true);
  548. c1.getNetworkConfig().getJoin().getTcpIpConfig().addMember("127.0.0.1");
  549. c1.getNetworkConfig().getInterfaces().clear();
  550. c1.getNetworkConfig().getInterfaces().addInterface("127.0.0.1");
  551. c1.getNetworkConfig().getInterfaces().setEnabled(true);
  552. Config c2 = new Config();
  553. c2.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false);
  554. c2.getNetworkConfig().getJoin().getTcpIpConfig().setEnabled(true);
  555. c2.getNetworkConfig().getJoin().getTcpIpConfig().addMember("127.0.0.1");
  556. c2.getNetworkConfig().getInterfaces().clear();
  557. c2.getNetworkConfig().getInterfaces().addInterface("127.0.0.1");
  558. c2.getNetworkConfig().getInterfaces().setEnabled(true);
  559. c1.getGroupConfig().setName("sameGroup");
  560. c2.getGroupConfig().setName("sameGroup");
  561. HazelcastInstance h1 = Hazelcast.newHazelcastInstance(c1);
  562. HazelcastInstance h2 = Hazelcast.newHazelcastInstance(c2);
  563. assertEquals(2, h1.getCluster().getMembers().size());
  564. assertEquals(2, h2.getCluster().getMembers().size());
  565. Hazelcast.shutdownAll();
  566. c2.getGroupConfig().setName("differentGroup");
  567. h1 = Hazelcast.newHazelcastInstance(c1);
  568. h2 = Hazelcast.newHazelcastInstance(c2);
  569. assertEquals(1, h1.getCluster().getMembers().size());
  570. assertEquals(1, h2.getCluster().getMembers().size());
  571. }
  572. @Test(timeout = 60000)
  573. public void shutdownSuperClient() {
  574. Config c1 = new Config();
  575. Config c2 = new Config();
  576. c2.setLiteMember(true);
  577. HazelcastInstance hNormal = Hazelcast.newHazelcastInstance(c1);
  578. HazelcastInstance hSuper = Hazelcast.newHazelcastInstance(c2);
  579. hNormal.getMap("default").put("1", "first");
  580. assert hSuper.getMap("default").
  581. get("1").equals("first");
  582. hNormal.shutdown();
  583. hSuper.shutdown();
  584. }
  585. @Test(timeout = 60000)
  586. public void testSuperClientRestart() throws Exception {
  587. Config configNormal = new Config();
  588. configNormal.setProperty(GroupProperties.PROP_CONNECTION_MONITOR_INTERVAL, "1");
  589. configNormal.setProperty(GroupProperties.PROP_CONNECTION_MONITOR_MAX_FAULTS, "1");
  590. Config configSuper = new Config();
  591. configSuper.setProperty(GroupProperties.PROP_CONNECTION_MONITOR_INTERVAL, "1");
  592. configSuper.setProperty(GroupProperties.PROP_CONNECTION_MONITOR_MAX_FAULTS, "1");
  593. configSuper.setLiteMember(true);
  594. HazelcastInstance h = Hazelcast.newHazelcastInstance(configNormal);
  595. HazelcastInstance s = Hazelcast.newHazelcastInstance(configSuper);
  596. assertEquals(2, h.getCluster().getMembers().size());
  597. assertEquals(2, s.getCluster().getMembers().size());
  598. assertFalse(h.getCluster().getLocalMember().isLiteMember());
  599. assertTrue(s.getCluster().getLocalMember().isLiteMember());
  600. IMap map = h.getMap("default");
  601. final IMap maps = s.getMap("default");
  602. assertNull(map.put("1", "value1"));
  603. assertEquals("value1", map.get("1"));
  604. assertEquals("value1", maps.get("1"));
  605. assertEquals(1, map.size());
  606. assertEquals(1, maps.size());
  607. h.getLifecycleService().shutdown();
  608. sleep(500);
  609. assertEquals(1, s.getCluster().getMembers().size());
  610. final CountDownLatch latch = new CountDownLatch(1);
  611. new Thread(new Runnable() {
  612. public void run() {
  613. maps.size();
  614. assertNull(maps.get("1"));
  615. maps.put("1", "value3");
  616. latch.countDown();
  617. }
  618. }).start();
  619. h = Hazelcast.newHazelcastInstance(configNormal);
  620. assertTrue(latch.await(20, TimeUnit.SECONDS));
  621. assertEquals(2, h.getCluster().getMembers().size());
  622. assertEquals(2, s.getCluster().getMembers().size());
  623. assertFalse(h.getCluster().getLocalMember().isLiteMember());
  624. assertTrue(s.getCluster().getLocalMember().isLiteMember());
  625. map = h.getMap("default");
  626. assertEquals("value3", map.put("1", "value2"));
  627. assertEquals("value2", map.get("1"));
  628. assertEquals(1, map.size());
  629. assertEquals(1, maps.size());
  630. }
  631. /**
  632. * 3 node cluster: normal member(h1), super client (hSuper) and another normal member (h2)
  633. * if h1 goes down, hSuper becomes the oldest member
  634. * If hSuper fails to update the partition ownerships,
  635. * h2.getMap("default").get(key) gets into infinite Re-Do.
  636. *
  637. * @throws Exception
  638. */
  639. @Test
  640. public void testSuperClientBeingOldestMember() throws Exception {
  641. HazelcastInstance h1 = Hazelcast.newHazelcastInstance(new Config());
  642. Config superConfig = new Config();
  643. superConfig.setLiteMember(true);
  644. HazelcastInstance hSuper = Hazelcast.newHazelcastInstance(superConfig);
  645. HazelcastInstance h2 = Hazelcast.newHazelcastInstance(new Config());
  646. final IMap map = h2.getMap("default");
  647. h1.getLifecycleService().shutdown();
  648. final CountDownLatch latch = new CountDownLatch(1);
  649. new Thread(new Runnable() {
  650. public void run() {
  651. assertTrue(map.get("1") == null);
  652. latch.countDown();
  653. }
  654. }).start();
  655. assertTrue(latch.await(10, TimeUnit.SECONDS));
  656. }
  657. @Test(timeout = 120000)
  658. public void testTcpIpWithMembers() throws Exception {
  659. Config c = new Config();
  660. c.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false);
  661. c.getNetworkConfig().getJoin().getTcpIpConfig().setEnabled(true);
  662. c.getNetworkConfig().getInterfaces().setEnabled(true);
  663. c.getNetworkConfig().getJoin().getTcpIpConfig().addMember("127.0.0.1");
  664. c.getNetworkConfig().getInterfaces().addInterface("127.0.0.1");
  665. HazelcastInstance h1 = Hazelcast.newHazelcastInstance(c);
  666. assertEquals(1, h1.getCluster().getMembers().size());
  667. h1.getMap("default").put("1", "value1");
  668. assertEquals("value1", h1.getMap("default").put("1", "value2"));
  669. HazelcastInstance h2 = Hazelcast.newHazelcastInstance(c);
  670. testTwoNodes(h1, h2);
  671. h1.getLifecycleService().shutdown();
  672. h1 = Hazelcast.newHazelcastInstance(c);
  673. testTwoNodes(h2, h1);
  674. }
  675. @Test(timeout = 120000)
  676. public void testTcpIp() throws Exception {
  677. Config c = new Config();
  678. c.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false);
  679. c.getNetworkConfig().getJoin().getTcpIpConfig().setEnabled(true);
  680. c.getNetworkConfig().getInterfaces().setEnabled(true);
  681. c.getNetworkConfig().getJoin().getTcpIpConfig()
  682. .addAddress(new Address("127.0.0.1", 5701))
  683. .addAddress(new Address("127.0.0.1", 5702));
  684. c.getNetworkConfig().getInterfaces().addInterface("127.0.0.1");
  685. HazelcastInstance h1 = Hazelcast.newHazelcastInstance(c);
  686. assertEquals(1, h1.getCluster().getMembers().size());
  687. h1.getMap("default").put("1", "value1");
  688. assertEquals("value1", h1.getMap("default").put("1", "value2"));
  689. HazelcastInstance h2 = Hazelcast.newHazelcastInstance(c);
  690. testTwoNodes(h1, h2);
  691. h1.getLifecycleService().shutdown();
  692. h1 = Hazelcast.newHazelcastInstance(c);
  693. testTwoNodes(h2, h1);
  694. }
  695. @Test(timeout = 120000)
  696. public void testTcpIpWithoutInterfaces() throws Exception {
  697. Config c = new Config();
  698. c.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false);
  699. c.getNetworkConfig().getJoin().getTcpIpConfig().setEnabled(true);
  700. c.getNetworkConfig().getInterfaces().setEnabled(true);
  701. c.getNetworkConfig().getJoin().getTcpIpConfig()
  702. .addAddress(new Address("127.0.0.1", 5701))
  703. .addAddress(new Address("127.0.0.1", 5702));
  704. HazelcastInstance h1 = Hazelcast.newHazelcastInstance(c);
  705. assertEquals(1, h1.getCluster().getMembers().size());
  706. h1.getMap("default").put("1", "value1");
  707. assertEquals("value1", h1.getMap("default").put("1", "value2"));
  708. HazelcastInstance h2 = Hazelcast.newHazelcastInstance(c);
  709. testTwoNodes(h1, h2);
  710. h1.getLifecycleService().shutdown();
  711. h1 = Hazelcast.newHazelcastInstance(c);
  712. testTwoNodes(h2, h1);
  713. }
  714. @Test(timeout = 120000)
  715. public void testMulticast() throws Exception {
  716. HazelcastInstance h1 = Hazelcast.newHazelcastInstance(new Config());
  717. assertEquals(1, h1.getCluster().getMembers().size());
  718. h1.getMap("default").put("1", "value1");
  719. assertEquals("value1", h1.getMap("default").put("1", "value2"));
  720. HazelcastInstance h2 = Hazelcast.newHazelcastInstance(new Config());
  721. testTwoNodes(h1, h2);
  722. }
  723. private void testTwoNodes(HazelcastInstance h1, HazelcastInstance h2) throws Exception {
  724. h1.getMultiMap("default").clear();
  725. IMap map1 = h1.getMap("default");
  726. IMap map2 = h2.getMap("default");
  727. assertEquals(2, h1.getCluster().getMembers().size());
  728. assertEquals(2, h2.getCluster().getMembers().size());
  729. assertEquals("value2", h2.getMap("default").get("1"));
  730. assertEquals("value2", h1.getMap("default").get("1"));
  731. assertEquals(1, h1.getMap("default").size());
  732. assertEquals(1, h2.getMap("default").size());
  733. assertFalse(map1.containsKey("2"));
  734. assertFalse(map2.containsKey("2"));
  735. assertFalse(map1.containsValue("value1"));
  736. assertFalse(map2.containsValue("value1"));
  737. assertTrue(map1.containsKey("1"));
  738. assertTrue(map2.containsKey("1"));
  739. assertTrue(map1.containsValue("value2"));
  740. assertTrue(map2.containsValue("value2"));
  741. map1.lock("1");
  742. assertFalse(map2.tryLock("1"));
  743. map1.unlock("1");
  744. assertTrue(map2.tryLock("1"));
  745. map2.unlock("1");
  746. assertEquals("value2", map1.putIfAbsent("1", "value1"));
  747. assertEquals("value2", map2.putIfAbsent("1", "value1"));
  748. assertEquals("value2", map1.get("1"));
  749. assertEquals("value2", map2.get("1"));
  750. assertNull(map1.putIfAbsent("3", "value3"));
  751. assertEquals("value3", map1.get("3"));
  752. assertEquals("value3", map2.get("3"));
  753. assertEquals("value3", map2.remove("3"));
  754. assertNull(map1.get("3"));
  755. assertNull(map2.get("3"));
  756. assertNull(map2.putIfAbsent("3", "value3"));
  757. assertEquals("value3", map1.get("3"));
  758. assertEquals("value3", map2.get("3"));
  759. assertEquals("value3", map1.remove("3"));
  760. assertNull(map1.get("3"));
  761. assertNull(map2.get("3"));
  762. assertEquals(1, map1.keySet().size());
  763. assertEquals(1, map1.values().size());
  764. assertEquals(1, map1.entrySet().size());
  765. assertEquals(1, map2.keySet().size());
  766. assertEquals(1, map2.values().size());
  767. assertEquals(1, map2.entrySet().size());
  768. Set<Map.Entry> entries = map1.entrySet();
  769. for (Map.Entry entry : entries) {
  770. assertEquals("1", entry.getKey());
  771. assertEquals("value2", entry.getValue());
  772. }
  773. entries = map2.entrySet();
  774. for (Map.Entry entry : entries) {
  775. assertEquals("1", entry.getKey());
  776. assertEquals("value2", entry.getValue());
  777. }
  778. allMapListenerTest(map2, "5", map1);
  779. MultiMap<String, String> mm1 = h1.getMultiMap("default");
  780. MultiMap<String, String> mm2 = h2.getMultiMap("default");
  781. mm1.put("Hello", "World");
  782. Collection<String> values = mm2.get("Hello");
  783. assertEquals("World", values.iterator().next());
  784. mm2.put("Hello", "Europe");
  785. mm1.put("Hello", "America");
  786. mm1.put("Hello", "Asia");
  787. mm1.put("Hello", "Africa");
  788. mm1.put("Hello", "Antartica");
  789. mm1.put("Hello", "Australia");
  790. values = mm2.get("Hello");
  791. assertEquals(7, values.size());
  792. junit.framework.Assert.assertFalse(mm2.remove("Hello", "Unknown"));
  793. assertEquals(7, mm1.get("Hello").size());
  794. assertTrue(mm1.remove("Hello", "Antartica"));
  795. assertEquals(6, mm1.get("Hello").size());
  796. }
  797. @Test(timeout = 120000)
  798. public void testListeners2() throws Exception {
  799. HazelcastInstance h1 = Hazelcast.newHazelcastInstance(new Config());
  800. HazelcastInstance h2 = Hazelcast.newHazelcastInstance(new Config());
  801. final Member member1 = h1.getCluster().getLocalMember();
  802. final Member member2 = h2.getCluster().getLocalMember();
  803. final CountDownLatch latchAdded = new CountDownLatch(4);
  804. final CountDownLatch latchUpdated = new CountDownLatch(2);
  805. final CountDownLatch latchRemoved = new CountDownLatch(2);
  806. final CountDownLatch latchEvicted = new CountDownLatch(2);
  807. EntryListener listener = new EntryListener() {
  808. public synchronized void entryAdded(EntryEvent entryEvent) {
  809. if (latchAdded.getCount() > 2) {
  810. assertEquals(member1, entryEvent.getMember());
  811. } else {
  812. assertEquals(member2, entryEvent.getMember());
  813. }
  814. latchAdded.countDown();
  815. }
  816. public void entryRemoved(EntryEvent entryEvent) {
  817. assertEquals(member1, entryEvent.getMember());
  818. latchRemoved.countDown();
  819. }
  820. public void entryUpdated(EntryEvent entryEvent) {
  821. assertEquals(member2, entryEvent.getMember());
  822. latchUpdated.countDown();
  823. }
  824. public void entryEvicted(EntryEvent entryEvent) {
  825. assertEquals(member2, entryEvent.getMember());
  826. latchEvicted.countDown();
  827. }
  828. };
  829. IMap map2 = h2.getMap("default");
  830. IMap map1 = h1.getMap("default");
  831. Object key = "2133aa";
  832. map1.addEntryListener(listener, key, true);
  833. map2.addEntryListener(listener, key, true);
  834. assertNull(map1.put(key, "value5"));
  835. assertEquals("value5", map2.put(key, "value55"));
  836. assertTrue(map2.evict(key));
  837. assertNull(map2.put(key, "value5"));
  838. assertEquals("value5", map1.remove(key));
  839. int waitSeconds = 20;
  840. assertTrue(latchRemoved.await(waitSeconds, TimeUnit.SECONDS));
  841. map1.removeEntryListener(listener, key);
  842. assertFalse(map2.evict(key));
  843. map2.removeEntryListener(listener, key);
  844. assertTrue(latchAdded.await(waitSeconds, TimeUnit.SECONDS));
  845. assertTrue(latchUpdated.await(waitSeconds, TimeUnit.SECONDS));
  846. assertTrue(latchRemoved.await(waitSeconds, TimeUnit.SECONDS));
  847. assertTrue(latchEvicted.await(waitSeconds, TimeUnit.SECONDS));
  848. }
  849. @Test(timeout = 120000)
  850. public void testListeners() throws Exception {
  851. HazelcastInstance h1 = Hazelcast.newHazelcastInstance(new Config());
  852. assertEquals(1, h1.getCluster().getMembers().size());
  853. h1.getMap("default").put("1", "value1");
  854. assertEquals("value1", h1.getMap("default").put("1", "value2"));
  855. HazelcastInstance h2 = Hazelcast.newHazelcastInstance(new Config());
  856. allMapListenerTest(h2.getMap("default"), "5", h1.getMap("default"));
  857. }
  858. private void allMapListenerTest(IMap map, Object keyToUpdate, IMap mapSource) throws Exception {
  859. final CountDownLatch latchAdded = new CountDownLatch(2);
  860. final CountDownLatch latchUpdated = new CountDownLatch(1);
  861. final CountDownLatch latchRemoved = new CountDownLatch(1);
  862. final CountDownLatch latchEvicted = new CountDownLatch(1);
  863. EntryListener listener = new EntryListener() {
  864. public void entryAdded(EntryEvent entryEvent) {
  865. latchAdded.countDown();
  866. }
  867. public void entryRemoved(EntryEvent entryEvent) {
  868. latchRemoved.countDown();
  869. }
  870. public void entryUpdated(EntryEvent entryEvent) {
  871. latchUpdated.countDown();
  872. }
  873. public void entryEvicted(EntryEvent entryEvent) {
  874. latchEvicted.countDown();
  875. }
  876. };
  877. map.addEntryListener(listener, true);
  878. assertNull(mapSource.put(keyToUpdate, "value5"));
  879. assertEquals("value5", mapSource.put(keyToUpdate, "value55"));
  880. assertTrue(mapSource.evict(keyToUpdate));
  881. assertNull(mapSource.put(keyToUpdate, "value5"));
  882. assertEquals("value5", mapSource.remove(keyToUpdate));
  883. int waitSeconds = 20;
  884. assertTrue(latchAdded.await(waitSeconds, TimeUnit.SECONDS));
  885. assertTrue(latchUpdated.await(waitSeconds, TimeUnit.SECONDS));
  886. assertTrue(latchRemoved.await(waitSeconds, TimeUnit.SECONDS));
  887. assertTrue(latchEvicted.await(waitSeconds, TimeUnit.SECONDS));
  888. map.removeEntryListener(listener);
  889. }
  890. @Test(timeout = 120000)
  891. public void testTcpIpWithDifferentBuildNumber() throws Exception {
  892. System.setProperty("hazelcast.build", "1");
  893. Config c = new Config();
  894. c.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false);
  895. c.getNetworkConfig().getJoin().getTcpIpConfig().setEnabled(true);
  896. c.getNetworkConfig().getInterfaces().setEnabled(true);
  897. c.getNetworkConfig().getJoin().getTcpIpConfig().addAddress(new Address("127.0.0.1", 5701));
  898. c.getNetworkConfig().getInterfaces().addInterface("127.0.0.1");
  899. HazelcastInstance h1 = Hazelcast.newHazelcastInstance(c);
  900. assertEquals(1, h1.getCluster().getMembers().size());
  901. h1.getMap("default").put("1", "value1");
  902. assertEquals("value1", h1.getMap("default").put("1", "value2"));
  903. System.setProperty("hazelcast.build", "2");
  904. HazelcastInstance h2 = Hazelcast.newHazelcastInstance(c);
  905. assertEquals(2, h1.getCluster().getMembers().size());
  906. assertEquals(2, h2.getCluster().getMembers().size());
  907. System.clearProperty("hazelcast.build");
  908. }
  909. @Test(timeout = 120000)
  910. public void testMulticastWithDifferentBuildNumber() throws Exception {
  911. System.setProperty("hazelcast.build", "1");
  912. HazelcastInstance h1 = Hazelcast.newHazelcastInstance(new Config());
  913. assertEquals(1, h1.getCluster().getMembers().size());
  914. h1.getMap("default").put("1", "value1");
  915. assertEquals("value1", h1.getMap("default").put("1", "value2"));
  916. System.setProperty("hazelcast.build", "2");
  917. HazelcastInstance h2 = Hazelcast.newHazelcastInstance(new Config());
  918. assertEquals(2, h1.getCluster().getMembers().size());
  919. assertEquals(2, h2.getCluster().getMembers().size());
  920. System.setProperty("hazelcast.build", "t");
  921. }
  922. @Test(timeout = 120000)
  923. public void testMapMaxSize() throws Exception {
  924. int maxSize = 40;
  925. Config c = new Config();
  926. MapConfig mapConfig = c.getMapConfig("default");
  927. mapConfig.setEvictionPolicy("LRU");
  928. mapConfig.setMaxSizeConfig(new MaxSizeConfig()
  929. .setMaxSizePolicy(MaxSizeConfig.POLICY_CLUSTER_WIDE_MAP_SIZE)
  930. .setSize(maxSize));
  931. mapConfig.setEvictionPercentage(25);
  932. HazelcastInstance h1 = Hazelcast.newHazelcastInstance(c);
  933. HazelcastInstance h2 = Hazelcast.newHazelcastInstance(c);
  934. IMap map1 = h1.getMap("default");
  935. for (int i = 0; i < 100; i++) {
  936. map1.put(String.valueOf(i), String.valueOf(i));
  937. int mapSize = map1.size();
  938. assertTrue("CurrentMapSize : " + mapSize, mapSize <= maxSize);
  939. }
  940. IMap map2 = h2.getMap("default");
  941. for (int i = 0; i < 100; i++) {
  942. map2.put(String.valueOf(i), String.valueOf(i));
  943. int mapSize = map2.size();
  944. assertTrue("CurrentMapSize : " + mapSize, mapSize <= maxSize);
  945. }
  946. }
  947. @Test(timeout = 120000)
  948. @Ignore
  949. public void testMapMaxHeap() throws Exception {
  950. int maxSize = 1; // MB
  951. Config c = new Config();
  952. c.setProperty(GroupProperties.PROP_CLEANUP_DELAY_SECONDS, "1");
  953. MapConfig mapConfig = c.getMapConfig("default");
  954. mapConfig.setMaxSizeConfig(new MaxSizeConfig()
  955. .setMaxSizePolicy(MaxSizeConfig.POLICY_USED_HEAP_SIZE)
  956. .setSize(maxSize));
  957. final byte[] data = new byte[700]; // cost = value + overhead(312) = 1012
  958. HazelcastInstance hz = Hazelcast.newHazelcastInstance(c);
  959. IMap map = hz.getMap("default");
  960. for (int i = 0; i < 1024; i++) { // cost = key(+overhead)(12) + value(700) + overhead(312) = 1024
  961. map.put(i, data);
  962. }
  963. Thread.sleep(1500); // wait for cleanup
  964. assertFalse(map.tryPut(1024, data, 0, TimeUnit.SECONDS));
  965. map.remove(0);
  966. Thread.sleep(1500); // wait for cleanup
  967. assertTrue(map.tryPut(1024, data, 0, TimeUnit.SECONDS));
  968. }
  969. /**
  970. * Test for issue #204:
  971. * http://code.google.com/p/hazelcast/issues/detail?id=204
  972. * <p/>
  973. * Summary:
  974. * Eviction events are not fired
  975. */
  976. @Test
  977. public void testEvictionOfEntriesWithTTL() throws Exception {
  978. HazelcastInstance h1 = Hazelcast.newHazelcastInstance(new Config());
  979. IMap map1 = h1.getMap("default");
  980. HazelcastInstance h2 = Hazelcast.newHazelcastInstance(new Config());
  981. IMap map2 = h2.getMap("default");
  982. TestEntryListener cl1 = new TestEntryListener(100, 0, 0, 100);
  983. TestEntryListener cl2 = new TestEntryListener(100, 0, 0, 100);
  984. map1.addEntryListener(cl1, true);
  985. map2.addEntryListener(cl2, true);
  986. for (int i = 0; i < 50; i++) {
  987. map1.put(Integer.valueOf(i), i, 5, TimeUnit.SECONDS);
  988. map1.put(String.valueOf(i), i, 5, TimeUnit.SECONDS);
  989. }
  990. assertTrue(cl1.await(30));
  991. assertTrue(cl2.await(30));
  992. }
  993. @Test(timeout = 180000)
  994. public void testLosingEntries() throws Exception {
  995. final CountDownLatch latch = new CountDownLatch(2);
  996. final HazelcastInstance h1 = Hazelcast.newHazelcastInstance(new Config());
  997. final AtomicBoolean failed = new AtomicBoolean(false);
  998. new Thread(new Runnable() {
  999. public void run() {
  1000. try {
  1001. callSize(h1, 110000);
  1002. } catch (Exception e) {
  1003. failed.set(true);
  1004. fail(e.getMessage());
  1005. } finally {
  1006. latch.countDown();
  1007. }
  1008. }
  1009. }).start();
  1010. sleep(4000);
  1011. final HazelcastInstance h2 = Hazelcast.newHazelcastInstance(new Config());
  1012. new Thread(new Runnable() {
  1013. public void run() {
  1014. try {
  1015. callSize(h2, 2000);
  1016. } catch (Exception e) {
  1017. failed.set(true);
  1018. fail(e.getMessage());
  1019. } finally {
  1020. latch.countDown();
  1021. }
  1022. }
  1023. }).start();
  1024. assertTrue(latch.await(20, TimeUnit.SECONDS));
  1025. assertFalse(failed.get());
  1026. }
  1027. private void callSize(HazelcastInstance h, int numberOfIterations) throws Exception {
  1028. Random r = new Random();
  1029. Map<Integer, Integer> map = h.getMap("testMap");
  1030. try {
  1031. sleep(5000);
  1032. } catch (InterruptedException ignored) {
  1033. }
  1034. int size = 0;
  1035. for (int i = 0; i < numberOfIterations; i++) {
  1036. if (i % 1000 == 0) {
  1037. int sizeNow = map.size();
  1038. if (sizeNow < size)
  1039. throw new RuntimeException("CurrentSize cannot be smaller. " + sizeNow + ", was " + size);
  1040. size = sizeNow;
  1041. }
  1042. map.put(r.nextInt(200000), i);
  1043. }
  1044. h.getLifecycleService().shutdown();
  1045. }
  1046. @Test(timeout = 60000)
  1047. public void testMapRecovery() throws Exception {
  1048. HazelcastInstance h1 = Hazelcast.newHazelcastInstance(new Config());
  1049. IMap map1 = h1.getMap("default");
  1050. map1.put("1", "value");
  1051. assertEquals(1, map1.size());
  1052. assertEquals(1, map1.keySet().size());
  1053. CMap cmap1 = getCMap(h1, "default");
  1054. assertEquals(1, cmap1.mapRecords.size());
  1055. assertEquals(1, cmap1.getMapIndexService().getOwnedRecords().size());
  1056. HazelcastInstance h2 = Hazelcast.newHazelcastInstance(new Config());
  1057. MigrationCompletionLatch l = new MigrationCompletionLatch("1", h1, h2);
  1058. l.await(3, TimeUnit.SECONDS);
  1059. IMap map2 = h2.getMap("default");
  1060. CMap cmap2 = getCMap(h2, "default");
  1061. assertEquals(1, cmap1.mapRecords.size());
  1062. assertEquals(1, cmap2.mapRecords.size());
  1063. assertEquals(1, cmap1.getMapIndexService().getOwnedRecords().size()
  1064. + cmap2.getMapIndexService().getOwnedRecords().size());
  1065. assertEquals(1, map1.size());
  1066. assertEquals(1, map1.keySet().size());
  1067. assertEquals(1, map2.size());
  1068. assertEquals(1, map2.keySet().size());
  1069. h1.getLifecycleService().shutdown();
  1070. assertEquals(1, map2.size());
  1071. assertEquals(1, map2.keySet().size());
  1072. assertEquals(1, cmap2.mapRecords.size());
  1073. assertEquals(1, cmap2.getMapIndexService().getOwnedRecords().size());
  1074. }
  1075. @Test(timeout = 60000)
  1076. public void testMultiMapRecovery() throws Exception {
  1077. HazelcastInstance h1 = Hazelcast.newHazelcastInstance(new Config());
  1078. MultiMap mm = h1.getMultiMap("default");
  1079. CMap cmap1 = getCMapForMultiMap(h1, "default");
  1080. Collection<String> expectedValues = new HashSet<String>();
  1081. expectedValues.add("value1");
  1082. expectedValues.add("value2");
  1083. mm.put("1", "value1");
  1084. mm.put("1", "value2");
  1085. assertEquals(2, mm.size());
  1086. assertEquals(1, mm.keySet().size());
  1087. Collection values = mm.get("1");
  1088. for (Object value : values) {
  1089. assertTrue(expectedValues.contains(value));
  1090. }
  1091. assertEquals(1, cmap1.getMapIndexService().getOwnedRecords().size());
  1092. HazelcastInstance h2 = Hazelcast.newHazelcastInstance(new Config());
  1093. MultiMap mm2 = h2.getMultiMap("default");
  1094. CMap cmap2 = getCMapForMultiMap(h2, "default");
  1095. MigrationCompletionLatch l = new MigrationCompletionLatch("1", h1, h2);
  1096. l.await(3, TimeUnit.SECONDS);
  1097. assertEquals(1, cmap1.getMapIndexService().getOwnedRecords().size()
  1098. + cmap2.getMapIndexService().getOwnedRecords().size());
  1099. cmap1.startCleanup(true);
  1100. cmap2.startCleanup(true);
  1101. assertEquals(2, mm.size());
  1102. assertEquals(1, mm.keySet().size());
  1103. values = mm.get("1");
  1104. for (Object value : values) {
  1105. assertTrue(expectedValues.contains(value));
  1106. }
  1107. assertEquals(2, mm2.size());
  1108. assertEquals(1, mm2.keySet().size());
  1109. values = mm2.get("1");
  1110. for (Object value : values) {
  1111. assertTrue(expectedValues.contains(value));