erlang

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…

Skip Graph concurrent JOIN テスト中

実装してみたところ1つ想定していなかったケースがに遭遇。多分バグ。 上位レベルに存在する key が下位レベルに存在しない。 これだけなら insert の途中と推測されるんだけどいくら待っても表れない

global:set_lock の Nodes に [] を指定するのは間違い

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({…

Erlang の global モジュール

こんなのがさらっと提供されている事が分散に強い言語ってことだよな。 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…

Skip Graph の Concurrent Join をしつこく考える

Erlang の global:set_lock で複数ノードを一括してロックできる事が分かったので考え直した。 一晩寝かせよう。

分散環境で使えそうな Lock-Free linked list を探している

いくつか論文を読んで見た。欲しいのは双方向リンクリスト。 Lock-Free Linked Lists Using Compare-and Swap 単方向リンクリスト A pragmatic implementation of non-blocking linked-lists 単方向リンクリスト deleted markd "Two-Handed Emulation: How t…

distributed doubly linked list のアルゴリズムに使えそうなものを探している

Two-Handed Emulation: How to build non-blocking implementations of complex data-structures using DCAS を読んだ。uid の保持にグローバルな何かが必要なので P2P では使えないそう。

場合分けしてみた - Skip Graph の concurrent JOIN を考える - その4

id:kibayos さんの PDF「構造化オーバレイの一貫性保証」 に書かれている Skip Graph の一貫性保証の例を読み解く。 http://live-e.naist.jp/sensor_overlay/3/doc/yoshida.pdf その3の続き。 Concurrent Join のアルゴリズムをカジュアルにフォーマライズし…

Skip Graph の concurrent JOIN を考える - その3

id:kibayos さんの PDF「構造化オーバレイの一貫性保証」 に書かれている Skip Graph の一貫性保証の例を読み解く。 http://live-e.naist.jp/sensor_overlay/3/doc/yoshida.pdf その2の続き。双方向リンクリストに conncurrent Join / Remove する話。 続い…

Skip Graph の concurrent JOIN を考える - その2

id:kibayos さんの PDF「構造化オーバレイの一貫性保証」 に書かれている Skip Graph の一貫性保証の例を読み解く。 http://live-e.naist.jp/sensor_overlay/3/doc/yoshida.pdf その1の続き。双方向リンクリストに conncurrent Join / Remove する話。 その1…

Skip Graph の concurrent JOIN を考える - その1

id:kibayos さんの PDF「構造化オーバレイの一貫性保証」 に書かれている Skip Graph の一貫性保証の例を読み解く。 http://live-e.naist.jp/sensor_overlay/3/doc/yoshida.pdf (PDF) 探索処理は任意のタイミングで実行可能 資料 P14 。 Join は下位レベル…

coverage 99% になった

gen_server callbacks の terminate と code_change が残りの 1% 。

Skip Graphs の concurrent join の論文募集

ないかなあ。オリジナルの論文では link_op 時に隣のノードを見比べて link_op 転送としか書いてない。 複数のレベルで一貫性を保つのは難しい気がする。 追記 kota abe on Twitter: "まさに今この問題ではまっている気が RT @shudo: RT @higepon: 日記ed Sk…

Erlang における equal 演算子

覚えられない。 == 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

Erlang Skip Graph デバッグ中

Skip Graph へ (key value) を並列 insert をしたときに gen_server がデッドロックする問題に悩まされる。 insert は handle_call 経由で insert_op_call が担当する。insert 自体は自分自身のデータを変更(左右のノードの更新とか)が発生する。つまり St…

Erlang gen_server の call/reply ベストプラクティス

Erlang Forum - Trap Exit ~ View topic - gen_server call and replyのメーリングリストで、多くのレスポンスをさばけるように gen_server がなるべくブロックしない方法について書かれている。 要約すると レスポンスを返す処理が必要な情報を渡しつつ spa…

Skip Graph デバッグ中

insert_op において構築中に、各レベルにおける左右のノードが矛盾した状態になる。その状態が公開されてしまっているため、gen_server:call の循環が発生しデッドロック。 原因も対処方法も分かったが、Erlang 的にどうやって実装しようか。

Erlang におけるパフォーマンスチューニング

自分は結果として、プロファイラより Erlang:now() を使う方がボトルネックを見つけるのが速かった。

続:VirtualBox を利用してローカルにErlang 分散テスト環境を構築する

VirtualBox を利用してローカルにErlang 分散テスト環境を構築するの続き。 先日紹介したデモ環境のように VirtualBox で Host-only I/F を利用している場合に注意すべき事がある。 Host が完全にオフラインだと、Host-only I/F を利用している Guest が起動…

Erlang 付属プロファイラ fprof の出力結果の見方

参照 Erlang の公式マニュアル。fprof 手短なコツ プロファイラ結果を上から見ていき、ACC が大きいものをたどっていく。 % がついたマーク付きの関数に注目して、calling, called 関数の ACC を見比べていき、時間を消費している関数を特定する。 Emacs な…

Erlang のビルドが jinterface 周りでエラーになるときは

./configure で jinterface をオフには出来ないので java とか javac をリネームしておいて ./configure し直すと良い。 apt-get remove gcj でも可(使っていなければ) あれ? disable-jinterface あるのか?

VirtualBox を利用してローカルにErlang 分散テスト環境を構築する

背景 Erlang の分散ノードのデモや、テストをしたい。デモをする環境によってはネットワークにつながらない場合もあるので、すべてローカルで完結させたい。 というような環境を作ります。 環境 VirtualBox ホスト: Mac OSX ゲスト: Ubuntu 9.04 AMD64 手順 …

Erlang fprof でサーバーアプリのプロファイルをとる方法

Profiling a Running Erlang Server « Alexey’s Random Notesが参考になる。 計測したい対象がサーバープロセス(gen_server など)の場合は以下のようにすればうまくいく。 fprof:trace([start, {procs, [Pid]}]), で開始。開始時にプロセスを指定する。 リ…

Erlang の -name オプションで渡す名前は FQDN

Erlang の -name オプションで -name hige@`hostname` と起動スクリプトを書いていた。 OSX では hostname => darami.local と Ubuntu では hostname => suneo が返っていて、片方で動かなくてハマった。

Erlang アプリケーションをコマンドラインで起動し、その後停止する方法

どこを探しても情報が見つからなかったので、試行錯誤して以下のようにしました。 もっと良い方法があったらぜひ教えてください。 起動 behaviour application に準拠したアプリケーション(hige_app)をコマンドラインから起動するには % erl -noshell -noinp…

Erlang の crypto:start が失敗するときは

{undef,[{crypto,start,[]}のように crypto:start が失敗するときは % sudo apt-get install openssl libssl-dev してから、Erlang を ./configure からやり直すと良い。

Erlang でありがちなミスをしてしまった

self() は spawn の外でやらないとね。 spawn(fun() -> hoge(self()) end)), receive {ok, Result} -> Result end.

Erlang Common Test の Code Coverage Analysis 便利!

使い方は簡単。coverspec ファイルを書く。(マニュアル→Code Coverage Analysis)。 {level, details}. {incl_mods, [mio_node, mio_app, mio_sup, mio_memcached]}. テスト実行時の run_test に -cover coverspec ファイル名を渡すだけ。 出力 timeout の…

erl -sname hoge とした場合の hostname

erl -sname hoge とした場合、ホスト名を合わせて hoge@localhost で rpc:call のキーとなる。 @ 以下は hostname なのだが必ずしも localhost にはならないようだ。OS や設定によるらしい。 hostname を強制したい場合は -sname hoge@localhost と起動時に…

Erlang OTP でアプリケーションの start/stop をどうするか?

Erlang OTP アプリケーションをターミナルで起動する。それをどうやって停止するか。 起動自体は erl -noshell -noinput -pa ebin mio -s mio_app start & のように mio_app:start => application:start(mio) という流れ。 rpc:call で application:stop を…