package org.jgroups.tests; import org.jgroups.Address; import org.jgroups.Message; import org.jgroups.protocols.Bundler; import org.jgroups.protocols.RingBufferBundlerLockless; import org.jgroups.util.Util; import org.testng.annotations.Test; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.stream.Stream; /** * @author Bela Ban * @since 4.0 */ @Test public class RingBundlerTestLockless { protected static final Address a=Util.createRandomAddress("A"), b=Util.createRandomAddress("B"), c=Util.createRandomAddress("C"), d=Util.createRandomAddress("D"); public void testSimpleSend() throws Exception { RingBufferBundlerLockless bundler=new RingBufferBundlerLockless(16); RingBundlerTest.MockTransport transport=new RingBundlerTest.MockTransport(); bundler.init(transport); final CountDownLatch latch=new CountDownLatch(1); Sender[] senders=new Sender[20]; for(int i=0; i < senders.length; i++) { senders[i]=new Sender(latch, bundler); senders[i].start(); } latch.countDown(); for(Sender sender: senders) sender.join(); System.out.println("bundler = " + bundler); bundler._readMessages(); System.out.println("bundler = " + bundler); } public void testSendToMultipleDestinations() throws Exception { RingBufferBundlerLockless bundler=new RingBufferBundlerLockless(16); RingBundlerTest.MockTransport transport=new RingBundlerTest.MockTransport(); bundler.init(transport); for(int i =0; i < 6; i++) bundler.send(new Message(null)); int cnt=bundler.size(); assert cnt == 6; bundler._readMessages(); System.out.println("bundler = " + bundler); assert bundler.readIndex() == 6; assert bundler.writeIndex() == 6; assert bundler.size() == 0; assert transport.map.get(null) == 1; transport.map.clear(); for(Message msg: create(10000, null, a,a,a,b,c,d,d,a, null, null, a)) bundler.send(msg); System.out.println("bundler = " + bundler); cnt=bundler.size(); assert cnt == 12; assert bundler.readIndex() == 6; assert bundler.writeIndex() == 2; bundler._readMessages(); assert bundler.readIndex() == 2; assert bundler.writeIndex() == 2; assert bundler.size() == 0; Stream.of(null, a, b, c, d).forEach(msg -> {assert transport.map.get(msg) == 1;}); } protected List<Message> create(int msg_size, Address ... destinations) { List<Message> list=new ArrayList<>(destinations.length); for(Address dest: destinations) list.add(new Message(dest, new byte[msg_size])); return list; } protected static class Sender extends Thread { protected final CountDownLatch latch; protected final Bundler bundler; public Sender(CountDownLatch latch, Bundler bundler) { this.latch=latch; this.bundler=bundler; } public void run() { try { latch.await(); } catch(InterruptedException e) { e.printStackTrace(); } try { bundler.send(new Message(a)); } catch(Exception e) { e.printStackTrace(); } } } }