Thanks, Perrin, I'm sure you're right just don't see where this happens.

It's hard to extract the part of the code because my configs look wild
:)
One sh script starts/stops/restarts 3 servers with 1 config for proxy
and 1 config full of <Perl> sections - for two back-end servers.
Yes, I do call mysql from <Perl> section of conf-file.
One "thread" of this execution looks like

  require "$counter_root/startup-image.pl";
inside this file:
@Counter::INI::DBopendata = (
  base     => 'ranks',
  host     => "localhost",
  port     => 3306,
  "username" => "....",
  "password" => "....",
);

...

# this is because I use the same startup-image.pl for standalone scripts
# with $no_GATEWAY_INTERFACE = 1;

require DBI;

unless ($no_GATEWAY_INTERFACE) {
  # Apache::DBI should be before DBI but after Apache::Status
  require Apache;
  require Apache::Status;
  require Apache::DBI;

  # here's a workaround to override DBI methods with Apache::DBI ones
  {
  package DBI;
  $connect_via = "Apache::DBI::connect";
  }

  .... lots more
}

then back to conf:

  my $db = MySQL::Tools->dbopen(@Counter::INI::DBopendata,
connect_method => "connect") or die $DBI::errstr;
print "image startup thread:".$db->dbh->{mysql_thread_id}."  
".scalar($db->dbh)."\n";

  # this is just an object-oriented interface to SQL language
  my $res = $db->select(
         Tables   => Counter::Folders->table_name,
         Columns  => "ICON",
         DISTINCT => 1,
         SQL_CACHE => 1,
  ) or die "reading counter images: ".MySQL::Tools->errstr;

  ref($res) && @$res or die "reading counter images: no images found\n";

  ...stuff...

  $db->dbclose;
  undef $db;

I'm calling this with connect_method => "connect" and really, I see this
result of the upper print:
image startup thread:717   DBI::db=HASH(0x8746500)

- means I really use DBI and dbclose is just a simple $dbh->disconnect
in this case. And I really don't see thread 717 any more

Actually there should've been a 2nd line (like I saw while printed to
file, I won't change thread id's here)
image startup thread:718   DBI::db=HASH(0x8746500)

because of the 2nd pass. Dunno, may be there is some problem with this
2nd pass... I don't actually know why it happens. But it's still DBI and
disconnects as DBI::db handler should disconnect.

OK, and after that the whole stuff starts, few different PerlHandler
modules that use the same dbh like this

sub handler {
...

$Counter::db and $Counter::db->reconnect;

unless ($Counter::db) {
  $Counter::db ||= MySQL::Tools->dbopen( @Counter::INI::DBopendata )
     or croak MySQL::Tools->errstr;
}

MySQL::Tools->dbopen returns $db and $db->dbh is DBI::db object (or
Apache::DBI::db in case it overrides DBI)

dbopen() finishes with 

  $self->reconnect or return;

  $self;
}

and reconnect() actually opens the connection:

sub reconnect {
 my $self = shift;
  my $old_dbh = $self->{dbh} ? "$self->{dbh}" : "";
  my $old_thr = $self->{dbh} ? ($self->{dbh}->{mysql_thread_id} || 0) :
0;

  $self->{"dbh"} and $self->{"dbh"}->disconnect;
  $self->{"dbh"} = DBI->connect(
        sprintf("dbi:%s:database=%s;host=%s;port=%s",
        $self->{"driver"}, $self->{"name"}, $self->{"host"}, $self->{"port"}),
        $self->{"username"}, $self->{"password"}, {
        AutoCommit => 1, # 0 makes error in mysql
        PrintError => 0,
        RaiseError => 0,
        ($self->{"connect_method"} ? (
            dbi_connect_method => $self->{"connect_method"}
        ) : ()),
  }) or return;

  my $new_thr = $self->{dbh} ? ($self->{dbh}->{mysql_thread_id} || 0) :
0;

  !$old_dbh || $old_dbh eq "$self->{dbh}" or
         warn "reconnect: reconnected successfully\n";

  if (Apache->request && $old_thr != $new_thr) {
warn "reinit ($$) thread new: $new_thr   old: $old_thr  
$self->{dbh}\n";
  }

  ... reading tables with column properties ...

  $self;
}

I've just made more clear test print and the last 'warn' prints much
like I sent before but now it shows how wrong mysql thread (719 - same
for 5 server childs) is being replaced with the new threads:
old: 0 means first connection for this child, no previous thread

[Thu May 27 16:00:23 2004] [error] reinit (13339) thread new: 719   old:
0   Apache::DBI::db=HASH(0x8389fa4)
[Thu May 27 16:00:23 2004] [error] reinit (13341) thread new: 719   old:
0   Apache::DBI::db=HASH(0x8389fa4)
[Thu May 27 16:00:23 2004] [error] reinit (13340) thread new: 719   old:
0   Apache::DBI::db=HASH(0x8389fa4)
[Thu May 27 16:00:23 2004] [error] reinit (13342) thread new: 719   old:
0   Apache::DBI::db=HASH(0x8389fa4)
[Thu May 27 16:00:23 2004] [error] reinit (13343) thread new: 719   old:
0   Apache::DBI::db=HASH(0x8389fa4)
[Thu May 27 16:00:23 2004] [error] SQL execute error: LISTFIELDS
counter_sitegroups
Lost connection to MySQL server during query
 at /host/counter/lib/Counter/Common.pm line 502
[Thu May 27 16:00:23 2004] [error] TablesProperties: Lost connection to
MySQL server during query
 at /host/counter/lib/Counter/Common.pm line 502

[Thu May 27 16:00:23 2004] [error] reinit (13344) thread new: 719   old:
0   Apache::DBI::db=HASH(0x8389fa4)
[Thu May 27 16:00:24 2004] [error] reinit (13346) thread new: 723   old:
0   Apache::DBI::db=HASH(0x8389fa4)
[Thu May 27 16:00:24 2004] [error] reinit (13348) thread new: 725   old:
0   Apache::DBI::db=HASH(0x8389fa4)
[Thu May 27 16:00:24 2004] [error] reinit (13351) thread new: 728   old:
0   Apache::DBI::db=HASH(0x8389fa4)
[Thu May 27 16:00:24 2004] [error] ListTables: Lost connection to MySQL
server during query
 at /host/counter/lib/Counter/ShowCounter.pm line 204

[Thu May 27 16:00:24 2004] [error] reinit (13353) thread new: 730   old:
0   Apache::DBI::db=HASH(0x8389fa4)
[Thu May 27 16:00:24 2004] [error] reinit (13345) thread new: 722   old:
0   Apache::DBI::db=HASH(0x8389fa4)
[Thu May 27 16:00:24 2004] [error] reinit (13347) thread new: 724   old:
0   Apache::DBI::db=HASH(0x8389fa4)
[Thu May 27 16:00:24 2004] [error] reinit (13349) thread new: 726   old:
0   Apache::DBI::db=HASH(0x8389fa4)
[Thu May 27 16:00:24 2004] [error] reinit (13350) thread new: 727   old:
0   Apache::DBI::db=HASH(0x8389fa4)
[Thu May 27 16:00:24 2004] [error] reinit (13341) thread new: 731   old:
719   Apache::DBI::db=HASH(0x8389fa4)
[Thu May 27 16:00:24 2004] [error] reinit (13352) thread new: 729   old:
0   Apache::DBI::db=HASH(0x8389fa4)
[Thu May 27 16:00:24 2004] [error] reinit (13339) thread new: 732   old:
719   Apache::DBI::db=HASH(0x8389fa4)
[Thu May 27 16:00:24 2004] [error] ListTables: Lost connection to MySQL
server during query
 at /host/counter/lib/Counter/ShowCounter.pm line 204

[Thu May 27 16:00:24 2004] [error] reinit (13342) thread new: 733   old:
0   Apache::DBI::db=HASH(0x8389fa4)
[Thu May 27 16:00:24 2004] [error] reinit (13340) thread new: 734   old:
0   Apache::DBI::db=HASH(0x8389fa4)
[Thu May 27 16:00:24 2004] [error] reinit (13388) thread new: 735   old:
0   Apache::DBI::db=HASH(0x8389fa4)


Sorry, I tried to simplify this but as usual with OO - things are hidden
inside the other things ad infinitum.

  $self->{"dbh"} and $self->{"dbh"}->disconnect;
in 'reconnect' sub makes nothing in case of Apache::DBI and is supposed
to do reconnection if called in non-mod_perl environment. It's actually
added for some persistency, to mean 'reconnect' even not under mod_perl

DBI->connect(...) each time the PerlHandler runs is supposed to ping
(Apache::DBI::connect) and keep the previous handler if it's alive
otherwise - create a new connection

dbclose looks like
sub dbclose {
  my ($self) = @_;

  my $rc = $self->{"dbh"}->disconnect;
  undef $_[0];

  $rc;
}

and destroys MySQL::Tools object. It calls the appropriate 'disconnect'
method for dbh.

I call it only in configs (no Apache::DBI). In PerlHandler modules I
have only

END { eval{ $Counter::db->dbclose } if $Counter::db }

Guys, I'm sorry - lots of stuff here and not an easy reading.

To remind the problem - few first Apache childs manage to connect the
same mysql thread at startup. Then they all fail, reconnect and live
happily ever after :)

Thanks for any input here!

Mike Blazer


Perrin Harkins wrote:
> 
> On Thu, 2004-05-27 at 15:20, Mike Blazer wrote:
> > See, in the very beginning - 3 child processes started and connected to
> > the same mysql thread_id
> >
> > None of my processes ever disconnects, they all use Apache:DBI and
> > everything is checked to be correct.
> > Seems like it's mysql error in dispatching threads?
> 
> Usually it's something opening a database connection before apache
> forks.  How about showing us the parts of your startup code that deal
> with database connections?
> 
> - Perrin

-- 
==================================
Mike Blazer
[EMAIL PROTECTED]
==================================

-- 
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

Reply via email to