北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

障害はいつも定時前(6)

CGI::Carpのソースを読んだ。グローバル変数に設定を持っていた。そもそもuse strictしてなかった



mod_perl下でとある一つのスクリプトが、そんなモジュールのwarningsToBrowserを使ったせいで、サーバ上のスクリプトが一気に全部デバグモードになった。サイト全部にデバグコードが出現。恐ろしい・・・。



このモジュールは$CGI::Carp::WARNと$CGI::Carp::EMIT_WARNINGSが強調してエラーを吐く仕組みになっていて、前者はuseのタイミングで、後者はwarningsToBrowser(1)のタイミングでONになる。前者がONになるとwarningのキャッシュを始め、後者がONになった時点でwarningをコメントに吐き始める。



useした時点では$CGI::Carp::EMIT_WARNINGSがOFFのはずなのだが、最初に書いたようにこいつはグローバルなので、一度ONになると他のプロセス上でも常にONの状態を保ってしまう。



今回自分が体験した例では、実はwarningsToBrowser(1)は呼んで居なかったのだが、dieのタイミングでも$CGI::Carp::EMIT_WARNINGSを1にするコードが入っているので、一度でもdieをしたことがあるmod_perlのプロセスだけがデバグ状態になっているというわかりにくい状態になっていた。



  1. とあるスクリプトでuse CGI::Carp qw(warningsToBrowser)を呼び出し(warningsToBrowser(1)は呼ばない)
  2. これにより、すべてのスクリプトでwarningのキャッシュが始まる
  3. 別のスクリプトで、use CGI::Carp qw(fatalsToBrowser)でエラーを出力してしまい、warning吐き出しモードに移行。溜まっていたキャッシュをすべて放出。
  4. その後は、すべてのスクリプトがwarning吐き出しモードで動く