@Test public void tryAcquire() throws Exception { assertTrue(s.tryAcquire()); assertTrue(s.tryAcquire(9)); assertEquals(0, s.availablePermits()); assertFalse(s.tryAcquire(1, TimeUnit.SECONDS)); assertFalse(s.tryAcquire(2, 1, TimeUnit.SECONDS)); final CountDownLatch latch = new CountDownLatch(1); new Thread() { public void run() { try { if (s.tryAcquire(2, 5, TimeUnit.SECONDS)) { latch.countDown(); } } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); s.release(2); assertTrue(latch.await(10, TimeUnit.SECONDS)); assertEquals(0, s.availablePermits()); }
@Test public void testSemaphoreSplitBrain() throws InterruptedException { Config config = newConfig(); HazelcastInstance h1 = Hazelcast.newHazelcastInstance(config); HazelcastInstance h2 = Hazelcast.newHazelcastInstance(config); final HazelcastInstance h3 = Hazelcast.newHazelcastInstance(config); final String key = generateKeyOwnedBy(h3); ISemaphore semaphore = h3.getSemaphore(key); semaphore.init(5); semaphore.acquire(3); assertEquals(2, semaphore.availablePermits()); assertTrueEventually( new AssertTask() { @Override public void run() throws Exception { assertTrue(h3.getPartitionService().isLocalMemberSafe()); } }); TestMemberShipListener memberShipListener = new TestMemberShipListener(2); h3.getCluster().addMembershipListener(memberShipListener); TestLifeCycleListener lifeCycleListener = new TestLifeCycleListener(1); h3.getLifecycleService().addLifecycleListener(lifeCycleListener); closeConnectionBetween(h1, h3); closeConnectionBetween(h2, h3); assertOpenEventually(memberShipListener.latch); assertClusterSizeEventually(2, h1); assertClusterSizeEventually(2, h2); assertClusterSizeEventually(1, h3); final ISemaphore semaphore1 = h1.getSemaphore(key); // when member is down, permits are released. // since releasing the permits is async, we use assert eventually assertTrueEventually( new AssertTask() { @Override public void run() throws Exception { assertEquals(5, semaphore1.availablePermits()); } }); semaphore1.acquire(4); assertOpenEventually(lifeCycleListener.latch); assertClusterSizeEventually(3, h1); assertClusterSizeEventually(3, h2); assertClusterSizeEventually(3, h3); ISemaphore testSemaphore = h3.getSemaphore(key); assertEquals(1, testSemaphore.availablePermits()); }
@Test public void testAcquire() throws Exception { assertEquals(10, s.drainPermits()); final CountDownLatch latch = new CountDownLatch(1); new Thread() { public void run() { try { s.acquire(); latch.countDown(); } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); Thread.sleep(1000); s.release(2); assertTrue(latch.await(10, TimeUnit.SECONDS)); assertEquals(1, s.availablePermits()); }