[pgsql-jp: 35692] Re: pgpoolのfflush()におけるEAGAIN

Tatsuo Ishii t-ishii @ sra.co.jp
2005年 7月 7日 (木) 17:17:04 JST


石井です.

> 取り敢えず fdopen() でstdioに絡めている部分を削除し、fwrite()
> を write() に変更して EAGAIN が発生したら書き込めなかった残
> りの部分を書き込む様にし、fflush() は何もしないという感じで
> 試してみましたが途中でエラーが発生している様でした。現在、こ
> のエラーについて原因の詳細は調べていません。但し、この様に改
> 造した時に pgpool -n -d で起動すると上手く行きました。多分デ
> バッグ情報の出力で通信のタイミングが遅れたのだと思います。

これだと,作成中のパケットが飛んでしまうので,まずいと思います
(PostgreSQLのプロトコルでは,作り掛のパケットは送ってはいけないことに
なっていると思います).とりあえず stdio関連をとっぱらい,pool_writeで
はバッファリングのみを行い,pool_flush の中でwriteするようにしたバージョ
ンを

http://www2b.biglobe.ne.jp/~caco/pgpool/tmp/pgpool-2.6.tar.gz

に置きましたので,良かったら試して頂けますか?

> ということは write() を呼び出す前に select() を使って書き込
> み可能な状態を検査しつつ処理を進めるという手順が必要な気もし
> ます。また何か分かりましたらお知らせします。

write()で書き込み可能でなければEAGAINが返るのではないでしょうか.また,
select()で確認したとしても,次にwrite()を呼び出すときにはすでに書き込
み不可になっている可能性もあるわけで,あまり意味がないような...
--
Tatsuo Ishii



pgsql-jp メーリングリストの案内