[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 メーリングリストの案内