[MTOS-dev] Getting rid of intermittent errors with LaunchBackgroundTasks

Fumiaki Yoshimatsu fyoshimatsu at sixapart.com
Tue Feb 26 17:19:44 PST 2008


Hello MTOS-dev,

Excuse me cross posting this to the list in addition to ProNet ML.
I have been working on getting rid of intermittent DBI error when
LaunchBackgroundTasks turned on.  The issue was originally reported to
ProNet thread.

Although it is still intermittent, I could create an environment on my
Virtual PC instance which reproduces the issue fairly reliably.  After a
few experiments on the environment, I came up another experimental code
to add to see if it solve the issue.

I would like you to review and possibly try to apply the code change
below, to see if it works.  We appreciate your help, especially since
this issue only occurs intermittently and we can't be 100% sure if the
fix actually solves the issue only by seeing it gone away on my Virtual
PC instance.  Thank you in advance.

---

1. Add the following method to MT::ObjectDriverFactory
(lib/MT/ObjectDriverFactory.pm):

sub cleanup {
    @drivers = ();
    if ( my $driver = $MT::Object::DRIVER ) {
        if ( my $dbh = $driver->dbh ) {
            $dbh->disconnect;
        }
        $MT::Object::DRIVER = undef;
    }
}

2. Modify the three lines in start_background_tasks method in MT::Util
(lib/MT/Util.pm) so it has the code as follows:

sub start_background_task {
    my ($func) = @_;
    if (!launch_background_tasks()) { $func->(); }
    else {
MT::ObjectDriverFactory->cleanup(); # <-- ADD THIS LINE
        $| = 1;            # Flush open filehandles
        my $pid = fork();
        if (!$pid) {
            # child
            close STDIN; open STDIN, "</dev/null";
            close STDOUT; open STDOUT, ">/dev/null";
            close STDERR; open STDERR, ">/dev/null";

MT::Object->driver; # <-- CHANGE THIS LINE TO THIS
            MT::ObjectDriverFactory->configure();
            $func->();
            CORE::exit(0) if defined($pid) && !$pid;
        } else {
MT::Object->driver; # <-- CHANGE THIS LINE TO THIS
            MT::ObjectDriverFactory->configure();
            return 1;
        }
    }
}

Fumiaki Yoshimatsu
Movable Type Engineering,
Six Apart K.K.

P.S.

The environment I have been testing on:
* CentOS 3.1 ( "server" install )
* Apache 2.0.46 ( installed in CentOS installer )
* MySQL 4.0.26 ( installed manually )
* DBI 1.32 ( default )
** DBD::mysql 2.1021 ( default )




More information about the MTOS-dev mailing list