[pgsql-jp: 32718] Re: pgpoolはFreeBSD のjail環境で動作しません
Tatsuo Ishii
t-ishii @ sra.co.jp
2004年 4月 8日 (木) 12:06:35 JST
石井です.
> あさかわです。
>
> pgpoolがFreeBSDー5.2/4.9のjail環境で動作しません。
>
> 現象は
>
> pgpoolは起動します。
>
> ところが pgpool は「postmasterが認証に失敗した」とエラーを返しますが、
> postmaster の方のログには、そもそも認証のためのコネクション
> があった記録もない。
postmasterが認証を拒否した場合には,postmasterのログにも残らないと思い
ます.
> という現象で、0.2.0、0.2.2、1.0a2 共通の症状です。
>
> もちろん、実環境では、問題ありません
> 問題ないどころか、劇的な、性能向上が見られました。ありがとうございます。
こちらこそご報告ありがとうございます.
> 関係あるかどうかわかりませんが参考までに。
>
> jail環境では自身をアクセスする様なプログラムには
> localhost = jail環境のIPとする必要がありました。
> (fmlが、jail環境内のMTAをlocalhostでアクセスするとおかしな動作をした)
>
> jail内で動作する、bindにたいして
>
> /etc/resolv.conf
> で
> nameserver 127.0.0.1
> や
> nameserver 0.0.0.0
> は、駄目です。
> どうも、実環境の方の127.0.0.1をアクセスしてる気がします。
私はjail環境も持っていませんし,このへんのことはあまり良く分かっていな
いのですが,何かpgpoolに問題があれば対処させていただきますので,是非お
知恵をお貸し下さい.
ところで,
> FreeBSD 5.2.1-RELEASE-p3の環境なので微妙に違うのかも知れませんが、
> jail上のpgpool 0.2.2 経由で問題なくDBにアクセスできています。
> (問題はなんか微妙にユーザー認証が実環境より遅いぐらいかな)
の件と関係があるかどうか分かりませんが,現状のpgpoolでは,pgpoolのクラ
イアントとpgpoolの間の接続がUNIX domainソケットでない場合,極端にパフォー
マンスが落ちることが分かっています.以下のパッチで直ると思うのですが,
よければお試し下さい.問題なければ0.2.3としてリリースしたいと思います.
--
Tatsuo Ishii
-----------------------------------------------------------------------
Index: child.c
===================================================================
RCS file: /home/t-ishii/repository/pgpool/child.c,v
retrieving revision 1.15
diff -c -r1.15 child.c
*** child.c 24 Mar 2004 12:27:04 -0000 1.15
--- child.c 8 Apr 2004 02:41:39 -0000
***************
*** 27,32 ****
--- 27,35 ----
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h>
+ #ifdef HAVE_NETINET_TCP_H
+ #include <netinet/tcp.h>
+ #endif
#include <signal.h>
***************
*** 356,361 ****
--- 359,365 ----
socklen_t addrlen;
int fd = 0;
int afd;
+ int inet = 0;
POOL_CONNECTION *cp;
FD_ZERO(&readmask);
***************
*** 390,395 ****
--- 394,400 ----
if (FD_ISSET(inet_fd, &readmask))
{
fd = inet_fd;
+ inet++;
}
/*
***************
*** 404,409 ****
--- 409,437 ----
return NULL;
}
pool_debug("I am %d accept fd %d", getpid(), afd);
+
+ /* set NODELAY and KEEPALIVE options if INET connection */
+ if (inet)
+ {
+ int on = 1;
+
+ if (setsockopt(afd, IPPROTO_TCP, TCP_NODELAY,
+ (char *) &on,
+ sizeof(on)) < 0)
+ {
+ pool_error("do_accept: setsockopt() failed: %s", strerror(errno));
+ close(afd);
+ return NULL;
+ }
+ if (setsockopt(afd, SOL_SOCKET, SO_KEEPALIVE,
+ (char *) &on,
+ sizeof(on)) < 0)
+ {
+ pool_error("do_accept: setsockopt() failed: %s", strerror(errno));
+ close(afd);
+ return NULL;
+ }
+ }
if ((cp = pool_open(afd)) == NULL)
{
pgsql-jp メーリングリストの案内