[jboss-jira] [JBoss JIRA] (JGRP-2103) GroupRequest times out when the only recipient leaves too soon

Dan Berindei (JIRA) issues at jboss.org
Wed Sep 28 10:11:00 EDT 2016


     [ https://issues.jboss.org/browse/JGRP-2103?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Dan Berindei updated JGRP-2103:
-------------------------------
    Affects Version/s: 3.6.10


> GroupRequest times out when the only recipient leaves too soon
> --------------------------------------------------------------
>
>                 Key: JGRP-2103
>                 URL: https://issues.jboss.org/browse/JGRP-2103
>             Project: JGroups
>          Issue Type: Bug
>    Affects Versions: 3.6.10
>            Reporter: Dan Berindei
>            Assignee: Bela Ban
>
> There is a concurrency issue when a user calls {{messageDispatcher.cast(dests, msg, options, block_for_results, null)}} and adds a listener later with {{req.setListener(listener)}}.
> If the node installs a new view between {{cast()}} and {{setListener()}} that removes all the {{dests}} nodes, the listener is never called. This test fails:
> {code}
>     public void testCastToMissingNode() throws Exception {
>         d1.setRequestHandler(new MyHandler(new byte[10]));
>         b = createChannel(a);
>         b.setName("B");
>         final CountDownLatch targetLatch = new CountDownLatch(1);
>         d2 = new MessageDispatcher(b, null, null, new RequestHandler() {
>             @Override
>             public Object handle(Message msg) throws Exception {
>                 targetLatch.await();
>                 return null;
>             }
>         });
>         b.connect("MessageDispatcherUnitTest");
>         Assert.assertEquals(2, b.getView().size());
>         final CountDownLatch futureLatch = new CountDownLatch(1);
>         FutureListener listener = new FutureListener() {
>             @Override
>             public void futureDone(Future future) {
>                 futureLatch.countDown();
>             }
>         };
>         List<Address> dests = Collections.singletonList(b.getAddress());
>         byte[] buf = new byte[1];
>         Message msg = new Message();
>         msg.setBuffer(buf);
>         NotifyingFuture<RspList<Object>> future = d1.castMessageWithFuture(dests, msg, RequestOptions.SYNC(), null);
>         b.disconnect();
>         Thread.sleep(100);
>         future.setListener(listener);
>         assertTrue(futureLatch.await(10, TimeUnit.SECONDS));
>         targetLatch.countDown();
>     }
> {code}
> If I change the {{d1.castMessageWithFuture(dests, msg, RequestOptions.SYNC(), null)}} with {{d1.castMessageWithFuture(dests, msg, RequestOptions.SYNC(), listener)}} and comment out the {{future.setListener(listener)}} line, the test passes.



--
This message was sent by Atlassian JIRA
(v6.4.11#64026)


More information about the jboss-jira mailing list