[Date Prev][Date Next] [Chronological] [Thread] [Top]

RE: ITS#1679 gentle SIGHUP handling

Yes, what you suggest can be done, but I think it may be more effort than
it's worth. Much simpler just to go with the first idea. Set up a timer on
the old slapd that makes it quit even if there are active sessions, the
client can always reconnect and it'll get the new slapd.

  -- Howard Chu
  Chief Architect, Symas Corp.       Director, Highland Sun
  http://www.symas.com               http://highlandsun.com/hyc
  Symas: Premier OpenSource Development and Support

> -----Original Message-----
> From: owner-openldap-devel@OpenLDAP.org
> [mailto:owner-openldap-devel@OpenLDAP.org]On Behalf Of Hallvard B
> Furuseth
> Sent: Friday, April 05, 2002 2:43 AM
> To: Pierangelo Masarati
> Cc: openldap-devel@OpenLDAP.org
> Subject: Re: ITS#1679 gentle SIGHUP handling
> Pierangelo Masarati writes:
> > but as Howard noted, this feature would be strikingly interesting
> > if the *configuration* is changed while using the *same* database.
> There is one another way to restart slapd almost seamlessly, at
> least on many Unix variants.  Maybe I should implement this too?
> 1. Start a new slapd daemon which sends a control message to the
>    old slapd but does not open any listener connections.
> 2. Old slapd quits reading new requests from clients that already
>    have outstanding requests.  Instead it reads and processes one
>    request at a time per client.  Or is that how it works already?
> 3. When there are no more outstanding requests except the ones being
>    processed, old slapd stops reading new requests.  It send()s its
>    listener file descriptors to new slapd, along with the associated
>    LDAP URLs.
> 4. If both slapds are in readonly mode or if they use different
>    databases, new slapd can begin to accept new clients.
> 5. When a client's final outstanding request is processed, old slapd
>    send()s the client's file descriptor to new slapd, along with the
>    Connection struct describing the client.
> 6. When all clients are done, old slapd terminates.
> 7. New slapd starts up properly, if it didn't in step 4.
> In theory old slapd can close the databases and new slapd start up
> as soon as all requests' database accesses are finished, they do not
> need to wait until the results have been sent.  I'm not sure if that
> can be fitted into the current design of the backends, though.
> Ldap will slow down a bit in step 2, and hang in steps 3-6 for as
> long as it can take old slapd to process a request and send the
> results.  I don't know how much time I'm talking about here?
> Is it so much that the 'gentle SIGHUP' approach is better?
> There are a few problems:
> - I don't know what to do about paged results.  The simplest way I
>   can think of is for old slapd to wait to start step 1 until there
>   are no paged requests, and if that doesn't happen in X seconds,
>   abort the connections to clients with paged requests.
> - A socket can get full, can't it?  So if a client doesn't read the
>   results at once, slapd can get stuck trying to send the results.
>   The simplest solution is to abort the connection after Y seconds,
>   but if we can close the databases first, that's not necessary.
> - I think a client can hang due to congestion after step 2 if it
>   pours a lot of requests into slapd quickly without reading the
>   results at once.  Then slapd can be stuck trying to send the old
>   results into a full socket.  Again, the simplest solution is to
>   abort the connection if the client doesn't wise up after Y
>   seconds.
> - If there is a deadlock in slapd somewhere so a client is
>   deadlocked but the rest of slapd is not, old slapd won't
>   terminate.  Again, abort the client connection after Y seconds.
> Have I missed anything?
> Do you know what of this is likely to be harder than it looks?
> Is there any reason why it would be a good idea for old slapd to
> send its outstanding _requests_ to new slapd as well?  I'd rather
> avoid that before it gets even more complicated.
> --
> Hallvard