テストステ論

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

(akashic report) バックエンドの抽象化をしました

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

の実装を完了しました. akashic-storageのバックエンドとして必要なミニマムなAPIセットを定義することによって, akashic-storage本体のコードもきれいになる意味もあります.

trait FileSystemLike {
  def getRoot: Node
  def isDirectory(n: Node): Boolean
  def moveNode(n: Node, dir: Node, name: String, replaceIfExists: Boolean)
  def removeNode(n: Node)
  def makeDirectory(dir: Node, name: String): Unit
  def lookup(dir: Node, name: String): Option[Node]
  def listDirectory(n: Node): Iterable[(String, Node)]
  def createFile(dir: Node, name: String, data: Stream[Option[Array[Byte]]]): Unit
  def getFileInputStream(n: Node): InputStream
  def getFileAttr(n: Node): FileAttr

Nodeというのは, Objectのエイリアスです. 「どんなものでもいいので, 一意なものをください」という意味です. この抽象のLocalファイルシステムの実装は,

class Local(mountpoint: Path) extends FileSystemLike {
  implicit def convertImplicitly(n: Node): Path = n.asInstanceOf[Path]

というimplicit変換を定義して, 内部的に実装を簡単にしています. (FileSystemLikeに対する検査はのちのち提供します)

Localファイルシステムにとって, NodeはPathです. 他のものにとってはStringかも知れませんし, そのストレージに応じたcase classかも知れません. とにかく, 「ストレージの静的な状態において一意であること」が要件です.

FileAttrはシンプルです. akashic-storageにとって必要な情報はほとんどありません.

case class FileAttr(creationTime: Long, length: Long, uniqueKey: Option[String])

uniqueKeyはメタデータキャッシングのために使われます. Noneとすればキャッシングをしないだけです. このキーについても要件は, 「静的な状態において一意である」なので, 大抵の場合はNodeをそのまま返せばよいでしょう. (というかそれに決め打ちしても良いのかも知れない説がある)

このようにバックエンドを抽象化することで, さまざまなストレージがakashic-storageと直接に会話することが可能となります. また, このFileSystemLikeをakashic-storage自身で実装することも可能なので, akashic-storageのbackendはakashic-storageであるという構成も理論上は可能となります.

また, これはもっと重要なことなのですが, FileSystemLikeのプロキシクラスを実装して, 他言語の実装とIPC通信するという実装も可能となります. 具体的にはGoとC++をターゲットと見ています.

まだまだやることは山程あります. コードは, 本体だけならば3585行だそうです. (その他が2000行くらい) akashic-storageに関わりたい人は, 今のうちにまずコードをざっくり読んでみることをオススメします. 実際には1000行も読まずして全体の設計は理解出来るでしょう.

    3585 total

github.com