Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

自習メモ〜分散プログラミング(リモートノードへのモジュールロード)

公開されているpdfをやってみるシリーズ(?)の分散プログラミング。
「とあるノードにあるモジュールをリモートノードへロードする」を確認しました。環境は前のエントリの通り、WindowsXP-CentOSの組み合わせです。
まずはそれぞれの分散ノードを起動し、net_adm:ping/1による疎通確認。手順は省略(^^;
続いて片側にしかないモジュールのバイナリコードをcode:get_object_code/1で読み込み。

(shimooka@win.xxx.yyy)3> {Module, Binary, Filename} = code:get_object_code(sample).
{sample,<<70,79,82,49,0,0,1,216,66,69,65,77,65,116,111,109,0,0,0,68,0,0,0,7,6,
          115,97,...>>,
        "d:/home/shimooka/erlang/sample.beam"}
(shimooka@win.xxx.yyy)4>

この時点でCentOS側にはまだモジュールはロードされてませんので、m(sample)で確認するとエラーになるはずです。

(root@centos.xxx.yyy)2> m(sample).

=ERROR REPORT==== 27-May-2007::17:50:36 ===
Error in process <0.77.0> on node 'root@centos.xxx.yyy' with exit value: {undef,[{sample,module_info,[]},{c,m,1},{erl_eval,do_apply,5},{shell,exprs,6},{shell,eval_loop,3}]}

** exited: {undef,[{sample,module_info,[]},
                   {c,m,1},
                   {erl_eval,do_apply,5},
                   {shell,exprs,6},
                   {shell,eval_loop,3}]} **
(root@centos.xxx.yyy)3>

予定通りのエラー。ここで、rpc:call/4を使ってWindows側からCentOS側へモジュールをロードさせてみます。RPC経由でcode:load_binary/3をコールすることになるようです。

(shimooka@win.xxx.yyy)3> rpc:call('root@centos.xxx.yyy', code, load_binary, [Module, Filename, Binary]).
{module,sample}
(shimooka@win.xxx.yyy)4>

再度、CentOS側でm(sample)してみます。

(root@centos.xxx.yyy)4> m(sample).
Module sample compiled: Date: May 27 2007, Time: 08.44
Compiler options:  []
Object file: d:/home/shimooka/erlang/sample.beam
Exports:
         hello_world/0
         module_info/0
         module_info/1
ok
(root@centos.xxx.yyy)5> sample:hello_world().
Hello, World!
ok
(root@centos.xxx.yyy)6>

おお!うまくいきました。なんか気持ち悪い感じもしなくもないですが、なんかすごい :-)
しかし、code:get_object_code/1で返ってくるタプルの順番とcode:load_binary/3のリストで指定する順番が微妙に違うのが気になる。。。