Search in sources :

Example 6 with UnlockOperation

use of com.hazelcast.concurrent.lock.operations.UnlockOperation in project hazelcast by hazelcast.

the class Invocation_BlockingTest method async_whenMultipleAndThenOnSameFuture.

/**
     * Tests if the future on a blocking operation can be shared by multiple threads. This tests fails in 3.6 because
     * only 1 thread will be able to swap out CONTINUE_WAIT and all other threads will fail with an OperationTimeoutExcepyion
     */
@Test
public void async_whenMultipleAndThenOnSameFuture() throws Exception {
    int callTimeout = 5000;
    Config config = new Config().setProperty(OPERATION_CALL_TIMEOUT_MILLIS.getName(), "" + callTimeout);
    TestHazelcastInstanceFactory factory = createHazelcastInstanceFactory(2);
    HazelcastInstance local = factory.newHazelcastInstance(config);
    final HazelcastInstance remote = factory.newHazelcastInstance(config);
    NodeEngineImpl nodeEngine = getNodeEngineImpl(local);
    String key = generateKeyOwnedBy(remote);
    int partitionId = nodeEngine.getPartitionService().getPartitionId(key);
    // first we execute an operation that stall the partition.
    InternalOperationService opService = nodeEngine.getOperationService();
    // first we are going to lock
    int otherThreadId = 1;
    opService.createInvocationBuilder(null, new LockOperation(new InternalLockNamespace(key), nodeEngine.toData(key), otherThreadId, -1, -1), partitionId).setCallTimeout(callTimeout).invoke().join();
    // then we are going to send another lock request by a different thread; so it can't complete
    int thisThreadId = 2;
    final InternalCompletableFuture<Object> future = opService.createInvocationBuilder(null, new LockOperation(new InternalLockNamespace(key), nodeEngine.toData(key), thisThreadId, -1, -1), partitionId).setCallTimeout(callTimeout).invoke();
    // then we register a bunch of listeners
    int listenerCount = 10;
    final CountDownLatch listenersCompleteLatch = new CountDownLatch(listenerCount);
    for (int k = 0; k < 10; k++) {
        future.andThen(new ExecutionCallback<Object>() {

            @Override
            public void onResponse(Object response) {
                if (Boolean.TRUE.equals(response)) {
                    listenersCompleteLatch.countDown();
                } else {
                    System.out.println(response);
                }
            }

            @Override
            public void onFailure(Throwable t) {
                t.printStackTrace();
            }
        });
    }
    // let's do a very long wait so that the heartbeat/retrying mechanism have kicked in.
    // the lock remains locked; so the threads calling future.get remain blocked
    sleepMillis(callTimeout * 5);
    // unlocking the lock
    opService.createInvocationBuilder(null, new UnlockOperation(new InternalLockNamespace(key), nodeEngine.toData(key), otherThreadId), partitionId).setCallTimeout(callTimeout).invoke().join();
    // and all the listeners should complete
    assertOpenEventually(listenersCompleteLatch);
}
Also used : NodeEngineImpl(com.hazelcast.spi.impl.NodeEngineImpl) LockOperation(com.hazelcast.concurrent.lock.operations.LockOperation) InternalLockNamespace(com.hazelcast.concurrent.lock.InternalLockNamespace) Config(com.hazelcast.config.Config) UnlockOperation(com.hazelcast.concurrent.lock.operations.UnlockOperation) InternalOperationService(com.hazelcast.spi.impl.operationservice.InternalOperationService) CountDownLatch(java.util.concurrent.CountDownLatch) HazelcastInstance(com.hazelcast.core.HazelcastInstance) TestHazelcastInstanceFactory(com.hazelcast.test.TestHazelcastInstanceFactory) QuickTest(com.hazelcast.test.annotation.QuickTest) Test(org.junit.Test) ParallelTest(com.hazelcast.test.annotation.ParallelTest)

Aggregations

UnlockOperation (com.hazelcast.concurrent.lock.operations.UnlockOperation)6 InternalLockNamespace (com.hazelcast.concurrent.lock.InternalLockNamespace)2 LockOperation (com.hazelcast.concurrent.lock.operations.LockOperation)2 Config (com.hazelcast.config.Config)2 HazelcastInstance (com.hazelcast.core.HazelcastInstance)2 NodeEngineImpl (com.hazelcast.spi.impl.NodeEngineImpl)2 InternalOperationService (com.hazelcast.spi.impl.operationservice.InternalOperationService)2 TestHazelcastInstanceFactory (com.hazelcast.test.TestHazelcastInstanceFactory)2 ParallelTest (com.hazelcast.test.annotation.ParallelTest)2 QuickTest (com.hazelcast.test.annotation.QuickTest)2 Test (org.junit.Test)2 LocalLockCleanupOperation (com.hazelcast.concurrent.lock.operations.LocalLockCleanupOperation)1 Data (com.hazelcast.nio.serialization.Data)1 InternalCompletableFuture (com.hazelcast.spi.InternalCompletableFuture)1 LinkedList (java.util.LinkedList)1 Callable (java.util.concurrent.Callable)1 CountDownLatch (java.util.concurrent.CountDownLatch)1 Future (java.util.concurrent.Future)1