読者です 読者をやめる 読者になる 読者になる

テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

(akashic-report) ローカルファイルシステムと疎結合にする計画

loose coupling with the mounted filesystem · Issue #46 · akiradeveloper/akashic-storage · GitHub

今しがた調査をしていました.

akashic-storageは現在, ローカルファイルシステム上でmountpointを確保して, そこに対してIOすることでS3を表現しますが, より柔軟に, ローカルファイルシステムやマウントされた分散ファイルシステム以外をもbackendとするためには, それを抽象化するという方法があります. マウント出来ることを条件にしてしまうと, fuseganeshaのようなソフトウェアを挟む必要があり, directにbackendと会話をすることが出来なくなるからです.

VFSのようなものを定義します. java.nio.FileSystemというものが標準にはありますが, これはPathに依存しているため使いにくい意味があります. Path自体は抽象なので出来ないこともないと思いますが, 実装が複雑になると思います. また, 性能的にも最善を目指せません. backendとdirectな会話をすることの主な目的なパフォーマンスなので, これは大きな損失となります. あとScalaishでないことも糞です.

他にもちらほらとFileSystemのような抽象を定義したものがオープンソースには存在しますが, どれもakashic-storageにとってベストとは言いがたいです. もともと, akashic-storageは, このような抽象層を定義してオープンソースやベンダーの分散ファイルシステムに使わせる, つまりganeshaのようになることを目指しているため, ミニマムの操作で実現出来るように設計されています.

私が今検討した結果は, 以下のような抽象で十分というものです.

case class Attr(creationDate: Date, length: Long)
trait FileSystemLike {
  type Node
  def getRoot: Node
  def makeDir(Node, name)
  def remove(Node)
  def create(Node, name, Array[Byte]): Node
  def listDir(Node): [Node]
  def getInputStream: InputStream
  def getSource: Source[ByteString, Future[Long]] =
     StreamConverters.fromInputStream(getInputStream, chunkSize)
  getAttr(Node): Attr
}
// example
class Local extends FileSystemLike {
  type Node = Path
  def getRoot: Node
  ...
}

これが出来ると, わりと速攻でインメモリS3が実現出来ます. これが実用上何の意味を持つかは不明ですが, テスト用途だとか, はたまた私が想像もしないような使い方だとか, 可能性は買えます. FileSystemLikeは, QuickCheckでテスト出来ます. (つまり, ベンダーが実装したFileSystemLikeはその正しさを自動的に検証出来ます)

akashic-storageは面白いプロジェクトになります. 今のうちにstarしておきましょう.

github.com