diff options
author | Brad Anderson <brad@cloudant.com> | 2010-07-19 15:47:16 -0400 |
---|---|---|
committer | Adam Kocoloski <adam@cloudant.com> | 2010-08-12 01:24:28 -0400 |
commit | 14f739cf46798d40a060e7280080f1a368c5093f (patch) | |
tree | 968e211b556b324f078df6ab6ecbadaa68d54c03 | |
parent | d17def4f873f3d333c5b16242535b68ccbb6d926 (diff) |
add partitions endpoint, updated for mem3 - implements bugzid 10536
-rw-r--r-- | src/mem3_httpd.erl | 69 |
1 files changed, 14 insertions, 55 deletions
diff --git a/src/mem3_httpd.erl b/src/mem3_httpd.erl index 3609de24..958e9ef5 100644 --- a/src/mem3_httpd.erl +++ b/src/mem3_httpd.erl @@ -8,71 +8,30 @@ handle_membership_req(#httpd{method='GET', - path_parts=[<<"_membership">>]} = Req) -> + path_parts=[<<"_membership">>]} = Req) -> ClusterNodes = try mem3:nodes() catch _:_ -> {ok,[]} end, couch_httpd:send_json(Req, {[ {all_nodes, lists:sort([node()|nodes()])}, {cluster_nodes, lists:sort(ClusterNodes)} ]}); - -handle_membership_req(#httpd{method='POST', - path_parts=[<<"_membership">>]} = Req) -> - {JsonProps} = couch_httpd:json_body_obj(Req), - Method = couch_util:get_value(<<"method">>, JsonProps), - Params = couch_util:get_value(<<"params">>, JsonProps), - Id = couch_util:get_value(<<"id">>, JsonProps), - {Result, Error} = membership_dispatch(Method, Params), +handle_membership_req(#httpd{method='GET', + path_parts=[<<"_membership">>, <<"parts">>, DbName]} = Req) -> + ClusterNodes = try mem3:nodes() + catch _:_ -> {ok,[]} end, + Shards = mem3:shards(DbName), + JsonShards = json_shards(Shards, []), couch_httpd:send_json(Req, {[ - {result, Result}, - {error, Error}, - {id, Id} + {all_nodes, lists:sort([node()|nodes()])}, + {cluster_nodes, lists:sort(ClusterNodes)}, + {partitions, JsonShards} ]}). %% %% internal %% -membership_dispatch(<<"replace">>, Params) -> - OldNode = get_oldnode(Params), - NewNodeOpts = get_value_json(<<"newnode_options">>, Params, []), - PingNode = get_pingnode(Params), - send_join(replace, {OldNode, NewNodeOpts}, PingNode); -membership_dispatch(TypeBin, Params) -> - Type = list_to_atom(?b2l(TypeBin)), - NodeList = get_value_json(<<"nodes">>, Params, []), - Nodes = lists:map(fun({List}) -> node_info(List) end, NodeList), - PingNode = get_pingnode(Params), - send_join(Type, Nodes, PingNode). - -get_pingnode(Params) -> - PingNodeBin = get_value_json(<<"pingnode">>, Params, <<"nil">>), - list_to_atom(?b2l(PingNodeBin)). - -get_oldnode(Params) -> - NodeBin = get_value_json(<<"oldnode">>, Params, undefined), - NodeList = ?b2l(NodeBin), - list_to_atom(NodeList). - -%% @doc send join command to mem module -send_join(Type, Payload, PingNode) -> - case mem3:join(Type, Payload, PingNode) of - ok -> {ok, null}; - {error, Error} -> {Type, Error}; - Other -> - ?LOG_ERROR("membership dispatch error ~p", [Other]), - {Type, unknown_error} - end. - -node_info(List) -> - Order = couch_util:get_value(<<"order">>, List), - Node1 = couch_util:get_value(<<"node">>, List), - Node2 = list_to_atom(?b2l(Node1)), - Options = couch_util:get_value(<<"options">>, List), - {Order, Node2, Options}. -get_value_json(_,[], Default) -> Default; -get_value_json(Key, [JsonProp|Rest], Default) -> - case JsonProp of - {[{Key, Value}]} -> Value; - _ -> get_value_json(Key, Rest, Default) - end. +json_shards([], Acc) -> {lists:sort(Acc)}; +json_shards([#shard{node=Node, range=[B,_E]} | Rest], AccIn) -> + HexBeg = couch_util:to_hex(<<B:32/integer>>), + json_shards(Rest, [{HexBeg,[Node]}|AccIn]). |