[pgsql-jp: 32886] pgpool +長いデータの INSERT

川村 純一 jkawa @ m.email.ne.jp
2004年 5月 2日 (日) 05:30:45 JST


川村と申します。

FreeBSD 5.2.1-RELEASE-p4 上で、pgpool-1.0 と PostgreSQL-7.3.5 を
動作させています。

pgpool 経由で postmaster へ、例えば 40000 byte 位の文字列データを
INSERT するクエリを送ると、pgpool が core dump する現象が起きてい
ます。pgpool を通さずに、postmaster 直だと問題ありません。

gdb でバックトレースを取ると、

-----------------------------------------------------------------------
Program received signal SIGSEGV, Segmentation fault.
0x281413f8 in __vfprintf () from /lib/libc.so.5
(gdb) bt
#0  0x281413f8 in __vfprintf () from /lib/libc.so.5
#1  0x2813d3a3 in snprintf () from /lib/libc.so.5
#2  0x0804ce9f in AsciiRow (frontend=0x8058040, backend=0x80620a0,
    num_fields=3) at pool_process_query.c:632
#3  0x0804c46e in pool_process_query (frontend=0x8058040, backend=0x80620a0,
    connection_reuse=0) at pool_process_query.c:270
#4  0x0804a173 in do_child (unix_fd=4, inet_fd=5) at child.c:212
#5  0x08049903 in fork_a_child (unix_fd=4, inet_fd=5) at main.c:363
#6  0x080493c3 in main (argc=1, argv=0x8062094) at main.c:192
#7  0x080490f2 in _start ()
(gdb)
-----------------------------------------------------------------------

このようになっており、試しに AscciRow() 内の snprinf() 直前に
breakpoint 仕掛けていろいろ調べてみたのですが、いまいち追いき
れていません。

あくまで感触ですが、どうもここに到達する前にすでにどこかでメモ
リが壊されているような雰囲気です。

もう少し追っかけてみますが、他に見るべきところなどのアドバイス
がありましたら助かります。

あともう一点なのですが、上記の現象を調べるために -d オプション
付で pgpool を立ち上げた場合、pool_stream.c の pool_read_string()
で頻繁に core を吐く現象が起きました。

こちらも追いきれておらず恐縮なのですが、どうも realloc() 後の
termination されていない文字列が pool_debug() に渡されているため
のように思えます。

修正報告ではなくて心苦しいのですが、まずはご報告まで。





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