[pgsql-jp: 31456] Re: 7.4RC2 regression failur and not running stats collector process on Solaris
Kiyoshi Sawada
sawa @ nagoya2.jrc.or.jp
2003年 11月 14日 (金) 12:24:13 JST
沢田です。
本田さん、不具合再現から原因特定、さらに対処方法までご教示
いただきありがとうごさいます。
こちらでも一連の方法でテストしてみましたので報告します。
結果
SunOS 5.8 sun4m sparc と SunOS 5.8 i386 i86pc のどちらも
(1) src/backend/postmaster/pgstat.c の本田さんパッチ
(2) /etc/inet/ipnodes で ::1 を削除
(3) make cheke
======================
All 93 tests passed.
======================
(4) pg_ctl start
ps -ef | grep postmaster
postgres 20937 1 1 12:10:40 pts/4 0:00 /usr/local/pgsql/bin/postmaster
postgres 20939 20937 0 12:10:41 pts/4 0:00 /usr/local/pgsql/bin/postmaster
postgres 20940 20939 0 12:10:41 pts/4 0:00 /usr/local/pgsql/bin/postmaster
(5) バックエンドの PID と現在の問い合わせを表示
SELECT pg_stat_get_backend_pid(S.backendid) AS procpid,
pg_stat_get_backend_activity(S.backendid) AS current_query
FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS S;
procpid | current_query
---------+---------------
20947 |
(1 row)
x86はOSインストール時に「IPv6なし」で行なってしましました。後悔 );
sparcは旧業務用のベンダ払い下げマシンで、現在テスト用としている
ものです。IPv6の機能は未チェックでした。
教訓(Solaris以外のマシンでも言えるのかな?)
中途半端なIPv6関連のインストールや設定では、v7.4以降
statsのSocket通信bind関数で不具合が出る。
さて、本家HACKERへの報告ですが、本田さんから報告していただける
とありがたいのですが、いかがしましょう?
ヘンテコな英語ですが、沢田から報告いたしましょうか?
本田さん、重ねて感謝いたします。
On Fri, 14 Nov 2003 02:46:05 +0900 (JST) Shigehiro Honda <fwif0083 @ mb.infoweb.ne.jp> wrote:
> 本田です。
>
> 手元のsolaris9 sparcでOK、solaris9 x86でNGという不可解な
> 状態でしたので、少し見てみました。
> From: Kiyoshi Sawada <sawa @ nagoya2.jrc.or.jp>
> Subject: [pgsql-jp: 31442] Re: 7.4RC2 regression failur and not running stats collector process on Solaris
> Date: Wed, 12 Nov 2003 20:31:31 +0900
>
> > 本家HACKERSからもアドバイスをいただき、
> > src/backend/postmaster/pgstat.c の pgstat_init() を追っかけています。
> (略)
> > どうやら、bind()でエラーを出しているようです。
>
> postmasterにtrussをかけてみると、x86もsparcも
> IPv6なUDP(正確な言い方かしら?)でbindしようとしていました。
> sparcでは、
> so_socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP, "", 1) = 5
> bind(5, 0x003B6A90, 32, 3) = 0
> とbindに成功し、一方、x86では
> so_socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP, "", 1) = 4
> bind(4, 0x083301B8, 32, 3) Err#126 EADDRNOTAVAIL
> とbind()できませんでした。
>
> このフラグはlocalhostに付与されているはずのアドレスを見て決定してい
> るようです。sparcの方にはIPv6を有効にしていたせいかlo0にIPv4とIPv6
> が付与されていて、x86の方にはIPv4のみが付与されています。(後ろに両者
> のifconfigの出力を付与します。)
>
> src/backend/postmaster/pgstat.cの上の方で、呼び出す関数
> getaddrinfo_allから呼び出されるライブラリ関数getaddrinfo
> の不具合なような気がします。
>
> 対策としては
> (1) 不具合をコードで吸収する
> こんな感じかなぁ。一応動作はする模様です。
> santana% diff src/backend/postmaster/pgstat.c.DIST src/backend/postmaster/pgstat.c
> 213,214c213,221
> < if ((pgStatSock = socket(addr->ai_family, SOCK_DGRAM, 0)) >= 0)
> < break;
> ---
> >
> > if ((pgStatSock = socket(addr->ai_family, SOCK_DGRAM, 0)) >= 0) {
> > if (bind(pgStatSock, addr->ai_addr, addr->ai_addrlen) < 0) {> pgStatSock = -1;
> > } else {
> > break;
> > }
> > }
> >
> 228a236
> > /*
> 235a244
> > */
>
> (2) /etc/inet/ipnodesから::1から始まる行を削除する
> #副作用は調べていません。
> santana% more /etc/inet/ipnodes
> #
> # Internet host table
> #
> ::1 localhost
> 127.0.0.1 localhost
>
> ifconfigの結果:
> [sparcなホスト]
> jb% /usr/sbin/ifconfig -a
> lo0: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4> mtu 8232 index 1
> inet 127.0.0.1 netmask ff000000
> hme0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
> inet 10.0.0.109 netmask ffffff00 broadcast 10.0.0.255
> lo0: flags=2000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv6> mtu 8252 index 1
> inet6 ::1/128
> hme0: flags=2000841<UP,RUNNING,MULTICAST,IPv6> mtu 1500 index 2
> inet6 fe80::a00:20ff:fea2:2359/10
> [x86なホスト]
> santana% /usr/sbin/ifconfig -a
> lo0: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4> mtu 8232 index 1
> inet 127.0.0.1 netmask ff000000
> pcn0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
> inet 10.0.0.74 netmask ff000000 broadcast 10.255.255.255
pgsql-jp メーリングリストの案内