You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by va...@apache.org on 2019/02/26 23:01:10 UTC
[couchdb] branch shard-split updated: Add calculate_max_n to
mem3_util module
This is an automated email from the ASF dual-hosted git repository.
vatamane pushed a commit to branch shard-split
in repository https://gitbox.apache.org/repos/asf/couchdb.git
The following commit(s) were added to refs/heads/shard-split by this push:
new e9b94c8 Add calculate_max_n to mem3_util module
e9b94c8 is described below
commit e9b94c894e89fdd8a8b74b90a9c3cda50cdb0c77
Author: Nick Vatamaniuc <va...@apache.org>
AuthorDate: Tue Feb 26 17:59:32 2019 -0500
Add calculate_max_n to mem3_util module
This can be used to calculate the maximum N (number of copies) for a
given set of shards.
---
src/mem3/src/mem3_util.erl | 34 +++++++++++++++++++++++++++++++++-
1 file changed, 33 insertions(+), 1 deletion(-)
diff --git a/src/mem3/src/mem3_util.erl b/src/mem3/src/mem3_util.erl
index e81ceb2..e8cba5d 100644
--- a/src/mem3/src/mem3_util.erl
+++ b/src/mem3/src/mem3_util.erl
@@ -27,7 +27,8 @@
get_ring/3,
get_ring/4,
non_overlapping_shards/1,
- non_overlapping_shards/3
+ non_overlapping_shards/3,
+ calculate_max_n/1
]).
%% do not use outside mem3.
@@ -409,6 +410,25 @@ non_overlapping_shards(Shards, Start, End) ->
end, Shards).
+% Given a list of shards, return the maximum number of copies
+% across all the ranges. If the ring is incomplete it will return 0.
+% If there it is an n = 1 database, it should return 1, etc.
+calculate_max_n(Shards) ->
+ Ranges = lists:map(fun(Shard) ->
+ [B, E] = mem3:range(Shard),
+ {B, E}
+ end, Shards),
+ calculate_max_n(Ranges, get_ring(Ranges), 0).
+
+
+calculate_max_n(_Ranges, [], N) ->
+ N;
+
+calculate_max_n(Ranges, Ring, N) ->
+ NewRanges = Ranges -- Ring,
+ calculate_max_n(NewRanges, get_ring(NewRanges), N + 1).
+
+
get_ring(Ranges) ->
get_ring(Ranges, fun sort_ranges_fun/2, 0, ?RING_END).
@@ -530,6 +550,18 @@ non_overlapping_shards_test() ->
]].
+calculate_max_n_test_() ->
+ [?_assertEqual(Res, calculate_max_n(Shards)) || {Res, Shards} <- [
+ {0, []},
+ {0, [shard(1, ?RING_END)]},
+ {1, [shard(0, ?RING_END)]},
+ {1, [shard(0, ?RING_END), shard(1, ?RING_END)]},
+ {2, [shard(0, ?RING_END), shard(0, ?RING_END)]},
+ {2, [shard(0, 1), shard(2, ?RING_END), shard(0, ?RING_END)]},
+ {0, [shard(0, 3), shard(5, ?RING_END), shard(1, ?RING_END)]}
+ ]].
+
+
shard(Begin, End) ->
#shard{range = [Begin, End]}.