users@shoal.java.net

Re: [Shoal-Users] Re: send message after join

From: Jerry Raj <jerryr_at_sun.com>
Date: Fri, 19 Jun 2009 10:22:34 +0530

Shreedhar Ganapathy wrote:
>
>
> Jerry Raj wrote:
>> Joseph Fialli wrote:
>>
>>> Jerry Raj wrote:
>>>
>>>> Any suggestions?
>>>> Or at least a way to check whether join is complete before calling send?
>>>>
>>>>
>>> Jerry,
>>>
>>> It is not that join is not complete for the sender, the sender is
>>> definitely part of the group when join returns.
>>>
>> OK.
>>
>>> It could be the other members of the group probably have not joined yet.
>>>
>> I have only two members in the group. Both run identical code. The first one
>> starts up, joins the group and sends a message (which goes nowhere, but thats
>> ok). Now I start the second one. When the second member sends a message, it
>> should be received by the first one, but that does not happen. Unless I add a
>> delay between join() and send() calls.
>>
> Do you see a view change with the two members in it ?
Yes, I do.
> If your send() is around the same time as the time the view change
> happens then you will have message loss.

Ah. This must be it. Since the join and send happen immediately one after the
other, its quite likely that the send happens while the existing peers are
processing the view change.

> Also, with Shoal 1.1 we have made a lot of synchronization improvements
> for correctness, which may have cost somewhat at the time of startup of
> members.
>
> Could you try out the code snippet that Joe provided as a way to ensure
> that message sending happens only when requisite memberships in the
> group are in place ?

I have no pre-existing knowledge of the number of expected peers. So waiting for
"all" of them to join has no real meaning for me. The idea here is that peers
can join and leave as they please. The message they send as soon as they join is
used by existing peers (if any) to gain certain data about the new peer (its IP
address, port its listening on etc). So the code from below will not really work
for me, since I have no idea if any more peers will join or not.

I can live with having a sleep between join and send for now, except it seems
rather non-deterministic: are we always sure that 5 secs is enough? Under load
will this go up? A clear callback or signal that says "It is now safe to send
messages" will be much better.

-Jerry

>
> Thanks
> Shreedhar
>
>> The same identical code worked fine with Shoal 1.0.
>>
>> I hope this clarifies the use-case.
>> -Jerry
>>
>>
>>> However, there is not enough information in your original post to
>>> confirm or deny this.
>>>
>>> You could delay sending a message to the group until there is certain
>>> number of members joined or
>>> you could wait for all members to have joined via JoinNotification event.
>>>
>>> Pull API:
>>>
>>> List<String> members = gms.getGroupHandle().getAllCurrentMembers();
>>> <wait to send first message until all expected number of members have
>>> joined>
>>>
>>> Event driven API:
>>>
>>> gms.addActionFactory( new JoinNotificationActionFactoryImpl( new
>>> JoinNotificationCallBack( serverName ) ) );
>>> gms.join();
>>> <wait till all expected instances have joined before sending message;
>>> use info calculated from JoinNotificationCallback>
>>>
>>> private class JoinNotificationCallBack implements CallBack {
>>>
>>> private String serverName;
>>>
>>> public JoinNotificationCallBack( String serverName ) {
>>> this.serverName = serverName;
>>> }
>>>
>>> // called for every instance joining the gms group.
>>> public void processNotification( Signal notification ) {
>>> <record instance has joined>;
>>> }
>>> }
>>>
>>> A non-coding way to check this out is to start all your receiving
>>> clients first.
>>> Wait 10 seconds (like your initial test).
>>> Then start your sending gms client.
>>> There is no need a sleep between the join and send since all the other
>>> members
>>> will have already joined. Hope this helps.
>>>
>>> -Joe
>>>
>>>> Thanks
>>>> -Jerry
>>>>
>>>> Jerry Raj wrote:
>>>>
>>>>
>>>>> Hello,
>>>>> I have code like this:
>>>>> <snip>
>>>>> gms.join();
>>>>> // Commented: Thread.sleep(10000);
>>>>> GroupHandle gh = gms.getGroupHandle();
>>>>>
>>>>> gh.sendMessage(blah);
>>>>>
>>>>> </snip>
>>>>>
>>>>> This used to work fine in Shoal 1.0. The node would join the group
>>>>> and the
>>>>> message would be recd by other members in the group. But this does
>>>>> not happen
>>>>> with Shoal 1.1 unless I uncomment the sleep(10000) between join() and
>>>>> send(). I
>>>>> expect this is because the join operation has not completed
>>>>> successfully when
>>>>> send() is called. Is there a way to be notified when join is
>>>>> complete? I tried
>>>>> looking at JoinedAndReadyNotificationActionImpl but that does not
>>>>> seem to work?
>>>>>
>>>>> I'm using Shoal 1.1 from the download link on the front page of the
>>>>> Shoal website.
>>>>>
>>>>> -Jerry
>>>>>
>>>>>
>>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscribe_at_shoal.dev.java.net <mailto:users-unsubscribe_at_shoal.dev.java.net>
>>>> For additional commands, e-mail: users-help_at_shoal.dev.java.net <mailto:users-help_at_shoal.dev.java.net>
>>>>
>>>>
>>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe_at_shoal.dev.java.net <mailto:users-unsubscribe_at_shoal.dev.java.net>
>>> For additional commands, e-mail: users-help_at_shoal.dev.java.net <mailto:users-help_at_shoal.dev.java.net>
>>>
>>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe_at_shoal.dev.java.net <mailto:users-unsubscribe_at_shoal.dev.java.net>
>> For additional commands, e-mail: users-help_at_shoal.dev.java.net <mailto:users-help_at_shoal.dev.java.net>
>>
>>