Partial fix for bug in last commit, but not good enough
This commit is contained in:
parent
6858041c7d
commit
b7b9255f5f
1 changed files with 19 additions and 21 deletions
|
@ -18,11 +18,6 @@
|
||||||
%%
|
%%
|
||||||
%% -------------------------------------------------------------------
|
%% -------------------------------------------------------------------
|
||||||
|
|
||||||
%% TODO: fix this failure case with append_page(Bin) -> {ok, 2},
|
|
||||||
%% but read_page(LPN=1) can read Bin, and model believes that
|
|
||||||
%% LPN=1 was never written
|
|
||||||
%% Ca = [{2,2,1},{{[{set,{var,1},{call,corfurl_pulse,setup,[2,2,1,standard]}}],[[{set,{var,3},{call,corfurl_pulse,append,[{var,1},<<0>>]}}],[{set,{var,2},{call,corfurl_pulse,stop_sequencer,[{var,1},kill]}},{set,{var,4},{call,corfurl_pulse,trim,[{var,1},386862782]}},{set,{var,5},{call,corfurl_pulse,scan_forward,[{var,1},5412106233,1]}}]]},{24672,25300,90107}},[{events,[[{no_bad_reads,[]}]]}]].
|
|
||||||
|
|
||||||
-module(corfurl_client).
|
-module(corfurl_client).
|
||||||
|
|
||||||
-export([append_page/2, read_page/2, fill_page/2, trim_page/2, scan_forward/3]).
|
-export([append_page/2, read_page/2, fill_page/2, trim_page/2, scan_forward/3]).
|
||||||
|
@ -40,22 +35,8 @@ append_page(Proj, _Page, 0) ->
|
||||||
{{error_failed, ?MODULE, ?LINE}, Proj};
|
{{error_failed, ?MODULE, ?LINE}, Proj};
|
||||||
append_page(#proj{seq={Sequencer,_,_}} = Proj, Page, Retries) ->
|
append_page(#proj{seq={Sequencer,_,_}} = Proj, Page, Retries) ->
|
||||||
try
|
try
|
||||||
case corfurl_sequencer:get(Sequencer, 1) of
|
{ok, LPN} = corfurl_sequencer:get(Sequencer, 1),
|
||||||
{ok, LPN} ->
|
append_page1(Proj, LPN, Page, 5)
|
||||||
case append_page2(Proj, LPN, Page) of
|
|
||||||
lost_race ->
|
|
||||||
append_page(Proj, Page, Retries - 1);
|
|
||||||
error_badepoch ->
|
|
||||||
case poll_for_new_epoch_projection(Proj) of
|
|
||||||
{ok, NewProj} ->
|
|
||||||
append_page(NewProj, Page, Retries - 1);
|
|
||||||
Else ->
|
|
||||||
{Else, Proj}
|
|
||||||
end;
|
|
||||||
Else ->
|
|
||||||
{Else, Proj}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
catch
|
catch
|
||||||
exit:{Reason,{_gen_server_or_pulse_gen_server,call,[Sequencer|_]}}
|
exit:{Reason,{_gen_server_or_pulse_gen_server,call,[Sequencer|_]}}
|
||||||
when Reason == noproc; Reason == normal ->
|
when Reason == noproc; Reason == normal ->
|
||||||
|
@ -64,6 +45,23 @@ append_page(#proj{seq={Sequencer,_,_}} = Proj, Page, Retries) ->
|
||||||
{{error_failed, ?MODULE, ?LINE}, incomplete_code, Exit}
|
{{error_failed, ?MODULE, ?LINE}, incomplete_code, Exit}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
append_page1(Proj, _LPN, _Page, 0) ->
|
||||||
|
{{error_failed, ?MODULE, ?LINE}, Proj};
|
||||||
|
append_page1(Proj, LPN, Page, Retries) ->
|
||||||
|
case append_page2(Proj, LPN, Page) of
|
||||||
|
lost_race ->
|
||||||
|
append_page(Proj, Page, Retries - 1);
|
||||||
|
error_badepoch ->
|
||||||
|
case poll_for_new_epoch_projection(Proj) of
|
||||||
|
{ok, NewProj} ->
|
||||||
|
append_page1(NewProj, LPN, Page, Retries - 1);
|
||||||
|
Else ->
|
||||||
|
{Else, Proj}
|
||||||
|
end;
|
||||||
|
Else ->
|
||||||
|
{Else, Proj}
|
||||||
|
end.
|
||||||
|
|
||||||
append_page2(Proj, LPN, Page) ->
|
append_page2(Proj, LPN, Page) ->
|
||||||
case corfurl:write_page(Proj, LPN, Page) of
|
case corfurl:write_page(Proj, LPN, Page) of
|
||||||
ok ->
|
ok ->
|
||||||
|
|
Loading…
Reference in a new issue