Erlang で変数を shadow するとひどい目に遭う
send しているのに receive でブロックするの原因は変数の shadow が原因だった。
handle_call({search, ReturnToMe, Key}, _From, State) ->
上の handle_call の Key と下の receive の Key がかぶっているので別のノードから返ってきた Key が Key にマッチするわけもなくブロック。
receive {ok, Key, Value} -> ?L(), {reply, {ok, Key, Value}, State};
そもそもの間違いは、どこかからかパクってきた Makefile のオプションで
+nowarn_shadow_vars
と指定していた事。 nowarn_shadow_vars はつけない方が良いという教訓を得た。
追記
よく考えると shadow ではないな。こういう状態は、意図的に発生する事もあるなあ。