[IRCServices] Services 4.5pre6 released

David Narayan jester at phrixus.net
Mon Feb 12 07:14:05 PST 2001


>>Last time I tried using StatServ (with IRCServices 4.4.8 and
>>DreamForge-based ircd), after a few netsplits and netbursts, Services
>>would enter an infinite loop and stop responding.  Has this been fixed
>>for 4.5.0, or should I go back and try to do it again to find a fix for
>>it?
> 
>      This may be fixed for pre6--I was never able to duplicate it
>      myself, but
> I've fixed and cleaned up a lot of StatServ code for this release.
> 

Using ircservices4.4.9 I was able to duplicate it.  Granted much of
the code may have changed between this version and 4.4.5 but using
gdb indicates where services locks up.

To lock it, I had a 3 server network (tested with unreal and df467)
and I /squit'ed the two leafs from the hub. After the second leaf
reconnected, services would not respond.  Attaching gdb to the process
indicates the following.

--- gdb output ---
Attaching to program: /usr/local/bin/services, Pid 10163
Reading symbols from /lib/libnsl.so.1...done.
Loaded symbols for /lib/libnsl.so.1
Reading symbols from /lib/libresolv.so.2...done.
Loaded symbols for /lib/libresolv.so.2
Reading symbols from /lib/libc.so.6...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
Reading symbols from /lib/libnss_files.so.2...done.
Loaded symbols for /lib/libnss_files.so.2
Reading symbols from /lib/libnss_nisplus.so.2...done.
Loaded symbols for /lib/libnss_nisplus.so.2
Reading symbols from /lib/libnss_nis.so.2...done.
Loaded symbols for /lib/libnss_nis.so.2
stats_do_server (servername=0xbffff7b7 "entropy2.phrixus.net", 
serverhub=0xbffff9f0 "entropy.phrixus.net")
    at statistics.c:598
598                         tmpserver = tmpserver->sibling;
(gdb) list
593                 if (!server->hub->child) {
594                     server->hub->child = server;
595                 } else {
596                     tmpserver = server->hub->child;
597                     while (tmpserver->sibling)
598                         tmpserver = tmpserver->sibling;
599                     tmpserver->sibling = server;
600                 }
601             }
602         }
(gdb) bt
#0  stats_do_server (servername=0xbffff7b7 "entropy2.phrixus.net", 
serverhub=0xbffff9f0 "entropy.phrixus.net")
    at statistics.c:598
#1  0x806661f in do_server (source=0xbffff9f0 "entropy.phrixus.net", ac=3, 
av=0x812db58) at servers.c:153
#2  0x8066070 in process () at process.c:179
#3  0x80598e1 in main (ac=1, av=0xbffffae4, envp=0xbffffaec) at main.c:274
#4  0x40061f31 in __libc_start_main (main=0x80595e4 <main>, argc=1, 
ubp_av=0xbffffae4, init=0x8049028 <_init>, 
    fini=0x806b5ac <_fini>, rtld_fini=0x4000e274 <_dl_fini>, 
stack_end=0xbffffadc)
    at ../sysdeps/generic/libc-start.c:129
(gdb) 

Presumably this means that it is stuck in the while loop, since
tmpserver->sibling is always "true". 

-David

-- 
David Narayan
jester at phrixus.net