Hatena::Grouperlang

weekend erlang programmer

ここの更新は止まってしまいました。面倒なので全部kuenishiの日記に書くことにしました。
 | 

{2009, 7, 12}

YATCE 0.7 リリース的な 21:09 はてなブックマーク - YATCE 0.7 リリース的な - weekend erlang programmer YATCE 0.7 リリース的な - weekend erlang programmer のブックマークコメント

先日のErlang分散システム勉強会でもちらっと口にしましたが、TCとErlangのバインディングを作っています。この手のバインディングはtcerlとかさんざんガイシュツなんですが、勢いで作り始めてしまいました。これまでのものとちょっと違うのは、これまでのはいわゆる普通のportとメッセージング(!のやつ)を使ったものが多いのですが、!を使うためコンテキスト切り替えとかメッセージングとかいろいろ余計なコストがかかっていたのですが、erlang:port_control/3という関数を使うことによってそういったものをすっ飛ばしていきなりCのコードを実効してしまうという素人にはオススメできない機能を素人の僕が使っていたりします。

特徴

  • port_controlを使っているので(多分)速い →グラフ1グラフ2
  • もちろんconcurrentな実装
  • OO-friendlyなインターフェースtokyocabinet.idlになんちゃって準拠)
  • いちどリンクするだけで複数ファイルを更新可能
  • 0.6まではとりあえずGPLだったが、id:VoluntasのアドバイスによりLGPLに。
    • リンクするだけで道連れというのは確かにきつい(私も社内で使いたくない)

現状

  • port_controlで動作するっぽいところを確認
  • tcadb系の大体のオペレーションをサポート
    • CRUD, tcadbsync, tcadbpath
  • CRUをかなり回してみたけどメモリが漏れていないことを確認
  • タプルとかリストのCRUDは未対応
  • コミッタ、絶賛募集中
  • Linux (Debian squeeze)のみ動作確認。Leopard/gcc4/R13B01だとBus Errorになるorz

今後

  • チューニング機能、というかパラメータ設定変更周りの実装
  • 実装予定のTC API
    • tcadbrnum, tcadbsize, tcadbvanish
    • ここまでできたら1.0リリースかな??
  • ちょっと面白そうなところ
    • tranbegin, trancommit, tranabort
    • mnesia:transaction/1っぽく作ってみたい(できるの?)
  • 自動テストが心配
    • もっと網羅したい
  • 中身

サンプルコードというか簡単な使い方のイメージ

  1. ダウンロード、展開 (`hg clone http://bitbucket.org/kuenishi/yatce`とか)
  2. 環境に合わせてMakefileを書き換える
  3. `make all`
  4. `make t` →テストが通れば使用可能
  5. ebin/tctest.erlを試しに実行してみるなど
  6. 自分のプログラムを書こう!
  ok = yatce:init([{libdir, "../c_src/libyatce.so"}]),
  T = yatce:newdb('/tmp/tablename.tch', []),
  Key = "somekey",
  Value = "somevalue",
  {ok, inserted} = T:put(Key, Value),
  {ok, Value} = T:get(Key),
  {ok, inserted} = T:put("key2", <<"keyhoge">>),
  {ok, closed} = T:close(),
  yatce:fini().

misc

おまけ

port_controlはerlang.orgのドキュメントにも「オススメできない」と書いてあります*1。もちろん根拠があって、ライブラリバグなどでこけたらUNIXプロセスごと道連れにして死んでしまうからです。つまりERTSの「ひとりが死んでも誰も道連れにされない」という哲学に反するわけです。悪い男です僕は。

*1:どこにあったか忘れたけど...

 |