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