So I have a little trouble with my CGIapp running under fastCGI. These are the only two apps I run under FastCGI (currently) so I don't have a huge amount of experience with it.

The phenotype is this:
Our Oracle users have a connection limit set (usually 4 hours or so) - including the user "WEBB" which the CGI scripts all use. If a fastcgi/cgiapp script is unused for a long time (slightly greater than the time out) than the Oracle user logs out. The CGI app (under fastcgi) then hangs, eternally cycling one of about 3 different error messages.

The error messages are caught in a run mode like this:

#######################################################################
sub setup {
#######################################################################

    my $self = shift;

    $self->start_mode('display_search_form');
...
}

#######################################################################
sub display_error {
#######################################################################
    my $self = shift;


    my $title = $self->{title} || "Error from CGI::Application $0";

    my %dataHash = ( page_title => $title,
                     errors     => \...@_,
                     internal_url => $self->{URL},
                     external_url => $self->{extURL},
                     parameter    => { $self->query->Vars }
                   );

$dataHash{errors} = $self->{error_message} if ($self- >{error_message});

    return $self->tt_process('error.tmpl', \%dataHash);
}

I thought that I could try to catch the error in the main controller loop:

(WWW::Reports::LocusReport::LocusSummary ISA CGI::Application)0

while (my $q = CGI::Fast->new) {
    my $app = WWW::Reports::LocusReport::LocusSummary->new(QUERY => $q,
                                                           tmpl_path => [
                                                                     $ROOT_TMPL_PATH . 
"/Reports/LocusReport/LocusSummary",
                                                                     $ROOT_TMPL_PATH . 
"/Reports/LocusReport",
                                                                     $ROOT_TMPL_PATH . 
"/Reports",
                                                                     
$ROOT_TMPL_PATH
                                                                     ],
                                                       );
    $app->run;

    die "Error found, killing process" if $app->{error_message};

}

But this doesn't appear to work... perhaps the object is cleansed between output and exit of $app->run? I can just stick an exit or die in the display_error runmode method... but this results in a 500 error. The good news is that after the 500 error, a reload restarts the fastCGI process and gets a good result.

I would really like to catch this error and restart the process with a minimum of fuss. I would be OK with showing the error.tmpl; I could add a reload to it or something. I suppose some way of dropping the database handle and reconnecting would work. I am using CGI::Application::Plugin::DBH and dbh_cached with DBD::Oracle.

Thanks,
Ben
--
Ben Hitz
Senior Scientific Programmer ** Saccharomyces Genome Database ** GO Consortium
Stanford University ** [email protected]




#####  CGI::Application community mailing list  ################
##                                                            ##
##  To unsubscribe, or change your message delivery options,  ##
##  visit:  http://www.erlbaum.net/mailman/listinfo/cgiapp    ##
##                                                            ##
##  Web archive:   http://www.erlbaum.net/pipermail/cgiapp/   ##
##  Wiki:          http://cgiapp.erlbaum.net/                 ##
##                                                            ##
################################################################

Reply via email to