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