kikumotoのメモ帳

インフラ・ミドル周りを中心に、興味をもったことを適当な感じで。twitter : @takakiku

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!

と表示される。