summaryrefslogtreecommitdiff
path: root/src/mem3/src/mem3_reshard_validate.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem3/src/mem3_reshard_validate.erl')
-rw-r--r--src/mem3/src/mem3_reshard_validate.erl126
1 files changed, 0 insertions, 126 deletions
diff --git a/src/mem3/src/mem3_reshard_validate.erl b/src/mem3/src/mem3_reshard_validate.erl
deleted file mode 100644
index aa8df3e16..000000000
--- a/src/mem3/src/mem3_reshard_validate.erl
+++ /dev/null
@@ -1,126 +0,0 @@
-% Licensed under the Apache License, Version 2.0 (the "License"); you may not
-% use this file except in compliance with the License. You may obtain a copy of
-% the License at
-%
-% http://www.apache.org/licenses/LICENSE-2.0
-%
-% Unless required by applicable law or agreed to in writing, software
-% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-% License for the specific language governing permissions and limitations under
-% the License.
-
--module(mem3_reshard_validate).
-
--export([
- start_args/2,
- source/1,
- targets/2
-]).
-
--include_lib("mem3/include/mem3.hrl").
-
-
--spec start_args(#shard{}, any()) -> ok | {error, term()}.
-start_args(Source, Split) ->
- first_error([
- check_split(Split),
- check_range(Source, Split),
- check_node(Source),
- source(Source),
- check_shard_map(Source)
- ]).
-
-
--spec source(#shard{}) -> ok | {error, term()}.
-source(#shard{name = Name}) ->
- case couch_server:exists(Name) of
- true ->
- ok;
- false ->
- {error, {source_shard_not_found, Name}}
- end.
-
-
--spec check_shard_map(#shard{}) -> ok | {error, term()}.
-check_shard_map(#shard{name = Name}) ->
- DbName = mem3:dbname(Name),
- AllShards = mem3:shards(DbName),
- case mem3_util:calculate_max_n(AllShards) of
- N when is_integer(N), N >= 1 ->
- ok;
- N when is_integer(N), N < 1 ->
- {error, {not_enough_shard_copies, DbName}}
- end.
-
-
--spec targets(#shard{}, [#shard{}]) -> ok | {error, term()}.
-targets(#shard{} = Source, Targets) ->
- first_error([
- target_ranges(Source, Targets)
- ]).
-
-
--spec check_split(any()) -> ok | {error, term()}.
-check_split(Split) when is_integer(Split), Split > 1 ->
- ok;
-check_split(Split) ->
- {error, {invalid_split_parameter, Split}}.
-
-
--spec check_range(#shard{}, any()) -> ok | {error, term()}.
-check_range(#shard{range = Range = [B, E]}, Split) ->
- case (E + 1 - B) >= Split of
- true ->
- ok;
- false ->
- {error, {shard_range_cannot_be_split, Range, Split}}
- end.
-
-
--spec check_node(#shard{}) -> ok | {error, term()}.
-check_node(#shard{node = undefined}) ->
- ok;
-
-check_node(#shard{node = Node}) when Node =:= node() ->
- ok;
-
-check_node(#shard{node = Node}) ->
- {error, {source_shard_node_is_not_current_node, Node}}.
-
-
--spec target_ranges(#shard{}, [#shard{}]) -> ok | {error, any()}.
-target_ranges(#shard{range = [Begin, End]}, Targets) ->
- Ranges = [R || #shard{range = R} <- Targets],
- SortFun = fun([B1, _], [B2, _]) -> B1 =< B2 end,
- [First | RestRanges] = lists:sort(SortFun, Ranges),
- try
- TotalRange = lists:foldl(fun([B2, E2], [B1, E1]) ->
- case B2 =:= E1 + 1 of
- true ->
- ok;
- false ->
- throw({range_error, {B2, E1}})
- end,
- [B1, E2]
- end, First, RestRanges),
- case [Begin, End] =:= TotalRange of
- true ->
- ok;
- false ->
- throw({range_error, {[Begin, End], TotalRange}})
- end
- catch
- throw:{range_error, Error} ->
- {error, {shard_range_error, Error}}
- end.
-
-
--spec first_error([ok | {error, term()}]) -> ok | {error, term()}.
-first_error(Results) ->
- case [Res || Res <- Results, Res =/= ok] of
- [] ->
- ok;
- [FirstError | _] ->
- FirstError
- end.