From f3e5decde59d53339f41770cd38804f85bd5d0e3 Mon Sep 17 00:00:00 2001 From: Robert Newson Date: Thu, 19 Apr 2012 22:00:56 +0100 Subject: [PATCH] Merge pull request #39 from cloudant/13470-make-get_dbs-zone-aware 13470 make get dbs zone aware --- src/fabric_util.erl | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/fabric_util.erl b/src/fabric_util.erl index 42fe900..5416d29 100644 --- a/src/fabric_util.erl +++ b/src/fabric_util.erl @@ -54,14 +54,14 @@ get_db(DbName) -> get_db(DbName, []). get_db(DbName, Options) -> - % prefer local shards - {Local, Remote} = lists:partition(fun(S) -> S#shard.node =:= node() end, - mem3:shards(DbName)), + {Local, SameZone, DifferentZone} = mem3:group_by_proximity(mem3:shards(DbName)), + % Prefer shards on the same node over other nodes, prefer shards in the same zone over + % over zones and sort each remote list by name so that we don't repeatedly try the same node. + Shards = Local ++ lists:keysort(#shard.name, SameZone) ++ lists:keysort(#shard.name, DifferentZone), % suppress shards from down nodes - Nodes = erlang:nodes(), - Live = [S || #shard{node = N} = S <- Remote, lists:member(N, Nodes)], - % sort the live remote shards so that we don't repeatedly try the same node - get_shard(Local ++ lists:keysort(#shard.name, Live), Options, 100). + Nodes = [node()|erlang:nodes()], + Live = [S || #shard{node = N} = S <- Shards, lists:member(N, Nodes)], + get_shard(Live, Options, 100). get_shard([], _Opts, _Timeout) -> erlang:error({internal_server_error, "No DB shards could be opened."});