Read-repair, not tested
This commit is contained in:
parent
945635f837
commit
c23aeabc20
1 changed files with 53 additions and 1 deletions
|
@ -133,10 +133,62 @@ read_page(#proj{epoch=Epoch} = P, LPN) ->
|
|||
error_overwritten ->
|
||||
error({impossible, ?MODULE, ?LINE, overwritten_reply_to_read});
|
||||
error_unwritten ->
|
||||
%% TODO: Check head for possible read-repair
|
||||
%% TODO: During scan_forward(), this pestering of the upstream
|
||||
%% nodes in the chain is possibly-excessive-work.
|
||||
%% For now, we'll assume that we always want to repair.
|
||||
case read_repair(Epoch, LPN, Tail, hd(Chain)) of
|
||||
{ok, _} = OK2 ->
|
||||
OK2;
|
||||
Else ->
|
||||
Else
|
||||
end
|
||||
end.
|
||||
|
||||
read_repair(_Epoch, _LPN, RepairFLU, RepairFLU) ->
|
||||
error_unwritten;
|
||||
read_repair(Epoch, LPN, RepairFLU, Head) ->
|
||||
case corfurl_flu:read(flu_pid(Head), Epoch, LPN) of
|
||||
{ok, Page} ->
|
||||
case corfurl_flu:write(flu_pid(RepairFLU), Epoch, LPN, Page) of
|
||||
ok ->
|
||||
ok;
|
||||
error_badepoch ->
|
||||
error_badepoch;
|
||||
error_trimmed ->
|
||||
error_trimmed;
|
||||
error_overwritten ->
|
||||
case corfurl_flu:read(flu_pid(RepairFLU), Epoch, LPN) of
|
||||
{ok, Page2} when Page2 =:= Page ->
|
||||
{ok, Page};
|
||||
{ok, Oops} ->
|
||||
error({impossible, ?MODULE, ?LINE, LPN, head_said, Page, repairee_now_says, Oops});
|
||||
error_trimmed ->
|
||||
%% Wow, we have lost at least 3 races in a row.
|
||||
read_repair_trim(RepairFLU, LPN);
|
||||
Else ->
|
||||
Else
|
||||
end;
|
||||
error_unwritten ->
|
||||
error({impossible, ?MODULE, ?LINE, written_then_unwritten})
|
||||
end;
|
||||
error_badepoch ->
|
||||
error_badepoch;
|
||||
error_trimmed ->
|
||||
read_repair_trim(RepairFLU, LPN);
|
||||
error_overwritten ->
|
||||
error({impossible, ?MODULE, ?LINE, overwritten_reply_to_read});
|
||||
error_unwritten ->
|
||||
error_unwritten
|
||||
end.
|
||||
|
||||
read_repair_trim(RepairFLU, LPN) ->
|
||||
case corfurl_flu:trim(flu_pid(RepairFLU), LPN) of
|
||||
ok ->
|
||||
error_trimmed;
|
||||
Else ->
|
||||
Else
|
||||
end.
|
||||
|
||||
scan_forward(P, LPN, MaxPages) ->
|
||||
scan_forward(P, LPN, MaxPages, ok, true, []).
|
||||
|
||||
|
|
Loading…
Reference in a new issue