develooper Front page | perl.ldap | Postings from February 2012

Re: How determine if persistent Net::LDAP object is alive?

Thread Previous | Thread Next
From:
Nick Urbanik
Date:
February 22, 2012 18:51
Subject:
Re: How determine if persistent Net::LDAP object is alive?
Message ID:
20120223025132.GC10202@nick.optusnet.com.au
Dear Larry,

On 22/02/12 18:16 -0800, Larry Lile wrote:
>On Wed, Feb 22, 2012 at 6:14 PM, Larry Lile <larry.lile@dreamworks.com> wrote:
>    I've always just trapped for the disconnect at the operation,
>    this is also a convenient place to check for referrals.
>
>            # XXX Check for I/O Error on update, reconnect and
>            # XXX retry if possible.  This could be much more sophisticated.
>            $ldap = ldap_open($ldap) and $result = $entry->update($ldap)
>                if $result->code == LDAP_OPERATIONS_ERROR and
>                $result->error =~ m!I/O Error!i;
>
>    ldap_open is the same function I use to open an LDAP server
>    normally.  When passed an existing LDAP object it will attempt
>    to shut it down as cleanly as possible.

But it seems that you are aiming for *non*-persistent connections; it
seems to me that you are closing the connection if it exists.

The problem there is that if there is a very high load, and there are
many connections and disconnections, it is possible to consume too
many TCP connections.  (Our LDAP servers can be *very* busy).

What we are aiming for is to maintain a *persistent* LDAP connection,
but to determine when it has failed before depending on it.

>    I haven't tested this code
>    in a while, $result->error =~ m!I/O Error!i may not be correct
>    since the latest updates to Net::LDAP.
>
>
>    sub ldap_open
>    {
>        my $ldap = shift;
>
>    ...
>
>        if ($ldap)
>        {
>            warn "\nConnection to ", $ldap->{net_ldap_host},
>                " broken, attempting to reconnect.\n"
>                if $opt_v;
>
>            # XXX Try to close the socket as best we can.
>            close $ldap->{net_ldap_socket};
>
>            foreach my $server (split(/\s+/, $ldap_opt{'host'}))
>            {
>                ($server, my $port) = split(/:/, $server, 2);
>                $port = $ldap_opt{'port'} if ! $port;
>                last if lc $server eq lc $ldap->{net_ldap_host};
>                push @servers, shift @servers;
>            }
>        }
>
>    The remainder of the code builds a connection to the LDAP server as usual
>    returning it's object to the c
>
>
>Pardon the interruption there.  =)
>
>The remainder of the code builds a connection to the LDAP server as usual
>returning it's object to the caller.
-- 
Nick Urbanik http://nicku.org 808-71011 nick.urbanik@optusnet.com.au
GPG: 7FFA CDC7 5A77 0558 DC7A 790A 16DF EC5B BB9D 2C24  ID: BB9D2C24
I disclaim, therefore I am.

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About