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