[pgcluster: 139] PostPortNumber and sock == -1 in PGR_Send_Replicate_Command()
Jun Kuriyama
kuriyama @ imgsrc.co.jp
2004年 2月 23日 (月) 15:03:52 JST
(1) pgcluster を -R 付きで立ち上げると、RECOVERY_PREPARE_REQ なパケッ
トが投げられると思うんですが、pgcluster のポート番号を
$PGDATA/postgresql.conf で指定しても、このパケットには正しいポート
番号が入らないようです。postmaster 起動時に -p 15432 などとして渡
すと大丈夫なのですが。グローバルな PostPortNumber に値が設定される
タイミングと、上記パケットを投げるタイミングが関係しているのでしょ
うか。
-p で指定しなくても正しい値が入るのは難しいのでしょうか。
# まだ初期化のタイミングなどは詳しく追っていません。
(2) libpq/replicate.c の PGR_Send_Replicate_Command() なんですが、
search_new_replication_server() が -1 を返すときがあるようで、その
場合にそのまま sock を send_replicate_packet() に渡すと FD_SET()
で死んでしまうことがありました。
どの辺で -1 チェックをするべきかってのはよくわからなかったのですが、
手元では以下のようなパッチでしのいでいます。
# 余計な elog() 変更まで入ってしまってますが……。
@@ -665,10 +666,10 @@
gethostname(header.from_host,sizeof(header.from_host));
gethostname(header.except_host,sizeof(header.except_host));
cnt = 0;
- while (send_replicate_packet(sock,&header,query_string) != STATUS_OK)
+ while (sock == -1 || send_replicate_packet(sock,&header,query_string) != STATUS_OK)
{
if (Debug_pretty_print)
- elog(DEBUG1,"replication server: %s may be down",sp->hostName);
+ elog(DEBUG1,"replication server: %s may be down (cnt=%d, sock=%d)", sp->hostName, cnt, sock);
close_replicate_server_socket ( sp , socket_type);
sp->useFlag = DATA_ERR;
sock = search_new_replication_server( sp,socket_type,&header);
--
Jun Kuriyama <kuriyama @ imgsrc.co.jp> // IMG SRC, Inc.
<kuriyama @ FreeBSD.org> // FreeBSD Project
pgcluster メーリングリストの案内