[pgpool-general-jp: 720] Re: エラー発生後pool_process_query: kind is 0!

ISHIDA Akio iakio @ mono-space.net
2010年 2月 10日 (水) 18:07:12 JST


石田です。

2010年2月10日17:30 Tatsuo Ishii <ishii @ sraoss.co.jp>:
> 石田さん
>
> 石井です。レポートとパッチありがとうございます。うーん、手元の環境
> (Vine Linux 4.2)では現象が起きないので、全然気が付きませんでした。これ
> から検証して修正をコミットします。
> # もしかしたら、gccのバージョンによっては、staticメモリの配置が異なる
> # か何かで、現象が起きないのかも。ちなみに、Vineのは3.3.6です。

そうですね。私はFreeBSD-7.1です。
$ gcc -v
Using built-in specs.
Target: i386-undermydesk-freebsd
Configured with: FreeBSD/i386 system compiler
Thread model: posix
gcc version 4.2.1 20070719  [FreeBSD]

蛇足ですが試しにこんなプログラムを作ってみたところ
int main()
{
        static char a[256];
        static char b[256];
        printf("%p\n%p\n", a, b);
        return 0;
}

0x8049740
0x8049640
となりました。

> --
> Tatsuo Ishii
> SRA OSS, Inc. Japan
> English: http://www.sraoss.co.jp/index_en.php
> Japanese: http://www.sraoss.co.jp
>
>> こんにちは。石田です。
>>
>> エラーとなるSQLを実行すると、「pool_process_query: kind is 0!」
>> とログを出力し、子プロセスが終了してしまいます。
>>
>> pool_test=# aaa;
>> server closed the connection unexpectedly
>>         This probably means the server terminated abnormally
>>         before or while processing the request.
>> The connection to the server was lost. Attempting reset: Succeeded.
>>
>> 2010-02-10 12:55:36 LOG:   pid 41240: SimpleQuery: Error or notice
>> message from backend: : DB node id: 0 backend pid: 41244 statement:
>> aaa; message: syntax error at or near "aaa"
>> 2010-02-10 12:55:36 DEBUG: pid 41240: wait_for_query_response: waiting
>> for backend 1 completing the query
>> 2010-02-10 12:55:36 LOG:   pid 41240: SimpleQuery: Error or notice
>> message from backend: : DB node id: 1 backend pid: 41245 statement:
>> aaa; message: syntax error at or near "aaa"
>> 2010-02-10 12:55:36 DEBUG: pid 41240: read_kind_from_backend: read
>> kind from 0 th backend ^@ NUM_BACKENDS: 2
>> 2010-02-10 12:55:36 DEBUG: pid 41240: read_kind_from_backend: read
>> kind from 1 th backend ^@ NUM_BACKENDS: 2
>> 2010-02-10 12:55:36 ERROR: pid 41240: pool_process_query: kind is 0!
>> 2010-02-10 12:55:36 LOG:   pid 41240: do_child: exits with status 1 due to error
>> 2010-02-10 12:55:36 DEBUG: pid 41241: I am 41241 accept fd 5
>> 2010-02-10 12:55:36 DEBUG: pid 41238: reap_handler called
>>
>> gdbで追ってみたところ、pool_extract_error_messageの
>> message_buf[sizeof(message_buf)] = '\0';
>> が、実は static char buf[8192]; の先頭を書き換えてしまって
>> いたため、pool_unread()した後にkindを見ると0になって
>> しまっているようです。
>>
>> 以下の修正でよさそうですが、文字列だけであれば
>> strlcpy()でも良いと思います。
>>
>> diff --git a/pool_process_query.c b/pool_process_query.c
>> index 41a4f31..0ade595 100644
>> --- a/pool_process_query.c
>> +++ b/pool_process_query.c
>> @@ -4458,9 +4458,9 @@ int pool_extract_error_message(bool read_kind, POOL_CONNEC
>>             if (*e == 'M')
>>             {
>>                 e++;
>> -               len = Max(sizeof(message_buf)-1, strlen(e));
>> +               len = Min(sizeof(message_buf)-1, strlen(e));
>>                 memcpy(message_buf, e, len);
>> -               message_buf[sizeof(message_buf)] = '\0';
>> +               message_buf[len] = '\0';
>>                 break;
>>             }
>>             else
>> @@ -4471,7 +4471,7 @@ int pool_extract_error_message(bool read_kind, POOL_CONNEC
>>     else
>>     {
>>         str = pool_read_string(backend, &len, 0);
>> -       len = Max(sizeof(message_buf)-1, len);
>> +       len = Min(sizeof(message_buf)-1, len);
>>         readlen += len;
>>
>>         if (readlen >= sizeof(buf))
>> @@ -4482,7 +4482,7 @@ int pool_extract_error_message(bool read_kind, POOL_CONNEC
>>
>>         memcpy(p, str, len);
>>         memcpy(message_buf, str, len);
>> -       message_buf[sizeof(message_buf)] = '\0';
>> +       message_buf[len] = '\0';
>>     }
>>
>>     if (unread)
>>
>>
>>
>> --
>> ISHIDA Akio <iakio @ mono-space.net/ishida @ cycleof5th.com>
>> _______________________________________________
>> pgpool-general-jp mailing list
>> pgpool-general-jp @ sraoss.jp
>> http://www.sraoss.jp/mailman/listinfo/pgpool-general-jp
>
>



-- 
ISHIDA Akio <iakio @ mono-space.net/ishida @ cycleof5th.com>


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