You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@zookeeper.apache.org by Zili Chen <wa...@gmail.com> on 2019/09/24 11:53:27 UTC

how session expire works in zookeeper codebase?

Hi ZooKeepers,

I want to trace where Watcher.Event.KeeperState.Expired generated and it
seems only generated
when connect to server fails due to exceed session timeout.

Besides, I find code snippet in ClientCnxn as below

void queueEvent(String clientPath, int err, Set<Watcher>
materializedWatchers, EventType eventType) {
        KeeperState sessionState = KeeperState.SyncConnected;
        if (KeeperException.Code.SESSIONEXPIRED.intValue() == err
            || KeeperException.Code.CONNECTIONLOSS.intValue() == err) {
            sessionState = Event.KeeperState.Disconnected;
        }
        WatchedEvent event = new WatchedEvent(eventType, sessionState,
clientPath);
        eventThread.queueEvent(event, materializedWatchers);
    }

which seems a bit wried to me what we queue
a Event.KeeperState.Disconnected on
KeeperException.Code.SESSIONEXPIRED.

Back to the question, how zookeeper discovers and triggers session expire
event on
session expired after connection established successfully?

Best,
tison.

Re: how session expire works in zookeeper codebase?

Posted by Zili Chen <wa...@gmail.com>.
Michael,

Thanks for your information. I found the codepath that client finds out
session expiration through reconnection.
However, still I cannot find where the client finds out session expiration
from responses.

Could you describe one of such case use server and client instead of bare
"ZooKeeper"? As far as I learn
ZooKeeperServer closes socket on session expiration so that there is never
session expire response from
server side.

Michael Han <ha...@apache.org> 于2019年9月25日周三 上午5:12写道:

> >> However, session could expire after connection established. Where is the
> latter case trigger?
>
> ZooKeeper checks every incoming request and the appertained session. When a
> session is expiring, all requests appertain to this session will fail
> session check and the responses generated will contain session expire code
> in the response header.  On client side, the response is parsed and session
> expire error is extracted and thrown to client if there are pending
> requests submitted.
>
> Once the session is expired, server will close socket. Depends on how fast
> session expiration is (it's not done instantly as it's a quorum operation),
> client may either find out session expiration from responses of their
> requests, or through reconnection.
>
>
> On Tue, Sep 24, 2019 at 11:04 AM Zili Chen <wa...@gmail.com> wrote:
>
> > Enrico,
> >
> > Well I think I understand how it works now and why you said it is a weird
> > edge case
> >
> > >if the server/cluster is down the session cannot expire.
> >
> > If the server find a session expire, it will close the socket and the
> > client will try to
> > reconnect to the ensemble. While it successfully reconnects to one of the
> > ensemble it will find session expire...
> >
> > You're right that if we lost connection to all the ensemble we cannot
> even
> > notice
> > that we are in session expired state. And I think it is the reason why
> > Curator
> > also check if time has already elapsed over session timeout.
> >
> > Best,
> > tison.
> >
> >
> > Zili Chen <wa...@gmail.com> 于2019年9月24日周二 下午8:20写道:
> >
> > > Enrico,
> > >
> > > Thanks for your reply.
> > >
> > > Still I cannot understand how session expire detected on client side.
> The
> > > only codepath
> > > KeeperState.Expired generated is ClientCnxn#onConnected. It seems only
> > > called on
> > > client successfully connected to server. However, session could expire
> > > after connection
> > > established. Where is the latter case trigger?
> > >
> > > Best,
> > > tison.
> > >
> > >
> > > Enrico Olivelli <eo...@gmail.com> 于2019年9月24日周二 下午8:06写道:
> > >
> > >> Zili,
> > >> Sessions expire in the server. If you are not connected to the cluster
> > you
> > >> cannot assume that the session is expired.
> > >>
> > >> There is another weird edge case: if the server/cluster is down the
> > >> session
> > >> cannot expire.
> > >>
> > >> Hope that helps
> > >> Enrico
> > >>
> > >> Il mar 24 set 2019, 13:54 Zili Chen <wa...@gmail.com> ha
> scritto:
> > >>
> > >> > Hi ZooKeepers,
> > >> >
> > >> > I want to trace where Watcher.Event.KeeperState.Expired generated
> and
> > it
> > >> > seems only generated
> > >> > when connect to server fails due to exceed session timeout.
> > >> >
> > >> > Besides, I find code snippet in ClientCnxn as below
> > >> >
> > >> > void queueEvent(String clientPath, int err, Set<Watcher>
> > >> > materializedWatchers, EventType eventType) {
> > >> >         KeeperState sessionState = KeeperState.SyncConnected;
> > >> >         if (KeeperException.Code.SESSIONEXPIRED.intValue() == err
> > >> >             || KeeperException.Code.CONNECTIONLOSS.intValue() ==
> err)
> > {
> > >> >             sessionState = Event.KeeperState.Disconnected;
> > >> >         }
> > >> >         WatchedEvent event = new WatchedEvent(eventType,
> sessionState,
> > >> > clientPath);
> > >> >         eventThread.queueEvent(event, materializedWatchers);
> > >> >     }
> > >> >
> > >> > which seems a bit wried to me what we queue
> > >> > a Event.KeeperState.Disconnected on
> > >> > KeeperException.Code.SESSIONEXPIRED.
> > >> >
> > >> > Back to the question, how zookeeper discovers and triggers session
> > >> expire
> > >> > event on
> > >> > session expired after connection established successfully?
> > >> >
> > >> > Best,
> > >> > tison.
> > >> >
> > >>
> > >
> >
>

Re: how session expire works in zookeeper codebase?

Posted by Michael Han <ha...@apache.org>.
>> However, session could expire after connection established. Where is the
latter case trigger?

ZooKeeper checks every incoming request and the appertained session. When a
session is expiring, all requests appertain to this session will fail
session check and the responses generated will contain session expire code
in the response header.  On client side, the response is parsed and session
expire error is extracted and thrown to client if there are pending
requests submitted.

Once the session is expired, server will close socket. Depends on how fast
session expiration is (it's not done instantly as it's a quorum operation),
client may either find out session expiration from responses of their
requests, or through reconnection.


On Tue, Sep 24, 2019 at 11:04 AM Zili Chen <wa...@gmail.com> wrote:

> Enrico,
>
> Well I think I understand how it works now and why you said it is a weird
> edge case
>
> >if the server/cluster is down the session cannot expire.
>
> If the server find a session expire, it will close the socket and the
> client will try to
> reconnect to the ensemble. While it successfully reconnects to one of the
> ensemble it will find session expire...
>
> You're right that if we lost connection to all the ensemble we cannot even
> notice
> that we are in session expired state. And I think it is the reason why
> Curator
> also check if time has already elapsed over session timeout.
>
> Best,
> tison.
>
>
> Zili Chen <wa...@gmail.com> 于2019年9月24日周二 下午8:20写道:
>
> > Enrico,
> >
> > Thanks for your reply.
> >
> > Still I cannot understand how session expire detected on client side. The
> > only codepath
> > KeeperState.Expired generated is ClientCnxn#onConnected. It seems only
> > called on
> > client successfully connected to server. However, session could expire
> > after connection
> > established. Where is the latter case trigger?
> >
> > Best,
> > tison.
> >
> >
> > Enrico Olivelli <eo...@gmail.com> 于2019年9月24日周二 下午8:06写道:
> >
> >> Zili,
> >> Sessions expire in the server. If you are not connected to the cluster
> you
> >> cannot assume that the session is expired.
> >>
> >> There is another weird edge case: if the server/cluster is down the
> >> session
> >> cannot expire.
> >>
> >> Hope that helps
> >> Enrico
> >>
> >> Il mar 24 set 2019, 13:54 Zili Chen <wa...@gmail.com> ha scritto:
> >>
> >> > Hi ZooKeepers,
> >> >
> >> > I want to trace where Watcher.Event.KeeperState.Expired generated and
> it
> >> > seems only generated
> >> > when connect to server fails due to exceed session timeout.
> >> >
> >> > Besides, I find code snippet in ClientCnxn as below
> >> >
> >> > void queueEvent(String clientPath, int err, Set<Watcher>
> >> > materializedWatchers, EventType eventType) {
> >> >         KeeperState sessionState = KeeperState.SyncConnected;
> >> >         if (KeeperException.Code.SESSIONEXPIRED.intValue() == err
> >> >             || KeeperException.Code.CONNECTIONLOSS.intValue() == err)
> {
> >> >             sessionState = Event.KeeperState.Disconnected;
> >> >         }
> >> >         WatchedEvent event = new WatchedEvent(eventType, sessionState,
> >> > clientPath);
> >> >         eventThread.queueEvent(event, materializedWatchers);
> >> >     }
> >> >
> >> > which seems a bit wried to me what we queue
> >> > a Event.KeeperState.Disconnected on
> >> > KeeperException.Code.SESSIONEXPIRED.
> >> >
> >> > Back to the question, how zookeeper discovers and triggers session
> >> expire
> >> > event on
> >> > session expired after connection established successfully?
> >> >
> >> > Best,
> >> > tison.
> >> >
> >>
> >
>

Re: how session expire works in zookeeper codebase?

Posted by Zili Chen <wa...@gmail.com>.
Enrico,

Well I think I understand how it works now and why you said it is a weird
edge case

>if the server/cluster is down the session cannot expire.

If the server find a session expire, it will close the socket and the
client will try to
reconnect to the ensemble. While it successfully reconnects to one of the
ensemble it will find session expire...

You're right that if we lost connection to all the ensemble we cannot even
notice
that we are in session expired state. And I think it is the reason why
Curator
also check if time has already elapsed over session timeout.

Best,
tison.


Zili Chen <wa...@gmail.com> 于2019年9月24日周二 下午8:20写道:

> Enrico,
>
> Thanks for your reply.
>
> Still I cannot understand how session expire detected on client side. The
> only codepath
> KeeperState.Expired generated is ClientCnxn#onConnected. It seems only
> called on
> client successfully connected to server. However, session could expire
> after connection
> established. Where is the latter case trigger?
>
> Best,
> tison.
>
>
> Enrico Olivelli <eo...@gmail.com> 于2019年9月24日周二 下午8:06写道:
>
>> Zili,
>> Sessions expire in the server. If you are not connected to the cluster you
>> cannot assume that the session is expired.
>>
>> There is another weird edge case: if the server/cluster is down the
>> session
>> cannot expire.
>>
>> Hope that helps
>> Enrico
>>
>> Il mar 24 set 2019, 13:54 Zili Chen <wa...@gmail.com> ha scritto:
>>
>> > Hi ZooKeepers,
>> >
>> > I want to trace where Watcher.Event.KeeperState.Expired generated and it
>> > seems only generated
>> > when connect to server fails due to exceed session timeout.
>> >
>> > Besides, I find code snippet in ClientCnxn as below
>> >
>> > void queueEvent(String clientPath, int err, Set<Watcher>
>> > materializedWatchers, EventType eventType) {
>> >         KeeperState sessionState = KeeperState.SyncConnected;
>> >         if (KeeperException.Code.SESSIONEXPIRED.intValue() == err
>> >             || KeeperException.Code.CONNECTIONLOSS.intValue() == err) {
>> >             sessionState = Event.KeeperState.Disconnected;
>> >         }
>> >         WatchedEvent event = new WatchedEvent(eventType, sessionState,
>> > clientPath);
>> >         eventThread.queueEvent(event, materializedWatchers);
>> >     }
>> >
>> > which seems a bit wried to me what we queue
>> > a Event.KeeperState.Disconnected on
>> > KeeperException.Code.SESSIONEXPIRED.
>> >
>> > Back to the question, how zookeeper discovers and triggers session
>> expire
>> > event on
>> > session expired after connection established successfully?
>> >
>> > Best,
>> > tison.
>> >
>>
>

Re: how session expire works in zookeeper codebase?

Posted by Zili Chen <wa...@gmail.com>.
Enrico,

Thanks for your reply.

Still I cannot understand how session expire detected on client side. The
only codepath
KeeperState.Expired generated is ClientCnxn#onConnected. It seems only
called on
client successfully connected to server. However, session could expire
after connection
established. Where is the latter case trigger?

Best,
tison.


Enrico Olivelli <eo...@gmail.com> 于2019年9月24日周二 下午8:06写道:

> Zili,
> Sessions expire in the server. If you are not connected to the cluster you
> cannot assume that the session is expired.
>
> There is another weird edge case: if the server/cluster is down the session
> cannot expire.
>
> Hope that helps
> Enrico
>
> Il mar 24 set 2019, 13:54 Zili Chen <wa...@gmail.com> ha scritto:
>
> > Hi ZooKeepers,
> >
> > I want to trace where Watcher.Event.KeeperState.Expired generated and it
> > seems only generated
> > when connect to server fails due to exceed session timeout.
> >
> > Besides, I find code snippet in ClientCnxn as below
> >
> > void queueEvent(String clientPath, int err, Set<Watcher>
> > materializedWatchers, EventType eventType) {
> >         KeeperState sessionState = KeeperState.SyncConnected;
> >         if (KeeperException.Code.SESSIONEXPIRED.intValue() == err
> >             || KeeperException.Code.CONNECTIONLOSS.intValue() == err) {
> >             sessionState = Event.KeeperState.Disconnected;
> >         }
> >         WatchedEvent event = new WatchedEvent(eventType, sessionState,
> > clientPath);
> >         eventThread.queueEvent(event, materializedWatchers);
> >     }
> >
> > which seems a bit wried to me what we queue
> > a Event.KeeperState.Disconnected on
> > KeeperException.Code.SESSIONEXPIRED.
> >
> > Back to the question, how zookeeper discovers and triggers session expire
> > event on
> > session expired after connection established successfully?
> >
> > Best,
> > tison.
> >
>

Re: how session expire works in zookeeper codebase?

Posted by Enrico Olivelli <eo...@gmail.com>.
Zili,
Sessions expire in the server. If you are not connected to the cluster you
cannot assume that the session is expired.

There is another weird edge case: if the server/cluster is down the session
cannot expire.

Hope that helps
Enrico

Il mar 24 set 2019, 13:54 Zili Chen <wa...@gmail.com> ha scritto:

> Hi ZooKeepers,
>
> I want to trace where Watcher.Event.KeeperState.Expired generated and it
> seems only generated
> when connect to server fails due to exceed session timeout.
>
> Besides, I find code snippet in ClientCnxn as below
>
> void queueEvent(String clientPath, int err, Set<Watcher>
> materializedWatchers, EventType eventType) {
>         KeeperState sessionState = KeeperState.SyncConnected;
>         if (KeeperException.Code.SESSIONEXPIRED.intValue() == err
>             || KeeperException.Code.CONNECTIONLOSS.intValue() == err) {
>             sessionState = Event.KeeperState.Disconnected;
>         }
>         WatchedEvent event = new WatchedEvent(eventType, sessionState,
> clientPath);
>         eventThread.queueEvent(event, materializedWatchers);
>     }
>
> which seems a bit wried to me what we queue
> a Event.KeeperState.Disconnected on
> KeeperException.Code.SESSIONEXPIRED.
>
> Back to the question, how zookeeper discovers and triggers session expire
> event on
> session expired after connection established successfully?
>
> Best,
> tison.
>