p2pncs の分散ファイルシステム部をオンメモリDB (System.Collections.Generic.Dictionary)から SQLite に移行しようといろいろ調査中。
Mono.Data.SQLite を利用するとトランザクションの IsolationLevel には ReadCommitted と Serializable が利用可能でそれぞれ SQLite の Deferred と Immediate に相当する。
んで、Serializableなトランザクションは同時に複数実行することは出来なくて、ReadCommitted複数とSerializableは同時実行可能という感じ。
また、ReadCommittedを複数走らせ、その中で書き込み系のSQLを実行すると、
最初に書き込み系SQLが実行されたトランザクションがデータベースをロックしてしまい、
他のトランザクションの書き込み系SQLはブロックされる。
直感的には、最初に書き込み系SQLが実行されたトランザクションではCommitが成功すると思ってしまうが、
SQLiteではなぜかCommitもブロックしてしまい、
結果として全てのトランザクションがタイムアウトで失敗する。
とりあえずは書き込み時はSerializableを使って読み込み時はReadCommittedを使えば大丈夫かな?
あづい・・・今日の最高気温は30℃らしいです・・・
今週は全然p2pncsの開発が進まなかったなぁ・・・
SECG (The Standards for Efficient Cryptography Group)がまとめている、
楕円曲線暗号の規格であるSEC1がバージョン2になっていた。
ぱっと見た感じ、以下の点が変更されている感じ?
ま、改良内容は順当なところですかね。
そのうち、openCrypto.NETの楕円曲線暗号系もSEC1v2対応にする予定
土日はずーーーーーーーーっと寝てました! orz
ダメ人間ですね。
とりあえず、MonoのReaderWriterLockSlimのバグは無事にコミットされたようなので、Mono 2.4.2 p2には反映されそうかなぁ。
転がってたIntel iMacにGentooを入れて運用していたんですが、
今日、xfce 4.6.1に更新した後、どーせだから再起動しちゃえー と軽い気持ちで reboot
と実行したら、起動しなくなりました orz
(サーバなのにXかよ…と思うかもしれませんが、時計とか時刻表も兼ねているのでXが入っているんですよね)
しかも、再起動する前にMonoのパッチを書いていたため、取り出せない&追試が出来ないという状況に…
なんか起動するときにεεεεεεεεεεεεεεεεεεεって、イプシロンが画面いっぱいに出力される。
なんか昔のliloを思い出す (謎
もう、いろいろ嫌になってきたので、放置して今日は帰る!
EnterUpgradeableReadLockに入った後、EnterWriteLock/ExitWriteLockを実行し、ExitUpgradeableReadLockで抜けた後に、EnterWriteLockを実行するとデッドロックするというバグを見つけました。たぶん直るであろうパッチはこんな感じ。
ReaderWriterLockSlim.cs.patch, ReaderWriterLockSlimTest.cs.patch
いやぁ…今作っているDHTを使ったP2Pアプリの開発中に見つけたんですがね、
問題があることに気がついたのが、21時。どういうタイミングで再現するのか探すのに1時間。
自分のコードに問題があると考え、トレースすること1時間。
なんか記憶が飛んだ1時間。
原因箇所を特定するのに1時間、そしてMonoのReaderWriterLockSlimにバグがあることがわかりました…
くそー、原因を探すのに3時間もかかったぜー orz
でも、このパッチが合っているかどうかわからないけど、後は丸投げしちゃえっ
SubVersionからGitに移行するかも
というエントリで書いてたんだけど、WindowsにおけるGitはなんだか難しい・・・
C#プロジェクトをリポジトリに入れているわけだけど、*.csの改行コードはOSネイティブに、
*.sln, *.csprojはCR+LFのまま維持ということを実現したい。
だけど、cloneした瞬間にすべてのファイルがmodifiedとマークされちゃったりとか、
どういうタイミングかはわからないけど、改行コードが意図するとおり自動変換されるんだけど、
*.sln; *.csproj だけmodifiedとマークされちゃったりとか・・・
あまりツールの移行に時間をかけるわけにはいかないので、今回は見送りっと・・・
btrfsとかnilfs2とかで遊んでみた。btrfsはパフォーマンスの面でまだまだだけど、NILFS2は良い感じ。
簡単に2GBのファイルシステムを作って、GentooPortageを解凍するのにかかった時間とファイルを全部削除するのにかかった時間を計ってみた。
VirtualBoxを使ったテスト環境で、しかも仮想ディスクはUSB-HDDに保存しているという特殊な環境なので、
ここでの結果は全然正確じゃありませんので、参考程度に。
| ファイルシステム名 | mkfsオプション | mountオプション | 利用サイズ | 展開時間 | 削除時間 |
| ext3 | default | default | - | error | - |
| ext4 | default | default | - | error | - |
| xfs | default | default | 658MB | 60.211 | 10.579 |
| xfs | -b size=512 | default | 246MB | 24.732 | 9.602 |
| reiserfs | default | default | 248MB | 41.176 | 5.940 |
| reiserfs | -b 512 | nolog | 217MB | 31.521 | 35.751 |
| NILFS2 | default | default | 744MB | 20.607 | 65.551 |
| NILFS2 | -b 1024 | default | 290MB | 18.659 | 63.110 |
| btrfs | default | default | 309MB | 126.619 | 11.598 |
ext3・ext4では空き容量が足りませんって言われて、そもそも解凍できないのにびっくり。
エラー時には2GB中300MBしか使っていないことになっているのに・・・
もう少しファイルシステムのサイズを増やせば正常に解凍できるかもしれないけどね・・・
ReiserFSはblocksizeが小さいときはnologを付けないとファイルの削除にかかる時間が半端無い・・・
Beta.99とか初めてじゃね? beta.4の次はRCって聞いてたんだけど Preview とか見えるし。
リリースのページを見るとPreviewはRCの前って感じか
P2P (DHT+匿名通信) を使ったアプリケーションを開発中で、
先日、知人間で接続テストを行ったのですが、そのときの問題点。
DHTには他のエンドポイントの情報が格納されているんだけど、そのエンドポイントがたまたま自分自身だった場合、そこへパケットを送信することが出来ない。また自分自身のパブリックIPを取得するのは他ノードに教えてもらうぐらいしか確実な方法がないが、他ノードが嘘をつかないとも限らない。うーん・・・
設定が出来ていないノードがDHTに問い合わせを行った場合、相手の設定が出来ていると問い合わせの応答を受け取ることが出来る。また、イテレーティブなDHTを採用しているためそれ以降の通信も問題なく行える。だけど、他のノードがそのノードへのルーティング情報を他のノードから受け取り、そのノードへ問い合わせを行っても、パケットは到達しない。なので、きちんと設定が出来ていないということを検出するのは少しめんどくさいね。というお話。
SubVersionとの付き合いもそろそろ5年ぐらいになるけど、
最近リモートサーバにコミットしないと編集履歴が残らないのが結構きついので、
今現在僕がアクティブに開発しているプロジェクトからGitに移行しようかなぁと検討中。
もちろんSubVersionはこのまま残しますがね。
ただ、Windowsでコマンドラインはきついので、TortoiseGitを使おうと思っているのですが
今のリリースバージョンだとSSHにポート番号を指定すると接続できないという不具合が・・・
つい先日修正されたのですが、まだバイナリが出ていないし自分でビルドするのもたるいので、
バイナリ待ち・・・