チュートリアルで遊んでみよう。 (おまけ編)


前回のエントリーで書いたチュートリアルの最後の項目を
少しアレンジして、遊んでみましょう。 というエントリ。

DHT シェルの制御 (シナリオ) +α

まずは、いつもどうり"test-scenario"を以下のように書き換えます。
ネットワーク越しにシェルのコマンド利用できるように、ポート番号を指定したノードを2つ立ち上げる
というシンプルなシナリオにものになっています。

timeoffset 2000

# invokes the first node
class ow.tool.dhtshell.Main
arg -p 10000
schedule 0 invoke
timeoffset 1000

# invokes the second node
class ow.tool.dhtshell.Main
arg -p 10001
schedule 0 invoke
timeoffset 1000

# keeps the emulator running
schedule inf control all halt


なお、ここからはemu0・emu1それぞれにコマンドプロンプトからtelnetして操作しています。

emu0側

まず状態で"status"コマンドを一度叩いておくと、
今後より複雑なシナリオを書いた時にも、理解しやすいと思いますのでstatusコマンドを叩いておきます。

telnet localhost 10000

Ready.
status
ID and address: ac4d64e281e1ad8670db2c3123a842874c394f4d:emu0:3997
Routing table:
predecessor:
ac4d64e281e1ad8670db2c3123a842874c394f4d:emu0:3997
successor list: [
ac4d64e281e1ad8670db2c3123a842874c394f4d:emu0:3997
]
finger table: [
1: ac4d64e281e1ad8670db2c3123a842874c394f4d:emu0:3997
]

emu1側

emu1側でも同様に、statusコマンドを実行・確認しておきたいと思います。

telnet localhost 10001

Ready.
status
ID and address: 5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997
Routing table:
predecessor:
5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997
successor list: [
5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997
]
finger table: [
1: 5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997
]

続いてputし、その際の状態を確認するためにstatusコマンドをもう一度叩いておきます。

Ready.
put foo var

Ready.
status
ID and address: 5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997
Routing table:
predecessor:
5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997
successor list: [
5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997
]
finger table: [
1: 5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997
]
Last keys & routes:
number of messages: 0 -> 0
key[0]: 39fd82bfeab7f9442520e892023de1e681951eac
route[0] (length: 1): [
5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997 (0)
5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997 (245)
]
responsible node candidates[0]: [
5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997
]

get(status)もしておきましょうか。

Ready.
get foo
key: 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
value: var 10777

Ready.
status
ID and address: 5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997
Routing table:
predecessor:
5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997
successor list: [
5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997
]
finger table: [
1: 5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997
]
Last keys & routes:
number of messages: 0 -> 0
key[0]: 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
route[0] (length: 1): [
5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997 (0)
5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997 (3)
]
responsible node candidates[0]: [
5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997
]

emu0側

当然の結果になりますが、確認しておきましょう。

Ready.
get foo
key: 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
value:

emu1側

次に、emu1をemu0のオーバレイに参加させます。

Ready.
init emu0
contact: emu0:3997

emu0側

Ready.
get foo
key: 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
value: var 10050

Ready.
status
ID and address: ac4d64e281e1ad8670db2c3123a842874c394f4d:emu0:3997
Routing table:
predecessor:
5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997
successor list: [
5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997
ac4d64e281e1ad8670db2c3123a842874c394f4d:emu0:3997
]
finger table: [
1: 5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997
]
Last keys & routes:
number of messages: 2 -> 2
key[0]: 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
route[0] (length: 1): [
ac4d64e281e1ad8670db2c3123a842874c394f4d:emu0:3997 (0)
5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997 (1)
]
responsible node candidates[0]: [
5de550ebe439e30918a0d11c6173aa0a7df6afff:emu1:3997
ac4d64e281e1ad8670db2c3123a842874c394f4d:emu0:3997
]

という感じに。
ノードは2つですし、チュートリアルと比べてもかなり単純なものですけが理解しやすいと思います。
put・getなど何かのコマンドを実行した後にstatusコマンドを実行するとその際に使用したルーティングなどを確認することができます。
でも、これも数が増えてくると"日本語でおk"と言いたくなります…。(^_^;)
というか、(私自身)ルーティング辺りがしっかり理解できていないのもあるのでしょうが、今回のように単純化して考えないと理解できません…。orz


おわりに

私の環境特性のものなのかもしれませんが、エミュレータを起動して停止しても
停止したはずのノードに対してtelnetで接続することが出来ていました。
バクなのか仕様なのかはかわりませんけど、シナリオ書き換えたりもう一度やり直したい際は
一度Eclipseを再起動する必要があります。シナリオを書き換えて再度実行したのに、前回と同じ結果…? アレ…?とならないように気をつけてください。
でも、それ以外ではとっても手軽に、そしてなによりなんとなく"使えてるよ!!"って気分になれますので便利ですよね。w