You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@zookeeper.apache.org by Will Johnson <wi...@gmail.com> on 2011/07/21 22:36:36 UTC

Testing SessionExipred based on FAQ

i'm trying to test SessionExpired based on the FAQ (
http://wiki.apache.org/hadoop/ZooKeeper/FAQ)  can anyone point out why i'm
getting ConnectionLoss exceptions instead of SessionExpiredExceptions based
on the unit test below:

@Test
  public void testSimpleConnection() throws Exception {
    String hostPort = "localhost:9999";
    ZooKeeper zoo1 = new ZooKeeper(hostPort, 1000, null);

    // just make sure we can talk to zookeeper
    Assert.assertNull(zoo1.exists("/foo", false));
    zoo1.create("/foo", null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
    Assert.assertNotNull(zoo1.exists("/foo", false));

    // construct another client with the same id
    ZooKeeper zoo2 = new ZooKeeper(hostPort, zoo1.getSessionTimeout(), null,
zoo1.getSessionId(), null);
    // closing this session should invalidate the first:
http://wiki.apache.org/hadoop/ZooKeeper/FAQ
    zoo2.close();

    // sleep just to make sure everything gets evicted
    Thread.sleep(zoo1.getSessionTimeout() * 2);

    // closing this session should invalidate the first:
http://wiki.apache.org/hadoop/ZooKeeper/FAQ
    // this is where i always get ConnectionLoss instead of SessionExpired
    Assert.assertNull(zoo1.exists("/foo", false));

  }

Re: Testing SessionExipred based on FAQ

Posted by Patrick Hunt <ph...@apache.org>.
On Wed, Jul 27, 2011 at 10:58 AM, Will Johnson
<wi...@gmail.com> wrote:
> I was just about to ask about the JMX route since it seems to work but i do
> observe the 1->4 behavior you mentioned.  I ended up doing my best code wise
> and then did some basic testing with iptables but it's not what i would
> consider robust testing and far from automated.  Anything that can be done
> to allow end users to test their client code in real world-ish situation
> would be a huge help since handling these error cases seems to be so
> critical to a correctly operating zookeeper application.

I agree. There are many corner cases (1->4 is actually possible, but
unlikely) that would be good to verify a client, or clients, can
handle. We probably need some combination of mock ZK client as well as
a mock server in order to be able to cover more of these during client
testing.

Patrick

>
> On Wed, Jul 27, 2011 at 1:20 PM, Patrick Hunt <ph...@apache.org> wrote:
>
>> On second thought there is one other way - JMX allows you to close a
>> session, this could be used similarly. See tests using
>> src/java/test/org/apache/zookeeper/test/JMXEnv.java
>>
>> I think there's an issue with each of these mechanisms though. In a
>> real situation you typically see:
>>
>> 1) client connected successfully to server with session A
>> 2) client gets disconnected from server
>> 3) time passes (ie the session is expired)
>> 4) client regains connectivity to server, gets notified that session is
>> expired
>>
>> In these other cases step 2 is skipped - we go from 1 directly to 4
>> (client notified session is expired). Seems like we should have some
>> way to simulate this that more closely replicates what the code will
>> see in a real situation. I suspect this would be hard w/o a mock
>> ZooKeeper though. The more I think about it the more I feel we should
>> add such, to enable more/better client side unit testing/verification.
>>
>> Patrick
>>
>> On Wed, Jul 27, 2011 at 10:11 AM, Patrick Hunt <ph...@apache.org> wrote:
>> > At this point I'm not sure you can reliably do so without
>> > https://issues.apache.org/jira/browse/ZOOKEEPER-829
>> >
>> > Anyone?
>> >
>> > Patrick
>> >
>> > On Fri, Jul 22, 2011 at 6:17 AM, Will Johnson
>> > <wi...@gmail.com> wrote:
>> >> So give the ticket I created and ZOOKEEPER-710 how do i go about testing
>> >> session timeouts programmatically?
>> >>
>> >> On Fri, Jul 22, 2011 at 8:57 AM, Will Johnson
>> >> <wi...@gmail.com>wrote:
>> >>
>> >>> Created: https://issues.apache.org/jira/browse/ZOOKEEPER-1132
>> >>>
>> >>>
>> >>> On Thu, Jul 21, 2011 at 6:25 PM, Patrick Hunt <ph...@apache.org>
>> wrote:
>> >>>
>> >>>> I think the FAQ is out of date, iirc it's probably due to this change
>> >>>> https://issues.apache.org/jira/browse/ZOOKEEPER-710
>> >>>> specifically
>> >>>> "the leader needs to drop the connection when it sees the MOVED error
>> >>>> so that the client can reestablish the session properly with another
>> >>>> machine"
>> >>>> which I believe you are seeing here.
>> >>>>
>> >>>> Also see this thread, there are other issues:
>> >>>> http://markmail.org/message/wqj347dlrsd74qya
>> >>>>
>> >>>> I would think though that zoo1 should eventually see the session
>> >>>> expiration - it will get disconnected but will then re-attempt to
>> >>>> connect to the server, at which point it will be notice the session is
>> >>>> expired.
>> >>>>
>> >>>> Would you mind entering a JIRA for this (to update the FAQ). Thanks!
>> >>>>
>> >>>> Patrick
>> >>>>
>> >>>> On Thu, Jul 21, 2011 at 1:36 PM, Will Johnson
>> >>>> <wi...@gmail.com> wrote:
>> >>>> > i'm trying to test SessionExpired based on the FAQ (
>> >>>> > http://wiki.apache.org/hadoop/ZooKeeper/FAQ)  can anyone point out
>> why
>> >>>> i'm
>> >>>> > getting ConnectionLoss exceptions instead of
>> SessionExpiredExceptions
>> >>>> based
>> >>>> > on the unit test below:
>> >>>> >
>> >>>> > @Test
>> >>>> >  public void testSimpleConnection() throws Exception {
>> >>>> >    String hostPort = "localhost:9999";
>> >>>> >    ZooKeeper zoo1 = new ZooKeeper(hostPort, 1000, null);
>> >>>> >
>> >>>> >    // just make sure we can talk to zookeeper
>> >>>> >    Assert.assertNull(zoo1.exists("/foo", false));
>> >>>> >    zoo1.create("/foo", null, Ids.OPEN_ACL_UNSAFE,
>> CreateMode.EPHEMERAL);
>> >>>> >    Assert.assertNotNull(zoo1.exists("/foo", false));
>> >>>> >
>> >>>> >    // construct another client with the same id
>> >>>> >    ZooKeeper zoo2 = new ZooKeeper(hostPort,
>> zoo1.getSessionTimeout(),
>> >>>> null,
>> >>>> > zoo1.getSessionId(), null);
>> >>>> >    // closing this session should invalidate the first:
>> >>>> > http://wiki.apache.org/hadoop/ZooKeeper/FAQ
>> >>>> >    zoo2.close();
>> >>>> >
>> >>>> >    // sleep just to make sure everything gets evicted
>> >>>> >    Thread.sleep(zoo1.getSessionTimeout() * 2);
>> >>>> >
>> >>>> >    // closing this session should invalidate the first:
>> >>>> > http://wiki.apache.org/hadoop/ZooKeeper/FAQ
>> >>>> >    // this is where i always get ConnectionLoss instead of
>> >>>> SessionExpired
>> >>>> >    Assert.assertNull(zoo1.exists("/foo", false));
>> >>>> >
>> >>>> >  }
>> >>>> >
>> >>>>
>> >>>
>> >>>
>> >>
>> >
>>
>

Re: Testing SessionExipred based on FAQ

Posted by Will Johnson <wi...@gmail.com>.
I was just about to ask about the JMX route since it seems to work but i do
observe the 1->4 behavior you mentioned.  I ended up doing my best code wise
and then did some basic testing with iptables but it's not what i would
consider robust testing and far from automated.  Anything that can be done
to allow end users to test their client code in real world-ish situation
would be a huge help since handling these error cases seems to be so
critical to a correctly operating zookeeper application.

- will

On Wed, Jul 27, 2011 at 1:20 PM, Patrick Hunt <ph...@apache.org> wrote:

> On second thought there is one other way - JMX allows you to close a
> session, this could be used similarly. See tests using
> src/java/test/org/apache/zookeeper/test/JMXEnv.java
>
> I think there's an issue with each of these mechanisms though. In a
> real situation you typically see:
>
> 1) client connected successfully to server with session A
> 2) client gets disconnected from server
> 3) time passes (ie the session is expired)
> 4) client regains connectivity to server, gets notified that session is
> expired
>
> In these other cases step 2 is skipped - we go from 1 directly to 4
> (client notified session is expired). Seems like we should have some
> way to simulate this that more closely replicates what the code will
> see in a real situation. I suspect this would be hard w/o a mock
> ZooKeeper though. The more I think about it the more I feel we should
> add such, to enable more/better client side unit testing/verification.
>
> Patrick
>
> On Wed, Jul 27, 2011 at 10:11 AM, Patrick Hunt <ph...@apache.org> wrote:
> > At this point I'm not sure you can reliably do so without
> > https://issues.apache.org/jira/browse/ZOOKEEPER-829
> >
> > Anyone?
> >
> > Patrick
> >
> > On Fri, Jul 22, 2011 at 6:17 AM, Will Johnson
> > <wi...@gmail.com> wrote:
> >> So give the ticket I created and ZOOKEEPER-710 how do i go about testing
> >> session timeouts programmatically?
> >>
> >> On Fri, Jul 22, 2011 at 8:57 AM, Will Johnson
> >> <wi...@gmail.com>wrote:
> >>
> >>> Created: https://issues.apache.org/jira/browse/ZOOKEEPER-1132
> >>>
> >>>
> >>> On Thu, Jul 21, 2011 at 6:25 PM, Patrick Hunt <ph...@apache.org>
> wrote:
> >>>
> >>>> I think the FAQ is out of date, iirc it's probably due to this change
> >>>> https://issues.apache.org/jira/browse/ZOOKEEPER-710
> >>>> specifically
> >>>> "the leader needs to drop the connection when it sees the MOVED error
> >>>> so that the client can reestablish the session properly with another
> >>>> machine"
> >>>> which I believe you are seeing here.
> >>>>
> >>>> Also see this thread, there are other issues:
> >>>> http://markmail.org/message/wqj347dlrsd74qya
> >>>>
> >>>> I would think though that zoo1 should eventually see the session
> >>>> expiration - it will get disconnected but will then re-attempt to
> >>>> connect to the server, at which point it will be notice the session is
> >>>> expired.
> >>>>
> >>>> Would you mind entering a JIRA for this (to update the FAQ). Thanks!
> >>>>
> >>>> Patrick
> >>>>
> >>>> On Thu, Jul 21, 2011 at 1:36 PM, Will Johnson
> >>>> <wi...@gmail.com> wrote:
> >>>> > i'm trying to test SessionExpired based on the FAQ (
> >>>> > http://wiki.apache.org/hadoop/ZooKeeper/FAQ)  can anyone point out
> why
> >>>> i'm
> >>>> > getting ConnectionLoss exceptions instead of
> SessionExpiredExceptions
> >>>> based
> >>>> > on the unit test below:
> >>>> >
> >>>> > @Test
> >>>> >  public void testSimpleConnection() throws Exception {
> >>>> >    String hostPort = "localhost:9999";
> >>>> >    ZooKeeper zoo1 = new ZooKeeper(hostPort, 1000, null);
> >>>> >
> >>>> >    // just make sure we can talk to zookeeper
> >>>> >    Assert.assertNull(zoo1.exists("/foo", false));
> >>>> >    zoo1.create("/foo", null, Ids.OPEN_ACL_UNSAFE,
> CreateMode.EPHEMERAL);
> >>>> >    Assert.assertNotNull(zoo1.exists("/foo", false));
> >>>> >
> >>>> >    // construct another client with the same id
> >>>> >    ZooKeeper zoo2 = new ZooKeeper(hostPort,
> zoo1.getSessionTimeout(),
> >>>> null,
> >>>> > zoo1.getSessionId(), null);
> >>>> >    // closing this session should invalidate the first:
> >>>> > http://wiki.apache.org/hadoop/ZooKeeper/FAQ
> >>>> >    zoo2.close();
> >>>> >
> >>>> >    // sleep just to make sure everything gets evicted
> >>>> >    Thread.sleep(zoo1.getSessionTimeout() * 2);
> >>>> >
> >>>> >    // closing this session should invalidate the first:
> >>>> > http://wiki.apache.org/hadoop/ZooKeeper/FAQ
> >>>> >    // this is where i always get ConnectionLoss instead of
> >>>> SessionExpired
> >>>> >    Assert.assertNull(zoo1.exists("/foo", false));
> >>>> >
> >>>> >  }
> >>>> >
> >>>>
> >>>
> >>>
> >>
> >
>

Re: Testing SessionExipred based on FAQ

Posted by Patrick Hunt <ph...@apache.org>.
On second thought there is one other way - JMX allows you to close a
session, this could be used similarly. See tests using
src/java/test/org/apache/zookeeper/test/JMXEnv.java

I think there's an issue with each of these mechanisms though. In a
real situation you typically see:

1) client connected successfully to server with session A
2) client gets disconnected from server
3) time passes (ie the session is expired)
4) client regains connectivity to server, gets notified that session is expired

In these other cases step 2 is skipped - we go from 1 directly to 4
(client notified session is expired). Seems like we should have some
way to simulate this that more closely replicates what the code will
see in a real situation. I suspect this would be hard w/o a mock
ZooKeeper though. The more I think about it the more I feel we should
add such, to enable more/better client side unit testing/verification.

Patrick

On Wed, Jul 27, 2011 at 10:11 AM, Patrick Hunt <ph...@apache.org> wrote:
> At this point I'm not sure you can reliably do so without
> https://issues.apache.org/jira/browse/ZOOKEEPER-829
>
> Anyone?
>
> Patrick
>
> On Fri, Jul 22, 2011 at 6:17 AM, Will Johnson
> <wi...@gmail.com> wrote:
>> So give the ticket I created and ZOOKEEPER-710 how do i go about testing
>> session timeouts programmatically?
>>
>> On Fri, Jul 22, 2011 at 8:57 AM, Will Johnson
>> <wi...@gmail.com>wrote:
>>
>>> Created: https://issues.apache.org/jira/browse/ZOOKEEPER-1132
>>>
>>>
>>> On Thu, Jul 21, 2011 at 6:25 PM, Patrick Hunt <ph...@apache.org> wrote:
>>>
>>>> I think the FAQ is out of date, iirc it's probably due to this change
>>>> https://issues.apache.org/jira/browse/ZOOKEEPER-710
>>>> specifically
>>>> "the leader needs to drop the connection when it sees the MOVED error
>>>> so that the client can reestablish the session properly with another
>>>> machine"
>>>> which I believe you are seeing here.
>>>>
>>>> Also see this thread, there are other issues:
>>>> http://markmail.org/message/wqj347dlrsd74qya
>>>>
>>>> I would think though that zoo1 should eventually see the session
>>>> expiration - it will get disconnected but will then re-attempt to
>>>> connect to the server, at which point it will be notice the session is
>>>> expired.
>>>>
>>>> Would you mind entering a JIRA for this (to update the FAQ). Thanks!
>>>>
>>>> Patrick
>>>>
>>>> On Thu, Jul 21, 2011 at 1:36 PM, Will Johnson
>>>> <wi...@gmail.com> wrote:
>>>> > i'm trying to test SessionExpired based on the FAQ (
>>>> > http://wiki.apache.org/hadoop/ZooKeeper/FAQ)  can anyone point out why
>>>> i'm
>>>> > getting ConnectionLoss exceptions instead of SessionExpiredExceptions
>>>> based
>>>> > on the unit test below:
>>>> >
>>>> > @Test
>>>> >  public void testSimpleConnection() throws Exception {
>>>> >    String hostPort = "localhost:9999";
>>>> >    ZooKeeper zoo1 = new ZooKeeper(hostPort, 1000, null);
>>>> >
>>>> >    // just make sure we can talk to zookeeper
>>>> >    Assert.assertNull(zoo1.exists("/foo", false));
>>>> >    zoo1.create("/foo", null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
>>>> >    Assert.assertNotNull(zoo1.exists("/foo", false));
>>>> >
>>>> >    // construct another client with the same id
>>>> >    ZooKeeper zoo2 = new ZooKeeper(hostPort, zoo1.getSessionTimeout(),
>>>> null,
>>>> > zoo1.getSessionId(), null);
>>>> >    // closing this session should invalidate the first:
>>>> > http://wiki.apache.org/hadoop/ZooKeeper/FAQ
>>>> >    zoo2.close();
>>>> >
>>>> >    // sleep just to make sure everything gets evicted
>>>> >    Thread.sleep(zoo1.getSessionTimeout() * 2);
>>>> >
>>>> >    // closing this session should invalidate the first:
>>>> > http://wiki.apache.org/hadoop/ZooKeeper/FAQ
>>>> >    // this is where i always get ConnectionLoss instead of
>>>> SessionExpired
>>>> >    Assert.assertNull(zoo1.exists("/foo", false));
>>>> >
>>>> >  }
>>>> >
>>>>
>>>
>>>
>>
>

Re: Testing SessionExipred based on FAQ

Posted by Patrick Hunt <ph...@apache.org>.
At this point I'm not sure you can reliably do so without
https://issues.apache.org/jira/browse/ZOOKEEPER-829

Anyone?

Patrick

On Fri, Jul 22, 2011 at 6:17 AM, Will Johnson
<wi...@gmail.com> wrote:
> So give the ticket I created and ZOOKEEPER-710 how do i go about testing
> session timeouts programmatically?
>
> On Fri, Jul 22, 2011 at 8:57 AM, Will Johnson
> <wi...@gmail.com>wrote:
>
>> Created: https://issues.apache.org/jira/browse/ZOOKEEPER-1132
>>
>>
>> On Thu, Jul 21, 2011 at 6:25 PM, Patrick Hunt <ph...@apache.org> wrote:
>>
>>> I think the FAQ is out of date, iirc it's probably due to this change
>>> https://issues.apache.org/jira/browse/ZOOKEEPER-710
>>> specifically
>>> "the leader needs to drop the connection when it sees the MOVED error
>>> so that the client can reestablish the session properly with another
>>> machine"
>>> which I believe you are seeing here.
>>>
>>> Also see this thread, there are other issues:
>>> http://markmail.org/message/wqj347dlrsd74qya
>>>
>>> I would think though that zoo1 should eventually see the session
>>> expiration - it will get disconnected but will then re-attempt to
>>> connect to the server, at which point it will be notice the session is
>>> expired.
>>>
>>> Would you mind entering a JIRA for this (to update the FAQ). Thanks!
>>>
>>> Patrick
>>>
>>> On Thu, Jul 21, 2011 at 1:36 PM, Will Johnson
>>> <wi...@gmail.com> wrote:
>>> > i'm trying to test SessionExpired based on the FAQ (
>>> > http://wiki.apache.org/hadoop/ZooKeeper/FAQ)  can anyone point out why
>>> i'm
>>> > getting ConnectionLoss exceptions instead of SessionExpiredExceptions
>>> based
>>> > on the unit test below:
>>> >
>>> > @Test
>>> >  public void testSimpleConnection() throws Exception {
>>> >    String hostPort = "localhost:9999";
>>> >    ZooKeeper zoo1 = new ZooKeeper(hostPort, 1000, null);
>>> >
>>> >    // just make sure we can talk to zookeeper
>>> >    Assert.assertNull(zoo1.exists("/foo", false));
>>> >    zoo1.create("/foo", null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
>>> >    Assert.assertNotNull(zoo1.exists("/foo", false));
>>> >
>>> >    // construct another client with the same id
>>> >    ZooKeeper zoo2 = new ZooKeeper(hostPort, zoo1.getSessionTimeout(),
>>> null,
>>> > zoo1.getSessionId(), null);
>>> >    // closing this session should invalidate the first:
>>> > http://wiki.apache.org/hadoop/ZooKeeper/FAQ
>>> >    zoo2.close();
>>> >
>>> >    // sleep just to make sure everything gets evicted
>>> >    Thread.sleep(zoo1.getSessionTimeout() * 2);
>>> >
>>> >    // closing this session should invalidate the first:
>>> > http://wiki.apache.org/hadoop/ZooKeeper/FAQ
>>> >    // this is where i always get ConnectionLoss instead of
>>> SessionExpired
>>> >    Assert.assertNull(zoo1.exists("/foo", false));
>>> >
>>> >  }
>>> >
>>>
>>
>>
>

Re: Testing SessionExipred based on FAQ

Posted by Will Johnson <wi...@gmail.com>.
So give the ticket I created and ZOOKEEPER-710 how do i go about testing
session timeouts programmatically?

On Fri, Jul 22, 2011 at 8:57 AM, Will Johnson
<wi...@gmail.com>wrote:

> Created: https://issues.apache.org/jira/browse/ZOOKEEPER-1132
>
>
> On Thu, Jul 21, 2011 at 6:25 PM, Patrick Hunt <ph...@apache.org> wrote:
>
>> I think the FAQ is out of date, iirc it's probably due to this change
>> https://issues.apache.org/jira/browse/ZOOKEEPER-710
>> specifically
>> "the leader needs to drop the connection when it sees the MOVED error
>> so that the client can reestablish the session properly with another
>> machine"
>> which I believe you are seeing here.
>>
>> Also see this thread, there are other issues:
>> http://markmail.org/message/wqj347dlrsd74qya
>>
>> I would think though that zoo1 should eventually see the session
>> expiration - it will get disconnected but will then re-attempt to
>> connect to the server, at which point it will be notice the session is
>> expired.
>>
>> Would you mind entering a JIRA for this (to update the FAQ). Thanks!
>>
>> Patrick
>>
>> On Thu, Jul 21, 2011 at 1:36 PM, Will Johnson
>> <wi...@gmail.com> wrote:
>> > i'm trying to test SessionExpired based on the FAQ (
>> > http://wiki.apache.org/hadoop/ZooKeeper/FAQ)  can anyone point out why
>> i'm
>> > getting ConnectionLoss exceptions instead of SessionExpiredExceptions
>> based
>> > on the unit test below:
>> >
>> > @Test
>> >  public void testSimpleConnection() throws Exception {
>> >    String hostPort = "localhost:9999";
>> >    ZooKeeper zoo1 = new ZooKeeper(hostPort, 1000, null);
>> >
>> >    // just make sure we can talk to zookeeper
>> >    Assert.assertNull(zoo1.exists("/foo", false));
>> >    zoo1.create("/foo", null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
>> >    Assert.assertNotNull(zoo1.exists("/foo", false));
>> >
>> >    // construct another client with the same id
>> >    ZooKeeper zoo2 = new ZooKeeper(hostPort, zoo1.getSessionTimeout(),
>> null,
>> > zoo1.getSessionId(), null);
>> >    // closing this session should invalidate the first:
>> > http://wiki.apache.org/hadoop/ZooKeeper/FAQ
>> >    zoo2.close();
>> >
>> >    // sleep just to make sure everything gets evicted
>> >    Thread.sleep(zoo1.getSessionTimeout() * 2);
>> >
>> >    // closing this session should invalidate the first:
>> > http://wiki.apache.org/hadoop/ZooKeeper/FAQ
>> >    // this is where i always get ConnectionLoss instead of
>> SessionExpired
>> >    Assert.assertNull(zoo1.exists("/foo", false));
>> >
>> >  }
>> >
>>
>
>

Re: Testing SessionExipred based on FAQ

Posted by Will Johnson <wi...@gmail.com>.
Created: https://issues.apache.org/jira/browse/ZOOKEEPER-1132

On Thu, Jul 21, 2011 at 6:25 PM, Patrick Hunt <ph...@apache.org> wrote:

> I think the FAQ is out of date, iirc it's probably due to this change
> https://issues.apache.org/jira/browse/ZOOKEEPER-710
> specifically
> "the leader needs to drop the connection when it sees the MOVED error
> so that the client can reestablish the session properly with another
> machine"
> which I believe you are seeing here.
>
> Also see this thread, there are other issues:
> http://markmail.org/message/wqj347dlrsd74qya
>
> I would think though that zoo1 should eventually see the session
> expiration - it will get disconnected but will then re-attempt to
> connect to the server, at which point it will be notice the session is
> expired.
>
> Would you mind entering a JIRA for this (to update the FAQ). Thanks!
>
> Patrick
>
> On Thu, Jul 21, 2011 at 1:36 PM, Will Johnson
> <wi...@gmail.com> wrote:
> > i'm trying to test SessionExpired based on the FAQ (
> > http://wiki.apache.org/hadoop/ZooKeeper/FAQ)  can anyone point out why
> i'm
> > getting ConnectionLoss exceptions instead of SessionExpiredExceptions
> based
> > on the unit test below:
> >
> > @Test
> >  public void testSimpleConnection() throws Exception {
> >    String hostPort = "localhost:9999";
> >    ZooKeeper zoo1 = new ZooKeeper(hostPort, 1000, null);
> >
> >    // just make sure we can talk to zookeeper
> >    Assert.assertNull(zoo1.exists("/foo", false));
> >    zoo1.create("/foo", null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
> >    Assert.assertNotNull(zoo1.exists("/foo", false));
> >
> >    // construct another client with the same id
> >    ZooKeeper zoo2 = new ZooKeeper(hostPort, zoo1.getSessionTimeout(),
> null,
> > zoo1.getSessionId(), null);
> >    // closing this session should invalidate the first:
> > http://wiki.apache.org/hadoop/ZooKeeper/FAQ
> >    zoo2.close();
> >
> >    // sleep just to make sure everything gets evicted
> >    Thread.sleep(zoo1.getSessionTimeout() * 2);
> >
> >    // closing this session should invalidate the first:
> > http://wiki.apache.org/hadoop/ZooKeeper/FAQ
> >    // this is where i always get ConnectionLoss instead of SessionExpired
> >    Assert.assertNull(zoo1.exists("/foo", false));
> >
> >  }
> >
>

Re: Testing SessionExipred based on FAQ

Posted by Patrick Hunt <ph...@apache.org>.
I think the FAQ is out of date, iirc it's probably due to this change
https://issues.apache.org/jira/browse/ZOOKEEPER-710
specifically
"the leader needs to drop the connection when it sees the MOVED error
so that the client can reestablish the session properly with another
machine"
which I believe you are seeing here.

Also see this thread, there are other issues:
http://markmail.org/message/wqj347dlrsd74qya

I would think though that zoo1 should eventually see the session
expiration - it will get disconnected but will then re-attempt to
connect to the server, at which point it will be notice the session is
expired.

Would you mind entering a JIRA for this (to update the FAQ). Thanks!

Patrick

On Thu, Jul 21, 2011 at 1:36 PM, Will Johnson
<wi...@gmail.com> wrote:
> i'm trying to test SessionExpired based on the FAQ (
> http://wiki.apache.org/hadoop/ZooKeeper/FAQ)  can anyone point out why i'm
> getting ConnectionLoss exceptions instead of SessionExpiredExceptions based
> on the unit test below:
>
> @Test
>  public void testSimpleConnection() throws Exception {
>    String hostPort = "localhost:9999";
>    ZooKeeper zoo1 = new ZooKeeper(hostPort, 1000, null);
>
>    // just make sure we can talk to zookeeper
>    Assert.assertNull(zoo1.exists("/foo", false));
>    zoo1.create("/foo", null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
>    Assert.assertNotNull(zoo1.exists("/foo", false));
>
>    // construct another client with the same id
>    ZooKeeper zoo2 = new ZooKeeper(hostPort, zoo1.getSessionTimeout(), null,
> zoo1.getSessionId(), null);
>    // closing this session should invalidate the first:
> http://wiki.apache.org/hadoop/ZooKeeper/FAQ
>    zoo2.close();
>
>    // sleep just to make sure everything gets evicted
>    Thread.sleep(zoo1.getSessionTimeout() * 2);
>
>    // closing this session should invalidate the first:
> http://wiki.apache.org/hadoop/ZooKeeper/FAQ
>    // this is where i always get ConnectionLoss instead of SessionExpired
>    Assert.assertNull(zoo1.exists("/foo", false));
>
>  }
>