- kazunori_279
- 2009
- 0
- 2
- 0
@kazunori_279 脈絡もなく #smalltable についてちょっと考えたんですが、MVCC使うと妥当な速度のVacuumかけるのが非常に難しそうですね
2009-12-29 23:04:43@ashigeru 例えばポインタ群をDatastoreに保存する想定だと、vacuumは参照されなくなったポインタをcronで削除する…って理解でいいですか? 参照カウントGCみたいなのを実装すればいいのかな?
2009-12-29 23:20:04@kazunori_279 です。参照カウント方式は循環に弱いのと、「誰も参照していない」というのをBigtableのスキャンでやるとけっこう大変だなーと思いました
2009-12-29 23:22:42Object Allocation Tableを作成して、reference+revisionを管理。各オブジェクトはref+revをキーとして、[(name, ref)]でプロパティを持つ。ついでに("this", ref)も持つ
2009-12-30 00:41:41(2) 新しく作成されたオブジェクトとプロパティが変更されたオブジェクトには、現在のトランザクションにアロケートされたrevが振られる
2009-12-30 00:59:39(3) サーバ上でローカルトランザクションを開始し、オブジェクトアロケートテーブルを取得する。変更、削除されたオブジェクトについて、それらのオブジェクトが現在のトランザクションで分離されたスナップショットとrevが異なる場合、並行性制御例外をスローする
2009-12-30 01:02:07(4) 3で取得したオブジェクトアロケートテーブルに、新しく作成したオブジェクトのref+revを追加。変更されたオブジェクトのrevを変更(refは固定)。削除されたオブジェクトのエントリを削除
2009-12-30 01:03:19あ、(2)ではオブジェクトをデータストアに追加する。このときのキーはrev+refなので、基本的に衝突しないはず
2009-12-30 01:05:29すべてのリビジョンのオブジェクトデータを参照系にして、オブジェクトアロケートテーブルでリビジョンを管理。オブジェクトアロケートテーブルのコミットに失敗するとごみが残る。
2009-12-30 01:06:32オブジェクトアロケートテーブル(OAT)の役割は、各オブジェクトのreferenceからrevisionを導出すること。それぞれのプロパティはreferenceを保持しているので、OATを利用してその時刻におけるオブジェクトのキーを計算できる
2009-12-30 01:10:08@kazunori_279 あのメモ(OAT)はオブジェクト単位でアトミック操作するタイプの設計です。A = {B, C} から A' = {B', C} と A'' = {B, C'} を作ったときに衝突検出できます。
2009-12-30 08:30:32@kazunori_279 場合によってはA = {B, C} から A' = {B', C} と A'' = {B'', C} のときだけ検出(SVN的)したほうがいいかもしれないので、その辺は用途次第でしょうか
2009-12-30 08:33:57