Search in sources :

Example 1 with NonBlockingCredit

use of org.jgroups.util.NonBlockingCredit in project JGroups by belaban.

the class NonBlockingCreditTest method testDecrementAndQueing.

public void testDecrementAndQueing() {
    MessageSender msg_sender = new MessageSender();
    NonBlockingCredit cred = new NonBlockingCredit(max_credits, 500_000, new ReentrantLock(), msg_sender);
    Message msg = msg(1000);
    boolean success = cred.decrementIfEnoughCredits(msg, msg.getLength(), 500);
    assert success && cred.get() == 9000;
    msg = msg(9000);
    success = cred.decrementIfEnoughCredits(msg, msg.getLength(), 500);
    assert success && cred.get() == 0;
    for (int i = 0; i < 5; i++) {
        msg = msg(1000);
        success = cred.decrementIfEnoughCredits(msg, msg.getLength(), 500);
        assert !success && cred.get() == 0;
    }
    assert cred.isQueuing();
    assert cred.getQueuedMessages() == 5;
    assert cred.getQueuedMessageSize() == 5000;
    // not enough to trigger a message send
    cred.increment(500, max_credits);
    assert cred.isQueuing();
    assert cred.get() == 500 && cred.getQueuedMessages() == 5 && cred.getQueuedMessageSize() == 5000;
    // this is enough to send the first queued message
    cred.increment(500, max_credits);
    assert cred.isQueuing();
    assert cred.get() == 0 && cred.getQueuedMessages() == 4 && cred.getQueuedMessageSize() == 4000;
    assert msg_sender.sent_msgs == 1;
    cred.increment(20000, max_credits);
    assert !cred.isQueuing();
    assert cred.get() == 6000 && cred.getQueuedMessages() == 0 && cred.getQueuedMessageSize() == 0;
    assert msg_sender.sent_msgs == 5;
}
Also used : ReentrantLock(java.util.concurrent.locks.ReentrantLock) BytesMessage(org.jgroups.BytesMessage) Message(org.jgroups.Message) NonBlockingCredit(org.jgroups.util.NonBlockingCredit)

Example 2 with NonBlockingCredit

use of org.jgroups.util.NonBlockingCredit in project JGroups by belaban.

the class NonBlockingCreditTest method testDecrement.

public void testDecrement() {
    MessageSender msg_sender = new MessageSender();
    NonBlockingCredit cred = new NonBlockingCredit(max_credits, 500_000, new ReentrantLock(), msg_sender);
    Message msg = msg(1000);
    boolean success = cred.decrementIfEnoughCredits(msg, msg.getLength(), 500);
    assert success && cred.get() == 9000;
    cred.increment(2000, max_credits);
    assert !cred.isQueuing() && cred.get() == max_credits;
}
Also used : ReentrantLock(java.util.concurrent.locks.ReentrantLock) BytesMessage(org.jgroups.BytesMessage) Message(org.jgroups.Message) NonBlockingCredit(org.jgroups.util.NonBlockingCredit)

Example 3 with NonBlockingCredit

use of org.jgroups.util.NonBlockingCredit in project JGroups by belaban.

the class NonBlockingCreditTest method testDecrementAndBlockingOnFullQueue.

/**
 * Sender S blocks on the full queue, then another thread applies credits: S should unblock
 */
public void testDecrementAndBlockingOnFullQueue() {
    MessageSender msg_sender = new MessageSender();
    final NonBlockingCredit cred = new NonBlockingCredit(2500, 1500, new ReentrantLock(), msg_sender);
    final AtomicInteger count = new AtomicInteger();
    new Thread(() -> {
        Util.sleep(2000);
        System.out.printf("[%s] adding 10000 credits\n", Thread.currentThread());
        cred.increment(10000, 10000);
    }).start();
    for (int i = 0; i < 10; i++) {
        Message msg = msg(1000);
        cred.decrementIfEnoughCredits(msg, msg.getLength(), 2000);
        count.incrementAndGet();
    }
    System.out.printf("received %d msgs", count.get());
    assert count.get() == 10;
}
Also used : ReentrantLock(java.util.concurrent.locks.ReentrantLock) BytesMessage(org.jgroups.BytesMessage) Message(org.jgroups.Message) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) NonBlockingCredit(org.jgroups.util.NonBlockingCredit)

Example 4 with NonBlockingCredit

use of org.jgroups.util.NonBlockingCredit in project JGroups by belaban.

the class NonBlockingCreditTest method testQueueing.

/**
 * Tests sender threads being blocked and then unblocked by calling clear()
 */
public void testQueueing() throws TimeoutException {
    final NonBlockingCredit cred = new NonBlockingCredit(10000, 5000, new ReentrantLock(), null);
    Thread[] senders = new Thread[10];
    for (int i = 0; i < senders.length; i++) {
        Message msg = msg(1000);
        senders[i] = new Thread(() -> cred.decrementIfEnoughCredits(msg, msg.getLength(), 0));
    }
    Message msg = msg(10000);
    boolean rc = cred.decrementIfEnoughCredits(msg, msg.getLength(), 500);
    assert rc;
    assert !cred.isQueuing();
    // Now fill the queue
    for (int i = 0; i < 5; i++) assert !cred.decrementIfEnoughCredits(msg(1000), 1000, 500);
    assert cred.isQueuing();
    assert cred.getQueuedMessages() == 5;
    assert cred.getQueuedMessageSize() == 5000;
    for (Thread t : senders) t.start();
    Util.waitUntil(10000, 500, () -> Arrays.stream(senders).allMatch(t -> t.getState() == Thread.State.WAITING), () -> "threads:\n" + Arrays.stream(senders).map(t -> t.getId() + ": " + t.getState()).collect(Collectors.joining("\n")));
    System.out.printf("threads:\n%s\n", Arrays.stream(senders).map(t -> t.getId() + ": " + t.getState()).collect(Collectors.joining("\n")));
    assert cred.isQueuing() && cred.getQueuedMessages() == 5;
    cred.reset();
    Util.waitUntil(10000, 500, () -> Arrays.stream(senders).allMatch(t -> t.getState() == Thread.State.TERMINATED), () -> "threads:\n" + Arrays.stream(senders).map(t -> t.getId() + ": " + t.getState()).collect(Collectors.joining("\n")));
    System.out.printf("threads:\n%s\n", Arrays.stream(senders).map(t -> t.getId() + ": " + t.getState()).collect(Collectors.joining("\n")));
}
Also used : ReentrantLock(java.util.concurrent.locks.ReentrantLock) Consumer(java.util.function.Consumer) BytesMessage(org.jgroups.BytesMessage) Arrays(java.util.Arrays) Message(org.jgroups.Message) Util(org.jgroups.util.Util) ReentrantLock(java.util.concurrent.locks.ReentrantLock) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) TimeoutException(java.util.concurrent.TimeoutException) NonBlockingCredit(org.jgroups.util.NonBlockingCredit) Test(org.testng.annotations.Test) Address(org.jgroups.Address) Collectors(java.util.stream.Collectors) BytesMessage(org.jgroups.BytesMessage) Message(org.jgroups.Message) NonBlockingCredit(org.jgroups.util.NonBlockingCredit)

Aggregations

ReentrantLock (java.util.concurrent.locks.ReentrantLock)4 BytesMessage (org.jgroups.BytesMessage)4 Message (org.jgroups.Message)4 NonBlockingCredit (org.jgroups.util.NonBlockingCredit)4 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)2 Arrays (java.util.Arrays)1 TimeoutException (java.util.concurrent.TimeoutException)1 Consumer (java.util.function.Consumer)1 Collectors (java.util.stream.Collectors)1 Address (org.jgroups.Address)1 Util (org.jgroups.util.Util)1 Test (org.testng.annotations.Test)1