Fix scan_backward with stopping LPN #

This commit is contained in:
Scott Lystig Fritchie 2014-08-30 18:04:49 +09:00
parent 1bb127eb65
commit 1184607bce

View file

@ -79,17 +79,29 @@ scan_backward(Proj, Stream, LastLPN, WithPagesP) ->
scan_backward(Proj, Stream, LastLPN, 0, WithPagesP). scan_backward(Proj, Stream, LastLPN, 0, WithPagesP).
scan_backward(Proj, Stream, LastLPN, StopAtLPN, WithPagesP) -> scan_backward(Proj, Stream, LastLPN, StopAtLPN, WithPagesP) ->
lists:reverse(scan_backward2(Proj, Stream, LastLPN, StopAtLPN, WithPagesP)). lists:reverse(scan_backward2(Proj, Stream, LastLPN, StopAtLPN,
0, WithPagesP)).
scan_backward2(_Proj, _Stream, LastLPN, StopAtLPN, _WithPagesP) scan_backward2(_Proj, _Stream, LastLPN, StopAtLPN, _NumPages, _WithPagesP)
when LastLPN =< StopAtLPN -> when LastLPN =< StopAtLPN; LastLPN =< 0 ->
[]; [];
scan_backward2(Proj, Stream, LastLPN, StopAtLPN, WithPagesP) -> scan_backward2(Proj, Stream, LastLPN, StopAtLPN, NumPages, WithPagesP) ->
case corfurl:read_page(Proj, LastLPN) of case corfurl:read_page(Proj, LastLPN) of
{ok, FullPage} -> {ok, FullPage} ->
case proplists:get_value(Stream, unpack_v1(FullPage, stream_list)) of case proplists:get_value(Stream, unpack_v1(FullPage, stream_list)) of
undefined -> undefined ->
{gah_fixme, lpn, LastLPN, unpack_v1(FullPage, stream_list)}; if NumPages == 0 ->
%% We were told to start scanning backward at some
%% LPN, but that LPN doesn't have a stream for us.
%% So we'll go backward a page and see if we get
%% lucky there.
scan_backward2(Proj, Stream, LastLPN-1, StopAtLPN,
NumPages, WithPagesP);
true ->
%% Oops, we pointed into a hole. That's bad.
%% TODO: fixme
{gah_fixme, lpn, LastLPN, unpack_v1(FullPage, stream_list)}
end;
[] -> [] ->
if WithPagesP -> if WithPagesP ->
[{LastLPN, unpack_v1(FullPage, page)}]; [{LastLPN, unpack_v1(FullPage, page)}];
@ -100,7 +112,7 @@ scan_backward2(Proj, Stream, LastLPN, StopAtLPN, WithPagesP) ->
if WithPagesP -> if WithPagesP ->
[{LastLPN, unpack_v1(FullPage, page)}| [{LastLPN, unpack_v1(FullPage, page)}|
scan_backward2(Proj, Stream, scan_backward2(Proj, Stream,
hd(BackPs), StopAtLPN, hd(BackPs), StopAtLPN, NumPages + 1,
WithPagesP)]; WithPagesP)];
true -> true ->
SkipLPN = lists:last(BackPs), SkipLPN = lists:last(BackPs),
@ -109,7 +121,7 @@ scan_backward2(Proj, Stream, LastLPN, StopAtLPN, WithPagesP) ->
LPN > StopAtLPN], LPN > StopAtLPN],
[LastLPN] ++ AddLPNs ++ [LastLPN] ++ AddLPNs ++
scan_backward2(Proj, Stream, scan_backward2(Proj, Stream,
SkipLPN, StopAtLPN, SkipLPN, StopAtLPN, NumPages + 1,
WithPagesP) WithPagesP)
end end
end; end;