オブジェクトグラフのDatastore保存について

0
Suguru ARAKAWA @ashigeru

@kazunori_279 脈絡もなく #smalltable についてちょっと考えたんですが、MVCC使うと妥当な速度のVacuumかけるのが非常に難しそうですね

2009-12-29 23:04:43
Kazunori Sato @kazunori_279

@ashigeru 例えばポインタ群をDatastoreに保存する想定だと、vacuumは参照されなくなったポインタをcronで削除する…って理解でいいですか? 参照カウントGCみたいなのを実装すればいいのかな?

2009-12-29 23:20:04
Suguru ARAKAWA @ashigeru

@kazunori_279 です。参照カウント方式は循環に弱いのと、「誰も参照していない」というのをBigtableのスキャンでやるとけっこう大変だなーと思いました

2009-12-29 23:22:42
Kazunori Sato @kazunori_279

@ashigeru まあ富豪的に「消さない」ってのもあるかなw

2009-12-29 23:28:48
Suguru ARAKAWA @ashigeru

Object Allocation Tableを作成して、reference+revisionを管理。各オブジェクトはref+revをキーとして、[(name, ref)]でプロパティを持つ。ついでに("this", ref)も持つ

2009-12-30 00:41:41
Suguru ARAKAWA @ashigeru

トランザクションを発行すると、新しいrevがアロケートされてクライアントに返される

2009-12-30 00:56:08
Suguru ARAKAWA @ashigeru

オブジェクトグラフを変更してコミットすると次のことが起こる:

2009-12-30 00:57:41
Suguru ARAKAWA @ashigeru

(1) まず、トランザクション中に作成されたすべてのオブジェクトに新しいrefが振られる

2009-12-30 00:58:24
Suguru ARAKAWA @ashigeru

(2) 新しく作成されたオブジェクトとプロパティが変更されたオブジェクトには、現在のトランザクションにアロケートされたrevが振られる

2009-12-30 00:59:39
Suguru ARAKAWA @ashigeru

(3) サーバ上でローカルトランザクションを開始し、オブジェクトアロケートテーブルを取得する。変更、削除されたオブジェクトについて、それらのオブジェクトが現在のトランザクションで分離されたスナップショットとrevが異なる場合、並行性制御例外をスローする

2009-12-30 01:02:07
Suguru ARAKAWA @ashigeru

(4) 3で取得したオブジェクトアロケートテーブルに、新しく作成したオブジェクトのref+revを追加。変更されたオブジェクトのrevを変更(refは固定)。削除されたオブジェクトのエントリを削除

2009-12-30 01:03:19
Suguru ARAKAWA @ashigeru

(5) 3で取得したオブジェクトアロケートテーブルを現在のトランザクションを利用してコミット

2009-12-30 01:04:27
Suguru ARAKAWA @ashigeru

あ、(2)ではオブジェクトをデータストアに追加する。このときのキーはrev+refなので、基本的に衝突しないはず

2009-12-30 01:05:29
Suguru ARAKAWA @ashigeru

すべてのリビジョンのオブジェクトデータを参照系にして、オブジェクトアロケートテーブルでリビジョンを管理。オブジェクトアロケートテーブルのコミットに失敗するとごみが残る。

2009-12-30 01:06:32
Suguru ARAKAWA @ashigeru

オブジェクトアロケートテーブル(OAT)の役割は、各オブジェクトのreferenceからrevisionを導出すること。それぞれのプロパティはreferenceを保持しているので、OATを利用してその時刻におけるオブジェクトのキーを計算できる

2009-12-30 01:10:08
Suguru ARAKAWA @ashigeru

@kazunori_279 あのメモ(OAT)はオブジェクト単位でアトミック操作するタイプの設計です。A = {B, C} から A' = {B', C} と A'' = {B, C'} を作ったときに衝突検出できます。

2009-12-30 08:30:32
Suguru ARAKAWA @ashigeru

@kazunori_279 場合によってはA = {B, C} から A' = {B', C} と A'' = {B'', C} のときだけ検出(SVN的)したほうがいいかもしれないので、その辺は用途次第でしょうか

2009-12-30 08:33:57