----- Original Message ----- From: "Perrin Harkins" <[EMAIL PROTECTED]> To: "Chris Ochs" <[EMAIL PROTECTED]> Cc: "Modperl List" <[EMAIL PROTECTED]> Sent: Monday, March 08, 2004 6:27 AM Subject: Re: Apache::Session and DB_File problems
> On Sun, 2004-03-07 at 21:13, Chris Ochs wrote: > > Been doing some more testing on this. Previously I was untying the > > sessions when the handler was finished. But it seems that all it takes is > > just one child to exit uncleanly where I cant' catch the error and untie the > > sesssions, and that's all it takes to cause corruption. If I untie the > > session variables at the very start of the handler everything works fine. > > What do you mean by untying the sessions? Can you show us some code? > All you should need to do is make sure the session object goes out of > scope, which will happen even if your code dies. Here is the start and end of the handler. Also at the bottom is the code that I use to create the session. sub handler { $r = shift; untie %session; untie %basket; untie %cs; ... Do stuff here... $myapp::template->process($req_file, $vars, $r) || return fail($r, OK, $template->error); return success(OK); } # end handler sub success { my ($status) = @_; $session{'timestamp'} = time if (defined %session); $basket{'timestamp'} = time if (defined %basket); $cs{'timestamp'} = time if (defined %cs); untie %session; untie %basket; untie %cs; $myapp::logger->debug("EndRequest"); return $status; } sub fail { my ($r, $status, $message) = @_; $session{'timestamp'} = time if (defined %session); $basket{'timestamp'} = time if (defined %basket); $cs{'timestamp'} = time if (defined %cs); untie %session; untie %basket; untie %cs; $myapp::logger->info("Error: $message"); $params{'error_message'} = $message; my $vars = { req => $r, uri => $r->uri, env => \%ENV, params => \%params, }; $Cart110::template->process("template_error.html", $vars, $r) || print "<h4><font color=red>Error: </font>$message</h4>"; $r->log_reason($message, $r->filename); $myapp::logger->debug("EndRequest (ERROR=$message)"); return $status; } Session code: sub basket { my $dbfile = "$dbdir/$catalog" . "_basket.db"; if ($params{'basket'}) { $session{'basket'} = $params{'basket'}; } eval { tie %basket, 'Apache::Session::DB_File', $session{'basket'}, { FileName => "$dbfile", LockDirectory => "$dbdir/lock", }; }; if ($@) { tie %basket, 'Apache::Session::DB_File', undef, { FileName => "$dbfile", LockDirectory => "$dbdir/lock", }; } $session{'basket'} = $basket{_session_id}; $Cart110::logger->debug("BasketID = $basket{_session_id}"); } -- Report problems: http://perl.apache.org/bugs/ Mail list info: http://perl.apache.org/maillist/modperl.html List etiquette: http://perl.apache.org/maillist/email-etiquette.html