use of org.apache.ignite.internal.util.GridConcurrentHashSet in project ignite by apache.
the class IgniteLockAbstractSelfTest method testConditionAwaitUninterruptibly.
/**
* @throws Exception If failed.
*/
private void testConditionAwaitUninterruptibly(final boolean fair) throws Exception {
final IgniteLock lock0 = grid(0).reentrantLock("lock", true, fair, true);
assertEquals(0, lock0.getHoldCount());
assertFalse(lock0.hasQueuedThreads());
final int totalThreads = 2;
final Set<Thread> startedThreads = new GridConcurrentHashSet<>();
IgniteInternalFuture<?> fut = multithreadedAsync(new Callable<Object>() {
@Override
public Object call() throws Exception {
assertFalse(lock0.isHeldByCurrentThread());
startedThreads.add(Thread.currentThread());
boolean isInterrupted = false;
lock0.lock();
IgniteCondition cond = lock0.getOrCreateCondition("cond");
try {
cond.awaitUninterruptibly();
} catch (IgniteInterruptedException ignored) {
isInterrupted = true;
} finally {
// Assert that thread was not interrupted.
assertFalse(isInterrupted);
// Assert that lock is still locked.
assertTrue(lock0.isLocked());
// Assert that this thread does own the lock.
assertTrue(lock0.isHeldByCurrentThread());
// Clear interrupt flag.
assertTrue(Thread.interrupted());
// Release lock.
if (lock0.isHeldByCurrentThread())
lock0.unlock();
}
return null;
}
}, totalThreads);
// Wait for all threads to attempt to acquire lock.
while (startedThreads.size() != totalThreads) {
Thread.sleep(500);
}
lock0.lock();
for (Thread t : startedThreads) {
t.interrupt();
lock0.getOrCreateCondition("cond").signal();
}
lock0.unlock();
fut.get();
assertFalse(lock0.isLocked());
for (Thread t : startedThreads) assertFalse(lock0.hasQueuedThread(t));
lock0.close();
}
use of org.apache.ignite.internal.util.GridConcurrentHashSet in project ignite by apache.
the class IgniteLockAbstractSelfTest method testConditionInterruptAwait.
/**
* @throws Exception If failed.
*/
private void testConditionInterruptAwait(final boolean fair) throws Exception {
final IgniteLock lock0 = grid(0).reentrantLock("lock", true, fair, true);
assertEquals(0, lock0.getHoldCount());
assertFalse(lock0.hasQueuedThreads());
final int totalThreads = 2;
final Set<Thread> startedThreads = new GridConcurrentHashSet<>();
IgniteInternalFuture<?> fut = multithreadedAsync(new Callable<Object>() {
@Override
public Object call() throws Exception {
assertFalse(lock0.isHeldByCurrentThread());
startedThreads.add(Thread.currentThread());
boolean isInterrupted = false;
lock0.lock();
IgniteCondition cond = lock0.getOrCreateCondition("cond");
try {
cond.await();
} catch (IgniteInterruptedException ignored) {
isInterrupted = true;
} finally {
// Assert that thread was interrupted.
assertTrue(isInterrupted);
// Assert that lock is still locked.
assertTrue(lock0.isLocked());
// Assert that this thread does own the lock.
assertTrue(lock0.isHeldByCurrentThread());
// Release lock.
if (lock0.isHeldByCurrentThread())
lock0.unlock();
}
return null;
}
}, totalThreads);
// Wait for all threads to attempt to acquire lock.
while (startedThreads.size() != totalThreads) {
Thread.sleep(500);
}
for (Thread t : startedThreads) t.interrupt();
fut.get();
assertFalse(lock0.isLocked());
for (Thread t : startedThreads) assertFalse(lock0.hasQueuedThread(t));
lock0.close();
}
use of org.apache.ignite.internal.util.GridConcurrentHashSet in project ignite by apache.
the class IgniteLockAbstractSelfTest method testTryLock.
/**
* @throws Exception If failed.
*/
private void testTryLock(final boolean fair) throws Exception {
final IgniteLock lock0 = grid(0).reentrantLock("lock", true, fair, true);
assertEquals(0, lock0.getHoldCount());
assertFalse(lock0.hasQueuedThreads());
final int totalThreads = 2;
final Set<Thread> startedThreads = new GridConcurrentHashSet<>();
lock0.lock();
IgniteInternalFuture<?> fut = multithreadedAsync(new Callable<Object>() {
@Override
public Object call() throws Exception {
assertFalse(lock0.isHeldByCurrentThread());
startedThreads.add(Thread.currentThread());
boolean isInterrupted = false;
boolean locked = false;
try {
locked = lock0.tryLock();
} catch (IgniteInterruptedException ignored) {
isInterrupted = true;
fail("tryLock() method is uninterruptible.");
} finally {
// Assert that thread was not interrupted.
assertFalse(isInterrupted);
// Assert that lock is locked.
assertTrue(lock0.isLocked());
// Assert that this thread does own the lock.
assertEquals(locked, lock0.isHeldByCurrentThread());
// Release lock.
if (locked)
lock0.unlock();
}
return null;
}
}, totalThreads);
// Wait for all threads to attempt to acquire lock.
while (startedThreads.size() != totalThreads) {
Thread.sleep(500);
}
for (Thread t : startedThreads) t.interrupt();
fut.get();
lock0.unlock();
assertFalse(lock0.isLocked());
for (Thread t : startedThreads) assertFalse(lock0.hasQueuedThread(t));
lock0.close();
}
use of org.apache.ignite.internal.util.GridConcurrentHashSet in project ignite by apache.
the class HadoopIgfs20FileSystemAbstractSelfTest method testMultithreadedAppend.
/**
* Ensure that when running in multithreaded mode only one append() operation succeed.
*
* @throws Exception If failed.
*/
public void testMultithreadedAppend() throws Exception {
Path dir = new Path(new Path(primaryFsUri), "/dir");
fs.mkdir(dir, FsPermission.getDefault(), true);
final Path file = new Path(dir, "file");
fs.create(file, EnumSet.noneOf(CreateFlag.class), Options.CreateOpts.perms(FsPermission.getDefault())).close();
final AtomicInteger cnt = new AtomicInteger();
final Collection<Integer> errs = new GridConcurrentHashSet<>(THREAD_CNT, 1.0f, THREAD_CNT);
multithreaded(new Runnable() {
@Override
public void run() {
int idx = cnt.getAndIncrement();
byte[] data = new byte[256];
Arrays.fill(data, (byte) idx);
U.awaitQuiet(barrier);
FSDataOutputStream os = null;
try {
os = fs.create(file, EnumSet.of(CreateFlag.APPEND), Options.CreateOpts.perms(FsPermission.getDefault()));
os.write(data);
} catch (IOException ignore) {
errs.add(idx);
} finally {
U.awaitQuiet(barrier);
U.closeQuiet(os);
}
}
}, THREAD_CNT);
// Only one thread could obtain write lock on the file.
assert errs.size() == THREAD_CNT - 1;
int idx = -1;
for (int i = 0; i < THREAD_CNT; i++) {
if (!errs.remove(i)) {
idx = i;
break;
}
}
byte[] expData = new byte[256];
Arrays.fill(expData, (byte) idx);
FSDataInputStream is = fs.open(file);
byte[] data = new byte[256];
is.read(data);
is.close();
assert Arrays.equals(expData, data);
}
use of org.apache.ignite.internal.util.GridConcurrentHashSet in project ignite by apache.
the class GridMessagingSelfTest method testSendReceiveMessage.
/**
* Tests simple message sending-receiving.
*
* @throws Exception If error occurs.
*/
public void testSendReceiveMessage() throws Exception {
final Collection<Object> rcvMsgs = new GridConcurrentHashSet<>();
// to make it modifiable
final AtomicBoolean error = new AtomicBoolean(false);
final CountDownLatch rcvLatch = new CountDownLatch(3);
ignite1.message().localListen(null, new P2<UUID, Object>() {
@Override
public boolean apply(UUID nodeId, Object msg) {
try {
log.info("Received new message [msg=" + msg + ", senderNodeId=" + nodeId + ']');
if (!nodeId.equals(ignite2.cluster().localNode().id())) {
log.error("Unexpected sender node: " + nodeId);
error.set(true);
return false;
}
rcvMsgs.add(msg);
return true;
} finally {
rcvLatch.countDown();
}
}
});
ClusterGroup rNode1 = ignite2.cluster().forRemotes();
message(rNode1).send(null, MSG_1);
message(rNode1).send(null, MSG_2);
message(rNode1).send(null, MSG_3);
assertTrue(rcvLatch.await(3, TimeUnit.SECONDS));
assertFalse(error.get());
assertTrue(rcvMsgs.contains(MSG_1));
assertTrue(rcvMsgs.contains(MSG_2));
assertTrue(rcvMsgs.contains(MSG_3));
}
Aggregations