[Crypt::SSLeay] Alarm Clock Errors

[Crypt::SSLeay] Alarm Clock Errors

am 06.05.2005 04:32:04 von jamesbyrne

Hello,
Every now & again one of our perl jobs crashes with a SIGALRM, which is
reported as
"Alarm Clock" by the calling shell script. This only happens when
downloading a
https URL using the LWP library. Happens very rarely, a dozen or so
occasions in a
year or so of running 100 jobs a day, but or more recently now thatour
system is
under much higher stress.

Have a theory that the problem is in in Net::SSL::connect. (and maybe
similar problem
in Net::SSL::read)

The theory is that in the connect subroutine in SSL.pm it is using
'local $SIG{ALRM}'
which sets the signal handler for the scope of the eval. At the end of
the block is
the alarm(0) to disable the alarm. Now if I understand all the signal
stuff right
(unlikely) then if something dies within that scope then it would jump
to the end of
the eval, and the signal handler would no longer be used, but the alarm
is still
ticking? So would it be better to have something more of the structure?

local $SIG{ALRM} = sub { $self->die_with_error("SSL read timeout") };
eval {
alaram(timeout)
....
};
alarm(0);
...

That way we are sure the alarm is being switched off, even if we fail?

Don't know if I'm talking crap or not, I'm not much of a network
programmer and have
no concept of the big picture. Simply narrowed down to here by grepping
for calls to
'alarm' in the lib/perl tree on our server.
Let me know if I can do anything to help.

Have fun,
James

Distribution
Crypt-SSLeay-0.49 (Containing Net::SSL 2.77)

uname -a
Linux Batn04 2.4.21-4.ELsmp #1 SMP Fri Oct 3 17:52:56 EDT 2003 i686 i686
i386
GNU/Linux

perl -V
Summary of my perl5 (revision 5.0 version 8 subversion 3) configuration:
Platform:
osname=linux, osvers=2.4.21-9.elsmp,
archname=i386-linux-thread-multi
uname='linux bugs.devel.redhat.com 2.4.21-9.elsmp #1 smp thu jan 8
17:08:56 est
2004 i686 i686 i386 gnulinux '
config_args='-des -Doptimize=-O2 -g -pipe -march=i386 -mcpu=i686
-Dversion=5.8.3
-Dmyhostname=localhost -Dperladmin=root@localhost -Dcc=gcc -Dcf_by=Red
Hat, Inc.
-Dinstallprefix=/usr -Dprefix=/usr -Darchname=i386-linux
-Dvendorprefix=/usr
-Dsiteprefix=/usr -Duseshrplib -Dusethreads -Duseithreads
-Duselargefiles -Dd_dosuid
-Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog
-Dman3ext=3pm
-Duseperlio -Dinstallusrbinperl -Ubincompat5005 -Uversiononly
-Dpager=/usr/bin/less
-isr -Dinc_version_list=5.8.2 5.8.1 5.8.0'
hint=recommended, useposix=true, d_sigaction=define
usethreads=define use5005threads=undef useithreads=define
usemultiplicity=define
useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
use64bitint=undef use64bitall=undef uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS
-DDEBUGGING
-fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE
-D_FILE_OFFSET_BITS=64
-I/usr/include/gdbm',
optimize='-O2 -g -pipe -march=i386 -mcpu=i686',
cppflags='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBUGGING
-fno-strict-aliasing -I/usr/local/include -I/usr/include/gdbm'
ccversion='', gccversion='3.3.2 20031218 (Red Hat Linux 3.3.2-5)',
gccosandvers=''
intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t',
lseeksize=8
alignbytes=4, prototype=define
Linker and Libraries:
ld='gcc', ldflags =' -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib
libs=-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lpthread -lc
perllibs=-lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
libc=/lib/libc-2.3.2.so, so=so, useshrplib=true, libperl=libperl.so
gnulibc_version='2.3.2'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-rdynamic
-Wl,-rpath,/usr/lib/perl5/5.8.3/i386-linux-thread-multi/CORE '
cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib'


Characteristics of this binary (from libperl):
Compile-time options: DEBUGGING MULTIPLICITY USE_ITHREADS
USE_LARGE_FILES
PERL_IMPLICIT_CONTEXT
Built under linux
Compiled at Feb 25 2004 13:30:53
@INC:
/usr/lib/perl5/5.8.3/i386-linux-thread-multi
/usr/lib/perl5/5.8.3
/usr/lib/perl5/site_perl/5.8.3/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.2/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.1/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.3
/usr/lib/perl5/site_perl/5.8.2
/usr/lib/perl5/site_perl/5.8.1
/usr/lib/perl5/site_perl/5.8.0
/usr/lib/perl5/site_perl
/usr/lib/perl5/vendor_perl/5.8.3/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.2/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.1/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.3
/usr/lib/perl5/vendor_perl/5.8.2
/usr/lib/perl5/vendor_perl/5.8.1
/usr/lib/perl5/vendor_perl/5.8.0
/usr/lib/perl5/vendor_perl

Re: [Crypt::SSLeay] Alarm Clock Errors

am 07.05.2005 02:42:07 von jarich

James Byrne wrote:

> So would it be better to have something more of the structure?
>
> local $SIG{ALRM} = sub { $self->die_with_error("SSL read timeout") };
> eval {
> alarm(timeout)
> ....
> };
> alarm(0);
> ...
>
> That way we are sure the alarm is being switched off, even if we fail?

This is, indeed, a common (and recommended) structure. In some cases you put
the alarm(0) both at the bottom of the eval block and after the eval block. It
causes no harm to call alarm(0) twice.

I can't tell you if this will fix your problem however, as I haven't taken the
time to look further into the distributions for this issue.

All the best,

Jacinta

--
("`-''-/").___..--''"`-._ | Jacinta Richardson |
`6_ 6 ) `-. ( ).`-.__.`) | Perl Training Australia |
(_Y_.)' ._ ) `._ `. ``-..-' | +61 3 9354 6001 |
_..`--'_..-_/ /--'_.' ,' | contact@perltraining.com.au |
(il),-'' (li),' ((!.-' | www.perltraining.com.au |