わかったわかった。普通の事だった。DBIx::Classに含まれてるforkのテストとか見てなんか色々頭いい事してくれてんだろうなぁ、とか勝手に思ってたけど、なんのことはない。親プロセスがデータベースハンドルをクリアしようとする前+最初に処理が終わった子プロセスの後に終了したその他の子プロセスがクリーンアップしようとしてるときにハンドルが普通にDESTROYされてただけだったよ。
Parallel::ForkManagerのstart()の後にInactiveDestroyを0にしたら直った。
my $schema = Hoge::Schema->connect(...);
my $pfm = Parallel::ForkManager->new(5);
for (@stuff) {
$pfm->start and next;
local $schema->storage->dbh->{InactiveDestroy} = 0;
...
$pfm->finish;
}
その辺りの処理も勝手にやってくれるもんだと思ったんだけど、違ったらしい。まぁ、当たり前だわな。
コメント