Skip Graph の concurrent JOIN を考える - その3

id:kibayos さんの PDF「構造化オーバレイの一貫性保証」 に書かれている Skip Graph の一貫性保証の例を読み解く。
http://live-e.naist.jp/sensor_overlay/3/doc/yoshida.pdf


その2の続き。双方向リンクリストに conncurrent Join / Remove する話。
続いて Remove 。以下の状態から [A] を削除する。

[X] <-> [A] <-> [Y]

資料にある手順は以下の通り。

  • step1. (lock at A)
  • step2. (lock at X)
  • step3. change Y->A to Y->X
  • step4. change X->A to X->Y
  • step5. (unlock at X)
  • step6. remove A->X, A->Y
  • step7. (unlock at A)

step1. (lock at A)

A がそのレベルで削除されている場合。何もせず処理を返す。
ロックが失敗した場合、wait する。ロックが獲得できたら、両隣が X, Y ではなくなっているかもしれないが気にしない。

step2. (lock at X)

ここでの X とは A の左という意味で、元の X とは違う可能性がある。
A がロックされているので X が削除される事はない。
X がロックされている場合は wait する。


これデッドロックすると思う。

[X:locked by hige] <-> [A:locked by foo] <-> [Y]

同時期に X と A の間に B を Join している場合、X がロックされているため、wait が発生する。
hige は hoo がもつ A のロック解放を待ち、foo は hige の X ロックを待っていてデッドロックしそう。
これを防ぐには A を unlock して、少し寝て A のロックからやり直す事で防げる(複雑だなあ)

step3. change Y->A to Y->X

A がロックされているので Y が削除される可能性はない。

step4. change X->A to X->Y

X がロックされているので問題ない。

step5. (unlock at X)

問題ない。

step6. remove A->X, A->Y

問題ない。

step7. (unlock at A)

問題ない

所感

Join / Remove の混在によるロックが複雑になり、自分の理解に考慮漏れがありそう。
きちんと Formalize? して検証した方が良い気がする。既に存在してそうだけど。どうだろうか。

あとなぜ、X, Y 両方ともロックしないかも理解できていない。