[pgcluster: 794] 子プロセスが残ったままになります(1.1.1a)

Masanobu Yasui yasui-m @ klab.org
2005年 8月 6日 (土) 20:51:10 JST


安井と申します。
初めて投稿させて頂きます。

PGCluster-1.1.1a を利用させて頂いておりますが、以下のような問題が発生しており、
少々悩んでいます。

  1. pgreplicateを停止するとpostmasterのゾンビが残る
  2. postmasterをSIGINTで終了すると子プロセスが残ったままになる

【利用環境】
   Debian 3.1 Sarge
   Kernel 2.6.12.3

まず 1 についてですが、LifeCheck_Port(7201) に接続すると、接続を切ったあとに
子プロセスがゾンビのまま残ってしまうというものです。このままですと 7201番に接
続しまくるだけで誰でも簡単にサーバダウンさせることができてしまうと思われます。

これは、pgcluster.c の PGR_ACK_Main 関数内で PG_SETMASK(&AuthBlockSig) をして
いるために、子プロセスが終了しても PGRchild_wait が呼ばれていないことによるも
のと考えています。


2につきましては、SIGINT(Fast Shutdown) において 以下に保持される子プロセス

Lifecheck_Pid_Info.Master_Pid
Lifecheck_Pid_Info.SYN_Pid
Lifecheck_Pid_Info.ACK_Pid

にSIGTERMが送られていないためと推測しています。
(pmdie関数 の case SIGINT: では SignalChildren(SIGTERM) しているようなので・・・)

とりあえず現在は以下のパッチにてしのいでおりますが、根本的な解決策等がござい
ましたら、ご教授頂けないでしょうか。

よろしくお願い致します。


--- pgcluster-1.1.1a/src/backend/libpq/pgcluster.c      2005-03-02 10:24:28.000000000 +0900
+++ pgcluster-1.1.1a-patch/src/backend/libpq/pgcluster.c        2005-08-06 19:53:13.000000000 +0900
@@ -1327,7 +1327,7 @@
        pqsignal(SIGTERM,PGRexit_life_check);
        pqsignal(SIGINT,PGRexit_life_check);
        pqsignal(SIGQUIT,PGRexit_life_check);
-       pqsignal(SIGCHLD,PGRchild_wait);
+       pqsignal(SIGCHLD,SIG_IGN);
        PG_SETMASK(&AuthBlockSig);
        status = PGR_Create_Socket_Bind(&fd, "", port);

diff -ur pgcluster-1.1.1a/src/backend/postmaster/postmaster.c pgcluster-1.1.1a-patch/src/backend/postmaster/postmaster.c
--- pgcluster-1.1.1a/src/backend/postmaster/postmaster.c        2005-03-02 10:24:28.000000000 +0900
+++ pgcluster-1.1.1a-patch/src/backend/postmaster/postmaster.c  2005-08-06 20:01:26.000000000 +0900
@@ -1731,7 +1731,12 @@
                        (errmsg_internal("postmaster received signal %d",
                                                         postgres_signal_arg)));
 #ifdef USE_REPLICATION
-       PGR_Clear_Children(postgres_signal_arg);
+       if(postgres_signal_arg==SIGINT){
+               PGR_Clear_Children(SIGTERM);
+       }
+       else{
+               PGR_Clear_Children(postgres_signal_arg);
+       }
 #endif /* USE_REPLICATION */

        switch (postgres_signal_arg)

 
**************************************************************
KLab 株式会社(クラブかぶしきがいしゃ) http://www.klab.org/
  Kラボラトリー: 安井真伸
**************************************************************





pgcluster メーリングリストの案内