[pgsql-jp: 31453] Re: 7.4RC2 regression failur and not running stats collector process on Solaris
Shigehiro Honda
fwif0083 @ mb.infoweb.ne.jp
2003年 11月 14日 (金) 02:46:05 JST
本田です。
手元の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 メーリングリストの案内