erlang
プログラミング Erlang の通りに dev_log.config を作る。(開発用のログなのですべてを記録する) [{sasl, [ {sasl_error_logger, false}, {errlog_type, all}, {error_logger_mf_dir, "./log"}, {error_logger_mf_maxbytes, 10485760}, %% 10MB {error_log…
実装してみたところ1つ想定していなかったケースがに遭遇。多分バグ。 上位レベルに存在する key が下位レベルに存在しない。 これだけなら insert の途中と推測されるんだけどいくら待っても表れない
Sets a lock on the specified nodes (or on all nodes if none are specified) on ResourceId for LockRequesterId.と書いてあるので set_lock の Nodes に [] を指定したら常に true が返ってきて困った。 global モジュールのコードを読んだが set_lock({…
こんなのがさらっと提供されている事が分散に強い言語ってことだよな。 The ability to globally register names is a central concept in the programming of distributed Erlang systems. In this module, the equivalent of the register/2 and whereis/1…
Erlang の global:set_lock で複数ノードを一括してロックできる事が分かったので考え直した。 一晩寝かせよう。
いくつか論文を読んで見た。欲しいのは双方向リンクリスト。 Lock-Free Linked Lists Using Compare-and Swap 単方向リンクリスト A pragmatic implementation of non-blocking linked-lists 単方向リンクリスト deleted markd "Two-Handed Emulation: How t…
Two-Handed Emulation: How to build non-blocking implementations of complex data-structures using DCAS を読んだ。uid の保持にグローバルな何かが必要なので P2P では使えないそう。
id:kibayos さんの PDF「構造化オーバレイの一貫性保証」 に書かれている Skip Graph の一貫性保証の例を読み解く。 http://live-e.naist.jp/sensor_overlay/3/doc/yoshida.pdf その3の続き。 Concurrent Join のアルゴリズムをカジュアルにフォーマライズし…
id:kibayos さんの PDF「構造化オーバレイの一貫性保証」 に書かれている Skip Graph の一貫性保証の例を読み解く。 http://live-e.naist.jp/sensor_overlay/3/doc/yoshida.pdf その2の続き。双方向リンクリストに conncurrent Join / Remove する話。 続い…
id:kibayos さんの PDF「構造化オーバレイの一貫性保証」 に書かれている Skip Graph の一貫性保証の例を読み解く。 http://live-e.naist.jp/sensor_overlay/3/doc/yoshida.pdf その1の続き。双方向リンクリストに conncurrent Join / Remove する話。 その1…
id:kibayos さんの PDF「構造化オーバレイの一貫性保証」 に書かれている Skip Graph の一貫性保証の例を読み解く。 http://live-e.naist.jp/sensor_overlay/3/doc/yoshida.pdf (PDF) 探索処理は任意のタイミングで実行可能 資料 P14 。 Join は下位レベル…
gen_server callbacks の terminate と code_change が残りの 1% 。
ないかなあ。オリジナルの論文では link_op 時に隣のノードを見比べて link_op 転送としか書いてない。 複数のレベルで一貫性を保つのは難しい気がする。 追記 kota abe on Twitter: "まさに今この問題ではまっている気が RT @shudo: RT @higepon: 日記ed Sk…
覚えられない。 == equal to /= not equal to = less than or equal to less than >= greater than or equal to > greater than =:= exactly equal to =/= exactly not equal to
Skip Graph へ (key value) を並列 insert をしたときに gen_server がデッドロックする問題に悩まされる。 insert は handle_call 経由で insert_op_call が担当する。insert 自体は自分自身のデータを変更(左右のノードの更新とか)が発生する。つまり St…
Erlang Forum - Trap Exit ~ View topic - gen_server call and replyのメーリングリストで、多くのレスポンスをさばけるように gen_server がなるべくブロックしない方法について書かれている。 要約すると レスポンスを返す処理が必要な情報を渡しつつ spa…
insert_op において構築中に、各レベルにおける左右のノードが矛盾した状態になる。その状態が公開されてしまっているため、gen_server:call の循環が発生しデッドロック。 原因も対処方法も分かったが、Erlang 的にどうやって実装しようか。
自分は結果として、プロファイラより Erlang:now() を使う方がボトルネックを見つけるのが速かった。
VirtualBox を利用してローカルにErlang 分散テスト環境を構築するの続き。 先日紹介したデモ環境のように VirtualBox で Host-only I/F を利用している場合に注意すべき事がある。 Host が完全にオフラインだと、Host-only I/F を利用している Guest が起動…
参照 Erlang の公式マニュアル。fprof 手短なコツ プロファイラ結果を上から見ていき、ACC が大きいものをたどっていく。 % がついたマーク付きの関数に注目して、calling, called 関数の ACC を見比べていき、時間を消費している関数を特定する。 Emacs な…
./configure で jinterface をオフには出来ないので java とか javac をリネームしておいて ./configure し直すと良い。 apt-get remove gcj でも可(使っていなければ) あれ? disable-jinterface あるのか?
背景 Erlang の分散ノードのデモや、テストをしたい。デモをする環境によってはネットワークにつながらない場合もあるので、すべてローカルで完結させたい。 というような環境を作ります。 環境 VirtualBox ホスト: Mac OSX ゲスト: Ubuntu 9.04 AMD64 手順 …
Profiling a Running Erlang Server « Alexey’s Random Notesが参考になる。 計測したい対象がサーバープロセス(gen_server など)の場合は以下のようにすればうまくいく。 fprof:trace([start, {procs, [Pid]}]), で開始。開始時にプロセスを指定する。 リ…
Erlang の -name オプションで -name hige@`hostname` と起動スクリプトを書いていた。 OSX では hostname => darami.local と Ubuntu では hostname => suneo が返っていて、片方で動かなくてハマった。
どこを探しても情報が見つからなかったので、試行錯誤して以下のようにしました。 もっと良い方法があったらぜひ教えてください。 起動 behaviour application に準拠したアプリケーション(hige_app)をコマンドラインから起動するには % erl -noshell -noinp…
{undef,[{crypto,start,[]}のように crypto:start が失敗するときは % sudo apt-get install openssl libssl-dev してから、Erlang を ./configure からやり直すと良い。
self() は spawn の外でやらないとね。 spawn(fun() -> hoge(self()) end)), receive {ok, Result} -> Result end.
使い方は簡単。coverspec ファイルを書く。(マニュアル→Code Coverage Analysis)。 {level, details}. {incl_mods, [mio_node, mio_app, mio_sup, mio_memcached]}. テスト実行時の run_test に -cover coverspec ファイル名を渡すだけ。 出力 timeout の…
erl -sname hoge とした場合、ホスト名を合わせて hoge@localhost で rpc:call のキーとなる。 @ 以下は hostname なのだが必ずしも localhost にはならないようだ。OS や設定によるらしい。 hostname を強制したい場合は -sname hoge@localhost と起動時に…
Erlang OTP アプリケーションをターミナルで起動する。それをどうやって停止するか。 起動自体は erl -noshell -noinput -pa ebin mio -s mio_app start & のように mio_app:start => application:start(mio) という流れ。 rpc:call で application:stop を…