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