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

ISHIDA Akio iakio @ mono-space.net
2010年 2月 10日 (水) 15:09:59 JST


こんにちは。石田です。

エラーとなる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 メーリングリストの案内