CloudStoreのJavaアクセスライブラリ
CloudStore には Java からもアクセスできるようになっている。
ライブラリのビルドは Ant を使って以下のようにすればよい。KFS_HOME は、CloudStore がインストールされているディレクトリ。
$ cd kfs-0.3 $ ant -Dlib.dir=$KFS_HOME/lib jar
成功すれば、build/kfs-0.3.jar ができあがる。
この jar にはテスト用のファイルも含まれているので、これで動作を確認できる。それは以下のような感じで実行する。
$ LD_LIBRARY_PATH=/home/kfs/cloudstore/lib:$LD_LIBRARY_PATH \ java -classpath kfs-0.3.jar org.kosmix.kosmosfs.access.KfsTest kfs0 20000
しかし、
Modification time for: jtest/foo.1 is: Fri Jun 26 13:32:52 JST 2009 Readdir returned: . .. foo.1 Readdirplus returned: name: . sz: 0 name: .. sz: 0 name: foo.1 sz: 2048 Trying to lookup blocks for file: jtest/foo.1 Block Locations: chunk 0 : 192.168.251.84 jtest/foo.1 still exists after rename!
と表示されて、失敗している感じ。しかし、kfsshell で見ても jtest/foo.1 は存在しない。
KfsTest.java の関連するコードは以下のようになっている。
String npath = new String(basedir + "/foo.2"); kfsAccess.kfs_rename(path, npath); if (kfsAccess.kfs_exists(path)) { System.out.println(path + " still exists after rename!"); System.exit(1); }
この kfs_exists の前に
KfsInputChannel ic = kfsAccess.kfs_open(path);
を実行すると、ic は null となる。これは正しい動作に見える。
どうも、CloudStore のクライアントライブラリ(KfsClient.cc)で、メタ情報をキャッシュしているような感じに見える。これはバグかも?
とりあえず kfs_exists のチェックをしないようにすれば、テストは成功して
Modification time for: jtest/foo.1 is: Wed Jul 08 13:43:31 JST 2009 Readdir returned: . .. foo.1 Readdirplus returned: name: . sz: 0 name: .. sz: 0 name: foo.1 sz: 2048 name: foo.2 sz: 2048 Trying to lookup blocks for file: jtest/foo.1 Block Locations: chunk 0 : 192.168.251.84 All done...Test passed!
と表示される。