[Home]POPFile/SSLProblem

Amatubu_Wiki | POPFile | RecentChanges | Preferences

POPFile SSL 遅延問題について

SSL 利用時に遅延が生じる問題について。

問題は解決しました

問題は解決し、POPFile 0.22.1 で修正された。下記の情報はもう必要ないが、参考のために残しておく。

これまでわかっていること

If you need to select(2) on the socket, go right ahead, but be warned
that OpenSSL does some internal buffering so SSL_read does not always
return data even if socket selected for reading (just keep on
selecting and trying to read). Net::SSLeay.pm is no different from the
C language OpenSSL in this respect.
と書かれている。OpenSSL は、内部にバッファを持っているため、データが残っていても SSL_read で読み込めない場合があるらしい。

遅延への対処用コード

SSL の場合は、can_read の代わりに、pending でバッファにデータがあるかどうかを確かめるように変更。

POPFile/Module.pm の 530 行目と 531 行目を、

            my $can_read;
            $self->log_( 2, "cr-check1" );
            $can_read = ( ( $handle !~ /socket/i ) && ( $^O eq 'MSWin32' ) );
            $self->log_( 2, "( \$handle !~ /socket/i ) && ( \$^O eq 'MSWin32' ) : " . ( $can_read ? "true" : "false" ) );
            if ( !$can_read ) {
                if ( $handle =~ /ssl/i ) {
                    # If using SSL, check internal buffer of OpenSSL first.
                    $can_read = ( $handle->pending() > 0 );
                    $self->log_( 2, "( \$handle->pending() > 0 ) : " . ( $can_read ? "true" : "false" ) );
                }
                if ( !$can_read ) {
                    $can_read = defined( $slurp_data__{"$handle"}{select}->can_read( $self->global_config_( 'timeout' ) ) );
                    $self->log_( 2, "( defined( ... ) ) : " . ( $can_read ? "true" : "false" ) );
                }
            }
 
            if ( $can_read ) {

と変更する(ログ記録ありの場合)。

diff

本家のパッチセクションに [Patch for SSL delay] として登録したので、そちらを参照。今後の変更についてはこのパッチセクションで行う予定。

このパッチにより、問題が解決されたことが確認され、POPFile 0.22.1 で修正された。

パッチは、ログ記録ありとログ記録なしの 2 種類があるので、必要に応じて好きな方を使う。ログ記録ありの場合は、次のようなログが記録される。

ログに記録されるもの

2004/9/27 00:17:30 1143: bayes: 531: cr-check1
2004/9/27 00:17:30 1143: bayes: 533: ( $handle !~ /socket/i ) && ( $^O eq 'MSWin32' ) : false
2004/9/27 00:17:30 1143: bayes: 537: ( $handle->pending() > 0 ) : true

あるいは、

2004/9/27 00:17:32 1143: bayes: 531: cr-check1
2004/9/27 00:17:32 1143: bayes: 533: ( $handle !~ /socket/i ) && ( $^O eq 'MSWin32' ) : false
2004/9/27 00:17:32 1143: bayes: 537: ( $handle->pending() > 0 ) : false
2004/9/27 00:17:32 1143: bayes: 541: ( defined( ... ) ) : true

というようなログが記録される。前者は、バッファにデータがあった場合で、後者はバッファにデータがなかった場合。

SSL を使用していない場合には、

2004/9/27 00:19:16 1145: bayes: 531: cr-check1
2004/9/27 00:19:16 1145: bayes: 533: ( $handle !~ /socket/i ) && ( $^O eq 'MSWin32' ) : false
2004/9/27 00:19:16 1145: bayes: 541: ( defined( ... ) ) : true

というようなログが記録される。

関連情報


Amatubu_Wiki | POPFile | RecentChanges | Preferences
This page is read-only | View other revisions
Last edited October 7, 2004 12:30 by Amatubu (diff)
Search:

Copyright (c) 1996-2006 naoki iimura e-mail