use of net.dempsy.router.RoutingStrategy.ContainerAddress in project Dempsy by Dempsy.
the class TestLeaderAndSubscriber method testLeaderWithMutipleSubscribers.
@Test
public void testLeaderWithMutipleSubscribers() throws Exception {
final int NUM_SUBS = 10;
final ClusterId cid = setTestName("testLeaderWithMutipleSubscribers");
final AtomicBoolean isRunning = new AtomicBoolean(true);
final List<Thread> threads = new ArrayList<>();
try {
final List<Subscriber<ContainerAddress>> subs = new ArrayList<>();
final AtomicBoolean go = new AtomicBoolean(false);
for (int i = 0; i < NUM_SUBS; i++) {
final Utils<ContainerAddress> utils = new Utils<>(makeInfra(session, sched), cid.clusterName, new ContainerAddress(new DummyNodeAddress(), new int[] { 0 }));
final Subscriber<ContainerAddress> s;
subs.add(s = new Subscriber<>(utils, infra, isRunning, (l, m) -> {
}, 256));
final Thread t = new Thread(() -> {
// wait for it.
while (!go.get()) {
if (!isRunning.get())
return;
Thread.yield();
}
s.process();
}, "testLeaderWithMutipleSubscribers-" + i);
t.start();
threads.add(t);
}
go.set(true);
final Utils<ContainerAddress> utils = new Utils<>(makeInfra(session, sched), cid.clusterName, subs.get(3).getUtils().thisNodeAddress);
final Leader<ContainerAddress> l = new Leader<>(utils, 256, 1, infra, isRunning, ContainerAddress[]::new);
l.process();
assertTrue(poll(o -> l.imIt()));
// wait until ready
assertTrue(poll(o -> subs.stream().filter(s -> s.isReady()).count() == NUM_SUBS));
final int lowerNum = Math.floorDiv(256, NUM_SUBS);
final int upperNum = (int) Math.ceil((double) 256 / NUM_SUBS);
// do we have balanced subs?
assertTrue(poll(o -> subs.stream().filter(s -> s.numShardsIOwn() >= lowerNum).filter(s -> s.numShardsIOwn() <= upperNum).count() == NUM_SUBS));
isRunning.set(false);
assertTrue(poll(o -> threads.stream().filter(t -> t.isAlive()).count() == 0));
} finally {
isRunning.set(false);
}
}
use of net.dempsy.router.RoutingStrategy.ContainerAddress in project Dempsy by Dempsy.
the class TestManagedRoutingStrategy method testInboundResillience.
@Test
public void testInboundResillience() throws Exception {
final int numShardsToExpect = Integer.parseInt(Utils.DEFAULT_TOTAL_SHARDS);
final Manager<RoutingStrategy.Inbound> manager = new Manager<>(RoutingStrategy.Inbound.class);
try (final RoutingStrategy.Inbound ib = manager.getAssociatedInstance(ManagedInbound.class.getPackage().getName())) {
final ClusterId clusterId = super.setTestName("testInboundResillience");
final ContainerAddress ca = new ContainerAddress(new DummyNodeAddress("theOnlyNode"), 0);
final Infrastructure infra = makeInfra(session, sched);
final Utils<ContainerAddress> msutils = new Utils<>(infra, clusterId.clusterName, ca);
ib.setContainerDetails(clusterId, ca, (l, m) -> {
});
ib.start(infra);
checkForShardDistribution(session, msutils, numShardsToExpect, 1);
disruptor.accept(session);
checkForShardDistribution(session, msutils, numShardsToExpect, 1);
}
}
use of net.dempsy.router.RoutingStrategy.ContainerAddress in project Dempsy by Dempsy.
the class TestManagedRoutingStrategy method testInboundDoubleHappyPathRegister.
@Test
public void testInboundDoubleHappyPathRegister() throws Exception {
final int numShardsToExpect = Integer.parseInt(Utils.DEFAULT_TOTAL_SHARDS);
try (final RoutingStrategy.Inbound ib1 = new Manager<>(RoutingStrategy.Inbound.class).getAssociatedInstance(ManagedInbound.class.getPackage().getName());
final RoutingStrategy.Inbound ib2 = new Manager<>(RoutingStrategy.Inbound.class).getAssociatedInstance(ManagedInbound.class.getPackage().getName())) {
final ClusterId clusterId = new ClusterId("test", "test");
final ContainerAddress node1Ca = new ContainerAddress(new DummyNodeAddress("node1"), 0);
final Utils<ContainerAddress> utils = new Utils<>(infra, clusterId.clusterName, node1Ca);
ib1.setContainerDetails(clusterId, node1Ca, (l, m) -> {
});
ib1.start(infra);
final ContainerAddress node2Ca = new ContainerAddress(new DummyNodeAddress("node2"), 0);
ib2.setContainerDetails(clusterId, node2Ca, (l, m) -> {
});
try (final ClusterInfoSession session2 = sessFact.createSession()) {
ib2.start(new TestInfrastructure(session2, infra.getScheduler()));
assertTrue(waitForShards(session, utils, numShardsToExpect));
// if this worked right then numShardsToExpect/2 should be owned by each ... eventually.
checkForShardDistribution(session, utils, numShardsToExpect, 2);
// disrupt the session. This should cause a reshuffle but not fail
disruptor.accept(session2);
// everything should settle back
checkForShardDistribution(session, utils, numShardsToExpect, 2);
// now kill the second session.
// this will disconnect the second Inbound and so the first should take over
session2.close();
// see if we now have 1 session and it has all shards
checkForShardDistribution(session, utils, numShardsToExpect, 1);
}
}
}
use of net.dempsy.router.RoutingStrategy.ContainerAddress in project Dempsy by Dempsy.
the class TestManagedRoutingStrategy method testInboundWithOutbound.
@Test
public void testInboundWithOutbound() throws Exception {
final int numShardsToExpect = Integer.parseInt(Utils.DEFAULT_TOTAL_SHARDS);
final Manager<RoutingStrategy.Inbound> manager = new Manager<>(RoutingStrategy.Inbound.class);
try (final RoutingStrategy.Inbound ib = manager.getAssociatedInstance(ManagedInbound.class.getPackage().getName())) {
final ClusterId cid = setTestName("testInboundWithOutbound");
final ContainerAddress oca = new ContainerAddress(new DummyNodeAddress("here"), 0);
final Infrastructure infra = makeInfra(session, sched);
final Utils<ContainerAddress> msutils = new Utils<>(infra, cid.clusterName, oca);
ib.setContainerDetails(cid, oca, (l, m) -> {
});
ib.start(infra);
checkForShardDistribution(session, msutils, numShardsToExpect, 1);
try (final ClusterInfoSession ses2 = sessFact.createSession();
final RoutingStrategyManager obman = chain(new RoutingStrategyManager(), o -> o.start(makeInfra(ses2, sched)));
final RoutingStrategy.Factory obf = obman.getAssociatedInstance(ManagedInbound.class.getPackage().getName())) {
obf.start(makeInfra(ses2, sched));
assertTrue(poll(o -> obf.isReady()));
final RoutingStrategy.Router ob = obf.getStrategy(cid);
assertTrue(poll(o -> obf.isReady()));
final KeyedMessageWithType km = new KeyedMessageWithType(new Object(), new Object(), "");
assertTrue(poll(o -> ob.selectDestinationForMessage(km) != null));
final ContainerAddress ca = ob.selectDestinationForMessage(km);
assertNotNull(ca);
assertEquals("here", ((DummyNodeAddress) ca.node).name);
// now disrupt the session
session.close();
try (ClusterInfoSession ses3 = sessFact.createSession();
RoutingStrategy.Inbound ib2 = manager.getAssociatedInstance(ManagedInbound.class.getPackage().getName())) {
ib2.setContainerDetails(cid, ca, (l, m) -> {
});
ib2.start(makeInfra(ses3, sched));
assertTrue(poll(o -> ob.selectDestinationForMessage(km) != null));
}
}
}
}
use of net.dempsy.router.RoutingStrategy.ContainerAddress in project Dempsy by Dempsy.
the class TestSimpleRoutingStrategy method testInboundResillience.
@Test
public void testInboundResillience() throws Exception {
final Manager<RoutingStrategy.Inbound> manager = new Manager<>(RoutingStrategy.Inbound.class);
try (final RoutingStrategy.Inbound ib = manager.getAssociatedInstance(SimpleRoutingStrategy.class.getPackage().getName())) {
assertNotNull(ib);
assertTrue(SimpleInboundSide.class.isAssignableFrom(ib.getClass()));
ib.setContainerDetails(new ClusterId("test", "test"), new ContainerAddress(new DummyNodeAddress(), 0), (l, m) -> {
});
ib.start(infra);
assertTrue(waitForReg(session));
// get the current ephem dir
final String actualDir = ((SimpleInboundSide) ib).getAddressSubdirectory();
assertNotNull(actualDir);
session.rmdir(actualDir);
assertTrue(waitForReg(session));
final String newDir = ((SimpleInboundSide) ib).getAddressSubdirectory();
assertNotEquals(actualDir, newDir);
}
}
Aggregations