OverlayweaverのSelfAddressに関する問題と疑問

OverlayweaverでSelfAddressの扱いが変な気がしてきた。
設定・環境依存な問題かもしれないが。

以下はグローバルIPをホストで直接所持しているノードAとローカルIPを持ちUPnPでルータと会話が出来るノードBでDHTを構成してみた時の記録である。

まず、ノードAで立ち上げる。

java -cp bin ow.tool.dhtshell.Main -t TCP -s 124.32.128.131:9899 --no-up
np
DHT configuration:
  hostname:port:     124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899
  transport type:    TCP
  routing algorithm: Chord
  routing style:     Iterative
  directory type:    VolatileMap
  working directory: .
A DHT started.
Ready.

次に、ノードBからノードAへjoinする。

 java -cp bin:lib/commons-cli-1.1.jar:lib/clink170.jar ow.tool.dhtshell.Main -t TCP  enoki.dokukino.com:9899
DHT configuration:
  hostname:port:     syuu-laptop/127.0.1.1:3997
  transport type:    TCP
  routing algorithm: Chord
  routing style:     Iterative
  directory type:    VolatileMap
  working directory: .
CyberGarage warning : Invalidate Multicast Recieved : /239.255.255.250,/ff02:0:0:0:0:0:0:c
CyberGarage warning : Invalidate Multicast Recieved : /239.255.255.250,/ff02:0:0:0:0:0:0:c
CyberGarage warning : Invalidate Multicast Recieved : /239.255.255.250,/ff02:0:0:0:0:0:0:c
CyberGarage warning : Invalidate Multicast Recieved : /ff02:0:0:0:0:0:0:c,/239.255.255.250
CyberGarage warning : Invalidate Multicast Recieved : /ff02:0:0:0:0:0:0:c,/239.255.255.250
CyberGarage warning : Invalidate Multicast Recieved : /ff02:0:0:0:0:0:0:c,/239.255.255.250
2009/05/15 6:21:51 ow.dht.impl.BasicDHTImpl joinOverlay
情報: DHTImpl#joinOverlay: enoki.dokukino.com/124.32.128.131:9899
2009/05/15 6:21:51 ow.messaging.upnp.UPnPManager start
情報: UPnP manager started.
2009/05/15 6:21:51 ow.messaging.tcp.ConnectionPool get
情報: A new Socket created: enoki.dokukino.com/124.32.128.131:9899
2009/05/15 6:21:51 ow.messaging.tcp.TCPMessageSender send
情報: send(enoki.dokukino.com/124.32.128.131:9899, ROUTE_JOIN)
2009/05/15 6:21:51 ow.messaging.Message encode
情報: tag:ROUTE_JOIN # of contents:5
2009/05/15 6:21:51 ow.messaging.timeoutcalc.RTTBasedTimeoutCalculator updateRTT
情報: To enoki.dokukino.com/124.32.128.131:9899: RTT: 141, ave. RTT: 141, mdev: 70, mdev_max: 500, rttvar: 500, timeout: 2141
2009/05/15 6:21:51 ow.messaging.tcp.ConnectionPool get
情報: A Socket found in the hash table: 
2009/05/15 6:21:51 ow.messaging.tcp.TCPMessageSender send
情報: send((not resolved)/124.32.128.131:9899, ADJUST_LAST_HOP_REQ)
2009/05/15 6:21:51 ow.messaging.Message encode
情報: tag:ADJUST_LAST_HOP_REQ # of contents:1
2009/05/15 6:21:51 ow.messaging.timeoutcalc.RTTBasedTimeoutCalculator updateRTT
情報: To (not resolved)/124.32.128.131:9899: RTT: 30, ave. RTT: 127, mdev: 71, mdev_max: 500, rttvar: 500, timeout: 2127
2009/05/15 6:21:51 ow.messaging.tcp.ConnectionPool get
情報: A Socket found in the hash table: 
2009/05/15 6:21:51 ow.messaging.tcp.TCPMessageSender send
情報: send((not resolved)/124.32.128.131:9899, TERMINATE_JOIN)
2009/05/15 6:21:51 ow.messaging.Message encode
情報: tag:TERMINATE_JOIN # of contents:3
2009/05/15 6:21:51 ow.messaging.timeoutcalc.RTTBasedTimeoutCalculator updateRTT
情報: To (not resolved)/124.32.128.131:9899: RTT: 15, ave. RTT: 113, mdev: 72, mdev_max: 500, rttvar: 500, timeout: 2113
2009/05/15 6:21:51 ow.routing.impl.IterativeRoutingDriver$Querier call
情報: Callback result: null
  initial contact:   enoki.dokukino.com:9899
A DHT started.
Ready.
2009/05/15 6:21:51 ow.messaging.tcp.ConnectionPool get
情報: A Socket found in the hash table: 
2009/05/15 6:21:51 ow.messaging.tcp.TCPMessageSender send
情報: send((not resolved)/124.32.128.131:9899, REQ_CONNECT)
2009/05/15 6:21:51 ow.messaging.Message encode
情報: tag:REQ_CONNECT # of contents:1
2009/05/15 6:21:51 ow.messaging.timeoutcalc.RTTBasedTimeoutCalculator updateRTT
情報: To 124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899: RTT: 18, ave. RTT: 101, mdev: 72, mdev_max: 500, rttvar: 500, timeout: 2101
2009/05/15 6:21:51 ow.messaging.tcp.TCPMessageSender adjustLoopbackAddress
情報: destination is loopback address and adjusted to (not resolved)/127.0.1.1:3997
2009/05/15 6:21:51 ow.messaging.tcp.TCPMessageSender adjustLoopbackAddress
情報: destination is loopback address and adjusted to (not resolved)/127.0.1.1:3997
2009/05/15 6:21:51 ow.messaging.tcp.ConnectionPool get
情報: A Socket found in the hash table: 
2009/05/15 6:21:51 ow.messaging.tcp.TCPMessageSender send
情報: send(124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899, TERMINATE_NONE)
2009/05/15 6:21:51 ow.messaging.Message encode
情報: tag:TERMINATE_NONE # of contents:2
2009/05/15 6:21:51 ow.messaging.timeoutcalc.RTTBasedTimeoutCalculator updateRTT
情報: To 124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899: RTT: 14, ave. RTT: 90, mdev: 72, mdev_max: 500, rttvar: 500, timeout: 2090
2009/05/15 6:21:51 ow.routing.impl.IterativeRoutingDriver$Querier call
情報: Callback result: null
2009/05/15 6:21:51 ow.routing.chord.FingerTable put
情報: FingerTable#put: 0238b5ce1e19fe1fc9cf33a0f2e2e3c40125fd5d:124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899 from 159 to 1
2009/05/15 6:21:51 ow.routing.chord.Chord$FingerTableFixer run
情報: An entry incorporated to finger table: 0238b5ce1e19fe1fc9cf33a0f2e2e3c40125fd5d:124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899
2009/05/15 6:21:51 ow.messaging.upnp.UPnPManager$DevChgListener deviceAdded
情報: UPnP device found: WLBAR-54GT
2009/05/15 6:21:51 ow.messaging.tcp.ConnectionPool get
情報: A Socket found in the hash table: 
2009/05/15 6:21:51 ow.messaging.tcp.TCPMessageSender send
情報: send(124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899, REQ_CONNECT)
2009/05/15 6:21:51 ow.messaging.Message encode
情報: tag:REQ_CONNECT # of contents:1
2009/05/15 6:21:51 ow.messaging.timeoutcalc.RTTBasedTimeoutCalculator updateRTT
情報: To 124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899: RTT: 15, ave. RTT: 80, mdev: 72, mdev_max: 500, rttvar: 500, timeout: 2080
2009/05/15 6:21:51 ow.messaging.upnp.UPnPManager addMapping
情報: UPnP address port mapping succeeded: ext port 3997, internal port 3997
2009/05/15 6:21:52 ow.messaging.tcp.ConnectionPool get
情報: A Socket found in the hash table: 
2009/05/15 6:21:52 ow.messaging.tcp.TCPMessageSender send
情報: send(124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899, REQ_CONNECT)
2009/05/15 6:21:52 ow.messaging.Message encode
情報: tag:REQ_CONNECT # of contents:1
2009/05/15 6:21:52 ow.messaging.timeoutcalc.RTTBasedTimeoutCalculator updateRTT
情報: To 124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899: RTT: 24, ave. RTT: 73, mdev: 71, mdev_max: 500, rttvar: 500, timeout: 2073
2009/05/15 6:21:53 ow.messaging.tcp.ConnectionPool get
情報: A Socket found in the hash table: 
2009/05/15 6:21:53 ow.messaging.tcp.TCPMessageSender send
情報: send(124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899, REQ_CONNECT)
2009/05/15 6:21:53 ow.messaging.Message encode
情報: tag:REQ_CONNECT # of contents:1
2009/05/15 6:21:53 ow.messaging.timeoutcalc.RTTBasedTimeoutCalculator updateRTT
情報: To 124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899: RTT: 21, ave. RTT: 66, mdev: 70, mdev_max: 500, rttvar: 500, timeout: 2066
2009/05/15 6:21:55 ow.messaging.tcp.ConnectionPool get
情報: A Socket found in the hash table: 
2009/05/15 6:21:55 ow.messaging.tcp.TCPMessageSender send
情報: send(124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899, REQ_CONNECT)
2009/05/15 6:21:55 ow.messaging.Message encode
情報: tag:REQ_CONNECT # of contents:1
2009/05/15 6:21:55 ow.messaging.timeoutcalc.RTTBasedTimeoutCalculator updateRTT
情報: To 124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899: RTT: 24, ave. RTT: 60, mdev: 69, mdev_max: 500, rttvar: 500, timeout: 2060
2009/05/15 6:21:59 ow.messaging.tcp.ConnectionPool get
情報: A Socket found in the hash table: 
2009/05/15 6:21:59 ow.messaging.tcp.TCPMessageSender send
情報: send(124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899, REQ_CONNECT)
2009/05/15 6:21:59 ow.messaging.Message encode
情報: tag:REQ_CONNECT # of contents:1
2009/05/15 6:21:59 ow.messaging.timeoutcalc.RTTBasedTimeoutCalculator updateRTT
情報: To 124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899: RTT: 21, ave. RTT: 55, mdev: 68, mdev_max: 500, rttvar: 500, timeout: 2055
2009/05/15 6:22:07 ow.messaging.tcp.ConnectionPool get
情報: A Socket found in the hash table: 
2009/05/15 6:22:07 ow.messaging.tcp.TCPMessageSender send
情報: send(124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899, REQ_CONNECT)
2009/05/15 6:22:07 ow.messaging.Message encode
情報: tag:REQ_CONNECT # of contents:1
2009/05/15 6:22:07 ow.messaging.timeoutcalc.RTTBasedTimeoutCalculator updateRTT
情報: To 124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899: RTT: 81, ave. RTT: 58, mdev: 57, mdev_max: 500, rttvar: 500, timeout: 2058
2009/05/15 6:22:26 ow.messaging.tcp.ConnectionPool get
情報: A Socket found in the hash table: 
2009/05/15 6:22:26 ow.messaging.tcp.TCPMessageSender send
情報: send(124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899, REQ_CONNECT)
2009/05/15 6:22:26 ow.messaging.Message encode
情報: tag:REQ_CONNECT # of contents:1
2009/05/15 6:22:26 ow.messaging.timeoutcalc.RTTBasedTimeoutCalculator updateRTT
情報: To 124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899: RTT: 23, ave. RTT: 53, mdev: 56, mdev_max: 500, rttvar: 500, timeout: 2053
2009/05/15 6:22:35 ow.routing.chord.Chord stop
情報: Chord#stop() called.
2009/05/15 6:22:35 ow.routing.impl.IterativeRoutingDriver$Querier call
情報: Callback result: null
2009/05/15 6:22:35 ow.routing.chord.Chord$FingerTableFixer run
情報: An entry incorporated to finger table: 533625ce0dfd53ad9dc9ccc7c8d372a286938488:i121-117-87-218.s05.a013.ap.plala.or.jp/121.117.87.218:3997

エラーを起こしてChord#stop()を呼んでいるように見える。
上記のログでも127.0.1.1なるアドレスが出てきてアレ?と思う所だが、ノードAの方でstatusコマンドを実行するとはっきりと分かる:

status
ID and address: 0238b5ce1e19fe1fc9cf33a0f2e2e3c40125fd5d:124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899
Routing table:
predecessor:
 b43afcaa4ece03612efd123c880fbeaaf604bfd3:127.0.1.1/127.0.1.1:3997
successor list: [
 b43afcaa4ece03612efd123c880fbeaaf604bfd3:127.0.1.1/127.0.1.1:3997
 0238b5ce1e19fe1fc9cf33a0f2e2e3c40125fd5d:124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899
]
finger table: [
 1: b43afcaa4ece03612efd123c880fbeaaf604bfd3:127.0.1.1/127.0.1.1:3997
]
Ready.

finger tableに127.0.1.1が登録されてる。

netstatでも。

netstat -nap|grep 3397
(一部のプロセスが識別されますが, 所有していないプロセスの情報は
表示されません。それら全てを見るにはルートになる必要があります.)
tcp6       0      0 127.0.1.1:3397          :::*                    LISTEN      25189/java  

で、こうなる原因はJavaAPIからローカルアドレスを取得した際に自分のホスト名からIPを引いたからだと思う。ちゃんとSelfAddressのホスト名はhostnameのホスト名と同じだし。

$ grep syuu /etc/hosts
127.0.1.1	syuu-laptop
$ hostname
syuu-laptop

これじゃ困る。じゃあ、ノードB側でSelfAddressにローカルIPを正しく入力してはどうか。
これは恐らくhostnameで取れる名前を解決するとローカルIPになる場合と等価なはず。

java -cp bin:lib/commons-cli-1.1.jar:lib/clink170.jar ow.tool.dhtshell.Main -t TCP -s192.168.1.11:3397 enoki.dokukino.com:9899
*画面省略*

で、ノードA側でstatus。

status
ID and address: 0238b5ce1e19fe1fc9cf33a0f2e2e3c40125fd5d:124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899
Routing table:
predecessor:
 85bb4b24773bcfb0a8397ed14aac6abdbca7c584:192.168.1.11/192.168.1.11:3397
successor list: [
 85bb4b24773bcfb0a8397ed14aac6abdbca7c584:192.168.1.11/192.168.1.11:3397
 0238b5ce1e19fe1fc9cf33a0f2e2e3c40125fd5d:124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899
]
finger table: [
 1: 85bb4b24773bcfb0a8397ed14aac6abdbca7c584:192.168.1.11/192.168.1.11:3397
]
Ready.

やはりSelfAddressがそのまま渡ってくる。これじゃ通信出来ないだろう。
netstatは正しい感じなのだが。

netstat -nap|grep java
(一部のプロセスが識別されますが, 所有していないプロセスの情報は
表示されません。それら全てを見るにはルートになる必要があります.)
tcp6       0      0 192.168.1.11:3397       :::*                    LISTEN      25480/java      

では、ノードBでルータの持つグローバルアドレスをSelfAdressとして渡してみてはどうか。

java -cp bin:lib/commons-cli-1.1.jar:lib/clink170.jar ow.tool.dhtshell.Main -t TCP -s121.117.87.218:3397 enoki.dokukino.com:9899
*ログ省略*

ノードAで再びstatus。

status
ID and address: 0238b5ce1e19fe1fc9cf33a0f2e2e3c40125fd5d:124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899
Routing table:
predecessor:
 4870c55c89cfc253ac55ffa8c3992a3d2d65cbd7:i121-117-87-218.s05.a013.ap.plala.or.jp/121.117.87.218:3397
successor list: [
 4870c55c89cfc253ac55ffa8c3992a3d2d65cbd7:i121-117-87-218.s05.a013.ap.plala.or.jp/121.117.87.218:3397
 0238b5ce1e19fe1fc9cf33a0f2e2e3c40125fd5d:124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899
]
finger table: [
 1: 4870c55c89cfc253ac55ffa8c3992a3d2d65cbd7:i121-117-87-218.s05.a013.ap.plala.or.jp/121.117.87.218:3397
 160: 0238b5ce1e19fe1fc9cf33a0f2e2e3c40125fd5d:124x32x128x131.ap124.ftth.ucom.ne.jp/124.32.128.131:9899
]
Ready.
||
これは正しい。
が、、、、listenするポートは誤っている。
>|text|
netstat -nap|grep java
(一部のプロセスが識別されますが, 所有していないプロセスの情報は
表示されません。それら全てを見るにはルートになる必要があります.)
tcp6       0      0 127.0.1.1:3397          :::*                    LISTEN      25590/java      

挙動としては、単に

  • SelfAddressへbindしている
  • SelfAddressをsuccessorへ伝えている

という事のようだ。
UPnPで取得したグローバルIPは使われておらず、手動で指定する事も出来ない。

この問題を解決するにはSelfAddressではなくANYアドレスでbindを行い、SelfAddressはグローバルIPを指すものとすれば良いように思う。
UPnPが有る場合は手動でグローバルIPを指定するのではなく、UPnP経由でグローバルIPを取得する。
これはポートマッピングと共にDHT立ち上げ前に終わっているべき。

ってな訳で、Overlayweaverにまた手を加える必要がありそうだが、念のためにCVSからHEADを落として再度試してからにしようかな。