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

Tatsuo Ishii ishii @ sraoss.co.jp
2010年 2月 15日 (月) 22:25:24 JST


石井です。

>  現状、何かの拍子に pgpool を kill -9 してしまうと、unix domain
> socket のファイルが残ってしまいます。
>  ただし、その状態で一回立ち上げようとすると、bind() できない、と言わ
> れた後で myexit() が走って unix domain socket ファイルは削除されます。
> 
>  なので、どうせなら bind() する前にファイルが存在したら消してしまって
> もいいかな、と思って、手元では以下のパッチを当てて使っています。
> 
>  kill -9 するケースが例外的であるのと、すでに socket ファイルが存在し
> たら起動しない、というのは二重起動防止の意味もあるかもしれない(が、どの
> みち myunlink() が走るのでこれは違うか)ので、単純に消せばいい、という話
> でも無いのかもしれません。
> 
>  なんにしろ、早くリカバリーしなきゃ、という時に Address already in
> use と言われると慌ててしまうので、私の場合は存在したら消してしまう、と
> いう運用でいいかな、と思っている所です。

このあたり、実はpgpoolは手を抜いていて、PostgreSQLでは、

ロックファイル(たとえば/tmp.s.PGSQL.5432.lock)を作ってみる
作れたら、問答無用でsocket file(たとえば/tmp.s.PGSQL.5432)を削除する
bindする

という処理の流れになっています。

pgpoolではそこまでやらなくてもよいような気がするので、まあ、bind前に無
条件でソケットファイルを消しても良いかもしれませんね。
気になるのは、間違って同じソケットファイルをPostgreSQLが使っていたらま
ずいな、ってことくらいですが、現在のコードでもmyexit()がunlinkしている
ので、危険度は変わらない...
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese: http://www.sraoss.co.jp


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