[pgpool-general-jp: 727] Remove unix domain socket file before bind()

Jun Kuriyama kuriyama+ml @ s2factory.co.jp
2010年 2月 15日 (月) 17:06:12 JST


 現状、何かの拍子に pgpool を kill -9 してしまうと、unix domain
socket のファイルが残ってしまいます。
 ただし、その状態で一回立ち上げようとすると、bind() できない、と言わ
れた後で myexit() が走って unix domain socket ファイルは削除されます。

 なので、どうせなら bind() する前にファイルが存在したら消してしまって
もいいかな、と思って、手元では以下のパッチを当てて使っています。

 kill -9 するケースが例外的であるのと、すでに socket ファイルが存在し
たら起動しない、というのは二重起動防止の意味もあるかもしれない(が、どの
みち myunlink() が走るのでこれは違うか)ので、単純に消せばいい、という話
でも無いのかもしれません。

 なんにしろ、早くリカバリーしなきゃ、という時に Address already in
use と言われると慌ててしまうので、私の場合は存在したら消してしまう、と
いう運用でいいかな、と思っている所です。


Index: main.c
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/main.c,v
retrieving revision 1.61
diff -u -r1.61 main.c
--- main.c	13 Feb 2010 11:23:55 -0000	1.61
+++ main.c	15 Feb 2010 07:55:00 -0000
@@ -90,6 +90,7 @@
 static pid_t fork_a_child(int unix_fd, int inet_fd, int id);
 static int create_unix_domain_socket(struct sockaddr_un un_addr_tmp);
 static int create_inet_domain_socket(const char *hostname, const int port);
+static void myunlink(const char* path);
 static void myexit(int code);
 static void failover(void);
 static void reaper(void);
@@ -1017,6 +1018,12 @@
 	return fd;
 }
 
+static int myexists(const char* path)
+{
+	struct stat sb;
+	return stat(path, &sb) == 0 ? 1 : 0;
+}
+
 /*
 * create UNIX domain socket
 */
@@ -1037,6 +1044,9 @@
 	((struct sockaddr *)&addr)->sa_family = AF_UNIX;
 	snprintf(addr.sun_path, sizeof(addr.sun_path), un_addr_tmp.sun_path);
 	len = sizeof(struct sockaddr_un);
+	if (myexists(addr.sun_path)) {
+		myunlink(addr.sun_path);
+	}
 	status = bind(fd, (struct sockaddr *)&addr, len);
 	if (status == -1)
 	{


-- 
Jun Kuriyama <kuriyama @ s2factory.co.jp> // S2 Factory, Inc.


pgpool-general-jp メーリングリストの案内