ToshiyukiTerashita/castoro — Issue #27: CREATE & FINALIZE 直後の DELETE で、バスケットを確実に削除する
Author: tora
Created: 2011-10-12 08:47:47+00:00
State: open

問題：以下の手順を行うと、バスケットが削除されていない場合がある
1. バスケットを CREATE する。
2. 同バスケットを FINALIZE する。
3. 数秒以内に、同バスケットを DELETE する。

原因：FINALIZE によって開始されファイルデータ転送に時間を要する「レプリケーション」と、
DELETE によって開始されほぼ瞬時に完了する「削除の伝達」とが競争してしまい、それらの順序が逆転し、
削除の伝達が「ピアグループ」内の全ピアへ伝達されるよりも前に止まってしまうため。

状況：
1. クライアントがバスケットを CREATE する。
2. クライアントが同バスケットを FINALIZE する。
2a. FINALIZE を処理した「ピア１」は、ゲートウェイへ同バスケットの保持を通知する。
2b. 「ピア１」は、同バスケットのレプリケーションを「ピア２」へ開始する。
2c. クライアントがゲートウェイに対して、同バケットを保持しているピアを尋ね、「ピア１」を得る。
3. クライアントが「ピア１」に対して、同バスケットを DELETE する。
「ピア１」上の当該バスケットのディレクトリおよびその中のファイルは削除されたにも係わらず、
2bのレプリケーション処理によるファイルデータの転送は、そのファイルをオープンしているため、正常に行われる。
3a. DELETE を処理した「ピア１」は、ゲートウェイへ同バスケットの削除を通知する。
3b. 「ピア２」は、当該バスケットが自ピア上に存在していないことを把握し、
「削除の必要なし」を「ピア１」へ回答する。
と同時に、「ピア３」への「削除の伝達」は不要と判断する。
4. しばらくすると、上記2bのレプリケーションが完了し、「ピア２」上に当該バスケットが作成される。
5. 「ピア２」は、「ピア３」へレプリケーションを開始し、完了する。
6. 「ピア３」は、「ピア１」へレプリケーションを開始し、完了する。
7. 「ピア１」は、「ピア２」へレプリケーションを開始しようとして、
「ピア２」から「既に持っているよ」との回答を受け、この時点で、レプリケーションの伝達が完了する。

このようにして、結果的に、当該のバスケットは削除されず、当該ピアグループ内の全ピアへレプリケーションされてしまう。

上述の他にも、いくつかの状況が考えられる。
例えば、ピア１からピア２へのレプリケーションが完了し、続いてピア２からピア３へのレプリケーションが行われている時に
ピア２に対して DELETE すると、
結果的に、ピア１とピア３にバスケットが残り、ピア２には同バスケットが存在していない、というような状況が起こりうる。