リポジトリ
リポジトリとは何か、置き場に何が求められるか、何をホストに任せるか。
リポジトリは、置き場の 1 つのプレフィックスの下にあるもの全部です。S3・R2・ほかの S3 互換ストレージの s3://bucket/lake/ か、ディスク上のフォルダです。サーバー上の Git の bare リポジトリにあたります。索引ファイルも、リポジトリを持つプロセスもありません。読み手も書き手も、仕様の決まりに従って同じファイルを扱います。
置き場に求めること
| 操作 | 使う人 | 用途 |
|---|---|---|
| オブジェクトを読む | 読み手と書き手 | ref、version.json、カタログ、データファイル |
| オブジェクトを書く | 書き手 | データファイル、カタログ、version.json |
| 条件付きで書く | 書き手 | ref: 無いときだけ作る、変わっていないときだけ置き換える |
| プレフィックスの一覧を取る | 保守 | どのバージョンも参照していないデータファイルを探す |
| 消す | 保守 | 保持期間を過ぎたバージョンのカタログと、使われていないデータファイル |
2 人の書き手を安全にするのが条件付き書き込みです。ref は If-None-Match: * で作り、If-Match: <読んだときの ETag> で動かします。その間にほかの人が動かしていれば、置き場は書き込みを断り、何も変わりません。S3 と R2 はこれに対応しています。フォルダの置き場はロックを取らずに条件を確かめるので、書き手が 1 人のときに使ってください(置き場を参照)。条件付き書き込みのない置き場からは読めますが、push してはいけません。最後に書いた人が、ほかの人のバージョンを黙って置き換えてしまいます。
読み手は読むだけです。リポジトリの前に静的な HTTP サーバーを置けば足ります。
リポジトリの中身
<root>/
fdl.json 設定: 形式のバージョン、ID、データファイルの場所
HEAD 既定のブランチ
refs/heads/<name> ブランチ
refs/tags/<name> タグ
versions/<ID>/ バージョンごとのフォルダ
data/ Parquet ファイル。全バージョンで共有
sources/<sha256> バージョンを作った元のファイル(任意)
リポジトリには、バージョンのフォルダの外にカタログを置きません。作業カタログも置きません。どちらも、公開していない状態を読み手に渡してしまいます。
fdl.json には id があります。fdl init が一度だけ書く UUID です。ほかのホストに置いた写しも同じ id を持つので、2 つの URL が同じリポジトリだと分かります。リポジトリを預かるサービスは、自分のデータセットの ID をここに書いてもかまいません。
FDL がホストに任せること
FDL が決めるのはファイルのことです。誰が読めるか、誰が main を動かせるか、URL がどんな形かは決めません。それはリポジトリを預かる側が決めます。
- 権限。1 つのリポジトリの中身は、すべて同じ人が読めます。データセットの一部だけを公開するときは、リポジトリを 2 つに分けます(公開と非公開を参照)
- 承認。ホストは書き手に ref を動かさせず、確認したあとで自分で動かしてもかまいません(ホストを作るを参照)
- 認証、URL の形、バージョンを残す期間
形式の中に、ホストやサービスの名前は出てきません。リポジトリは、ファイルを写せば別のホストへ移せます。