FastCGI環境での文字化けの可能性

175 views
Skip to first unread message

Hirotaka Ogawa

unread,
Apr 23, 2008, 12:48:56 AM4/23/08
to mto...@googlegroups.com
小川です。

私自身は確認していないのですが、FastCGI環境での文字化けの可能性があるのではないかと思っています。twitterでjunnamaさんから反応があったので観測可能な現象のようです。

ロジックとしては、

- FastCGI環境などでDB connectしていてその接続がタイムアウトしてdisconnect状態になる場合を想定する。
- このとき、FCGIプロセスが何らかのDB
queryをしようとしたとき、D::OD::Driver::DBI->rw_handle()でDB handleを取得しようとする。
- rw_handle()は、すでに取得してあるhandleがライブならそれを返し、そうでなければreconnectしてDB handleを生成して返す。
- reconnectの場合には、前もってSET NAMESなどが実行されることなく、queryがおこなわれる。
- したがって文字化けする。

ということです。つまり、「reconnect時にMT::ObjectDriver::Driver::DBI->configure()が呼ばれなければならないが、それが呼ばれていない」という問題だと言えます。

安直には下のようなパッチを当てれば済みます。

Index: lib/MT/ObjectDriver/Driver/DBI.pm
===================================================================
--- lib/MT/ObjectDriver/Driver/DBI.pm (revision 2048)
+++ lib/MT/ObjectDriver/Driver/DBI.pm (working copy)
@@ -20,6 +20,26 @@
$driver;
}

+# Copied from Data::ObjectDriver::Driver::DBI
+sub rw_handle {
+ my $driver = shift;
+ my $db = shift || 'main';
+ $driver->dbh(undef) if $driver->dbh and !$driver->dbh->ping;
+ my $dbh = $driver->dbh;
+ unless ($dbh) {
+ if (my $getter = $driver->get_dbh) {
+ $dbh = $getter->();
+ } else {
+ $dbh = $driver->init_db($db) or die $driver->last_error;
+ $driver->dbh($dbh);
+ # reconfigure is required when reconnected
+ $driver->configure;
+ }
+ }
+ $dbh;
+}
+*r_handle = \&rw_handle;
+

このパッチには、MT::ObjectDriverFactory->configure()をあちこちで呼んでいるせいで、set
namesが二度以上実行されるという別の問題があります。rw_handle()で呼んでるのだから、他のところで呼ぶ必要はなくなるはずですが、そう単純な問題なのかはよく分かりません。

この件に関してトラブっている方がいれば、コメントくださいまし。

--
Hirotaka Ogawa
http://twitter.com/ogawa
http://as-is.net/blog/

野田 純生

unread,
Apr 24, 2008, 12:32:56 AM4/24/08
to mto...@googlegroups.com
小川さん

野田です。
とりあえず、文字化けする環境でパッチを当ててみました。

複数の環境で様子を見て、またフィードバックします。

On 2008/04/23, at 13:48, Hirotaka Ogawa wrote:

>
> 小川です。
>
> 私自身は確認していないのですが、FastCGI環境での文字化け
> の可能性があるのではないかと思っています。twitterで
> junnamaさんから反応があったので観測可能な現象のようです。
>
> ロジックとしては、
>
> - FastCGI環境などでDB connectしていてその接続がタイムア

Hirotaka Ogawa

unread,
Apr 24, 2008, 11:20:59 AM4/24/08
to mto...@googlegroups.com
小川です。

2008/4/24 野田 純生 <jun...@alfasado.jp>:


>
> 小川さん
>
> 野田です。
> とりあえず、文字化けする環境でパッチを当ててみました。
>
> 複数の環境で様子を見て、またフィードバックします。

よろしくお願いします。

もしそれでうまく行くようなら、そのパッチに加えて、MT::ObjectDriverFactory->configure()の中身をコメントアウトしてみても問題ないかどうかを確認していただけると非常に助かります
_o_

sub configure {
# my $pkg = shift;
# $_->configure(@_) for @drivers;
}

> On 2008/04/23, at 13:48, Hirotaka Ogawa wrote:
>
>
> >
> > 小川です。
> >
> >

> 私自身は確認していないのですが、FastCGI環境での文字化けの可能性があるのではないかと思っています。twitterでjunnamaさんから反応があったので観測可能な現象のようです。
> >
> > ロジックとしては、
> >
> > - FastCGI環境などでDB connectしていてその接続がタイムアウトしてdisconnect状態になる場合を想定する。

> > - このとき、FCGIプロセスが何らかのDB


> > queryをしようとしたとき、D::OD::Driver::DBI->rw_handle()でDB handleを取得しようとする。
> > - rw_handle()は、すでに取得してあるhandleがライブならそれを返し、そうでなければreconnectしてDB
> handleを生成して返す。

> > - reconnectの場合には、前もってSET NAMESなどが実行されることなく、queryがおこなわれる。
> > - したがって文字化けする。
> >
> >
> ということです。つまり、「reconnect時にMT::ObjectDriver::Driver::DBI->configure()が呼ばれなければならないが、それが呼ばれていない」という問題だと言えます。

> > このパッチには、MT::ObjectDriverFactory->configure()をあちこちで呼んでいるせいで、set
> >

> namesが二度以上実行されるという別の問題があります。rw_handle()で呼んでるのだから、他のところで呼ぶ必要はなくなるはずですが、そう単純な問題なのかはよく分かりません。

野田 純生

unread,
Apr 24, 2008, 10:55:00 PM4/24/08
to mto...@googlegroups.com
小川さん

野田です。
とりあえず一つの環境では文字化けしないことを確認しました。他の問
題も起きていない様子です。

他の環境でも引き続き試してみます。週末のうちには報告できると思い
ます。

On 2008/04/25, at 0:20, Hirotaka Ogawa wrote:

>
> 小川です。
>
> 2008/4/24 野田 純生 <jun...@alfasado.jp>:
>>
>> 小川さん
>>
>> 野田です。
>> とりあえず、文字化けする環境でパッチを当ててみました。
>>
>> 複数の環境で様子を見て、またフィードバックします。
>
> よろしくお願いします。
>
> もしそれでうまく行くようなら、そのパッチに加えて、
> MT::ObjectDriverFactory->configure()の中身をコメントアウトして
> みても問題ないかどうかを確認していただけると非常に助かります
> _o_
>
> sub configure {
> # my $pkg = shift;
> # $_->configure(@_) for @drivers;
> }
>
>> On 2008/04/23, at 13:48, Hirotaka Ogawa wrote:
>>
>>
>>>
>>> 小川です。
>>>
>>>

>> 私自身は確認していないのですが、FastCGI環境での文字化け
>> の可能性があるのではないかと思っています。twitterで
>> junnamaさんから反応があったので観測可能な現象のようです。
>>>
>>> ロジックとしては、
>>>
>>> - FastCGI環境などでDB connectしていてその接続がタイム
>>> アウトしてdisconnect状態になる場合を想定する。

>>> - このとき、FCGIプロセスが何らかのDB


>>> queryをしようとしたとき、D::OD::Driver::DBI->rw_handle
>>> ()でDB handleを取得しようとする。
>>> - rw_handle()は、すでに取得してあるhandleがライブなら

>>> それを返し、そうでなければreconnectしてDB
>> handleを生成して返す。
>>> - reconnectの場合には、前もってSET NAMESなどが実行され
>>> ることなく、queryがおこなわれる。
>>> - したがって文字化けする。
>>>
>>>

>> ということです。つまり、「reconnect時に
>> MT::ObjectDriver::Driver::DBI->configure()が呼ばれなければな

>>> このパッチには、MT::ObjectDriverFactory->configure()を
>>> あちこちで呼んでいるせいで、set
>>>
>> namesが二度以上実行されるという別の問題があります。rw_handle
>> ()で呼んでるのだから、他のところで呼ぶ必要はなくなるはずです

野田 純生

unread,
May 12, 2008, 10:45:36 PM5/12/08
to mto...@googlegroups.com
小川さん

野田です。
レスが遅くなってすいません。

パッチを当てたあと、さらに MT/ObjectDriverFactory.pm

の↓の中身をコメントアウト して確認しました。 (4.1及
び4.15) 複数環境 (MacOSX 10.3+MySQL5.0.41 及び
Ubuntu +MySQL - 5.0.22 )

sub configure {
my $pkg = shift;
$_->configure(@_) for @drivers;
}

1週間程運用しましたが、文字化けは起こっていません。パッチを当て
る前は、3~24時間程度そのままにしておくとかなりの確
率で文字化けしていました。

よろしくお願いします。

On 2008/04/25, at 0:20, Hirotaka Ogawa wrote:

>
> 小川です。
>
> 2008/4/24 野田 純生 <jun...@alfasado.jp>:
>>
>> 小川さん
>>
>> 野田です。
>> とりあえず、文字化けする環境でパッチを当ててみました。
>>
>> 複数の環境で様子を見て、またフィードバックします。
>
> よろしくお願いします。
>
> もしそれでうまく行くようなら、そのパッチに加えて、
> MT::ObjectDriverFactory->configure()の中身をコメントアウトして
> みても問題ないかどうかを確認していただけると非常に助かります
> _o_
>
> sub configure {
> # my $pkg = shift;
> # $_->configure(@_) for @drivers;
> }
>
>> On 2008/04/23, at 13:48, Hirotaka Ogawa wrote:
>>
>>
>>>
>>> 小川です。
>>>
>>>

>> 私自身は確認していないのですが、FastCGI環境での文字化け
>> の可能性があるのではないかと思っています。twitterで
>> junnamaさんから反応があったので観測可能な現象のようです。
>>>
>>> ロジックとしては、
>>>
>>> - FastCGI環境などでDB connectしていてその接続がタイム
>>> アウトしてdisconnect状態になる場合を想定する。

>>> - このとき、FCGIプロセスが何らかのDB


>>> queryをしようとしたとき、D::OD::Driver::DBI->rw_handle
>>> ()でDB handleを取得しようとする。
>>> - rw_handle()は、すでに取得してあるhandleがライブなら

>>> それを返し、そうでなければreconnectしてDB
>> handleを生成して返す。
>>> - reconnectの場合には、前もってSET NAMESなどが実行され
>>> ることなく、queryがおこなわれる。
>>> - したがって文字化けする。
>>>
>>>

>> ということです。つまり、「reconnect時に
>> MT::ObjectDriver::Driver::DBI->configure()が呼ばれなければな

>>> このパッチには、MT::ObjectDriverFactory->configure()を
>>> あちこちで呼んでいるせいで、set
>>>
>> namesが二度以上実行されるという別の問題があります。rw_handle
>> ()で呼んでるのだから、他のところで呼ぶ必要はなくなるはずです
>> が、そう単純な問題なのかはよく分かりません。
>>>
>>> この件に関してトラブっている方がいれば、コメントくださいまし。

(signature)________________________________

Alfasado,Inc.(アルファサード)
野田純生 (Web Solution Engineer)

WebSite :<http://alfasado.net/>
e-mail :<mailto:jun...@alfasado.net>
〒107-0052東京都港区赤坂7-9-5 赤坂Qビル
502号
03-3586-5405/03-3586-5406(Tokyo)

〒550-0005大阪市西区西本町1-10-3 新松岡ビル502号
06-6534-3772/06-6534-3773(Osaka)
___________________________________________
PowerCMS for MT1.1 Release!
http://alfasado.net/contents/power_cms/

Hirotaka Ogawa

unread,
May 13, 2008, 1:46:44 AM5/13/08
to mto...@googlegroups.com
野田さん

ありがとうございます。この件はBTSに登録済みですが、野田さんの結果を踏まえて割と強気に修正を迫ることができるようになりました ^_^

http://bugs.movabletype.org/default.asp?79506


2008/5/13 野田 純生 <jun...@alfasado.jp>:
>
> 小川さん
>
> 野田です。
> レスが遅くなってすいません。
>
> パッチを当てたあと、さらに MT/ObjectDriverFactory.pm
>
> の↓の中身をコメントアウト して確認しました。 (4.1及び4.15) 複数環境 (MacOSX 10.3+MySQL5.0.41 及び Ubuntu


> +MySQL - 5.0.22 )
>
>
> sub configure {
> my $pkg = shift;
> $_->configure(@_) for @drivers;
> }
>
> 1週間程運用しましたが、文字化けは起こっていません。パッチを当てる前は、3~24時間程度そのままにしておくとかなりの確率で文字化けしていました。
>
> よろしくお願いします。
>
>
> On 2008/04/25, at 0:20, Hirotaka Ogawa wrote:
>
>
>
> >
> > 小川です。
> >
> > 2008/4/24 野田 純生 <jun...@alfasado.jp>:
> >
> > >
> > > 小川さん
> > >
> > > 野田です。
> > > とりあえず、文字化けする環境でパッチを当ててみました。
> > >
> > > 複数の環境で様子を見て、またフィードバックします。
> > >
> >
> > よろしくお願いします。
> >
> >
> もしそれでうまく行くようなら、そのパッチに加えて、MT::ObjectDriverFactory->configure()の中身をコメントアウトしてみても問題ないかどうかを確認していただけると非常に助かります
> > _o_
> >
> > sub configure {
> > # my $pkg = shift;
> > # $_->configure(@_) for @drivers;
> > }
> >
> >
> > > On 2008/04/23, at 13:48, Hirotaka Ogawa wrote:
> > >
> > >
> > >
> > > >
> > > > 小川です。
> > > >
> > > >
> > > >
> > >

> 私自身は確認していないのですが、FastCGI環境での文字化けの可能性があるのではないかと思っています。twitterでjunnamaさんから反応があったので観測可能な現象のようです。
> > >
> > > >
> > > > ロジックとしては、
> > > >
> > > > - FastCGI環境などでDB connectしていてその接続がタイムアウトしてdisconnect状態になる場合を想定する。

> > > > - このとき、FCGIプロセスが何らかのDB


> > > > queryをしようとしたとき、D::OD::Driver::DBI->rw_handle()でDB handleを取得しようとする。

> > > > - rw_handle()は、すでに取得してあるhandleがライブならそれを返し、そうでなければreconnectしてDB
> > > >
> > > handleを生成して返す。
> > >
> > > > - reconnectの場合には、前もってSET NAMESなどが実行されることなく、queryがおこなわれる。
> > > > - したがって文字化けする。
> > > >
> > > >
> > > >
> > >
> ということです。つまり、「reconnect時にMT::ObjectDriver::Driver::DBI->configure()が呼ばれなければならないが、それが呼ばれていない」という問題だと言えます。

> > > > このパッチには、MT::ObjectDriverFactory->configure()をあちこちで呼んでいるせいで、set
> > > >
> > > >
> > >

> namesが二度以上実行されるという別の問題があります。rw_handle()で呼んでるのだから、他のところで呼ぶ必要はなくなるはずですが、そう単純な問題なのかはよく分かりません。


> > >
> > > >
> > > > この件に関してトラブっている方がいれば、コメントくださいまし。
> > > >
> > >
> >
>
> (signature)________________________________
>
> Alfasado,Inc.(アルファサード)
> 野田純生 (Web Solution Engineer)
>
> WebSite :<http://alfasado.net/>
> e-mail :<mailto:jun...@alfasado.net>
> 〒107-0052東京都港区赤坂7-9-5 赤坂Qビル502号
> 03-3586-5405/03-3586-5406(Tokyo)
>
> 〒550-0005大阪市西区西本町1-10-3 新松岡ビル502号
> 06-6534-3772/06-6534-3773(Osaka)
> ___________________________________________
> PowerCMS for MT1.1 Release!
> http://alfasado.net/contents/power_cms/
>
>
>
>

--

Fumiaki Yoshimatsu

unread,
May 20, 2008, 9:32:05 PM5/20/08
to mtos-ja
この件ですが、http://code.sixapart.com/trac/movabletype/changeset/2367にて修正を入れて
みています。ただ、シックス・アパート内でそもそも再現できていないので、検証もできていません。野田さん、もしできたら、修正されているかどうか検証
していただけると助かります。

吉松

野田 純生

unread,
Jun 16, 2008, 9:32:49 AM6/16/08
to mto...@googlegroups.com
吉松さん 小川さん

野田です。

検証・返信が遅くなってすいません。

文字化けの件ですが、パッチ適用後いくつかの環境(MySQL
+mod_fastcgi)でテストしました(2日~1週間程度そのまま
動かしました)が、問題なく(文字化け発生せず)動
作しています。
ひとまず、この件に関して私の認識では問題ないと思います。

よろしくお願いします。

On 2008/05/21, at 10:32, Fumiaki Yoshimatsu wrote:

>
> この件ですが、http://code.sixapart.com/trac/movabletype/
> changeset/2367にて修正を入れて
> みています。ただ、シックス・アパート内でそもそも再現できていな
> いので、検証もできていません。野田さん、もしできたら、修正され
> ているかどうか検証
> していただけると助かります。
>
> 吉松

(signature)________________________________

Alfasado,Inc.(アルファサード)
野田純生

Reply all
Reply to author
Forward
0 new messages