summaryrefslogtreecommitdiff
path: root/src/mem3/src/mem3_httpd.erl
blob: 571f0637025efd7f3ade0c630b933a2fdb50e4af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
% 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_httpd).

-export([handle_membership_req/1, handle_shards_req/2]).

%% includes
-include_lib("mem3/include/mem3.hrl").
-include_lib("couch/include/couch_db.hrl").


handle_membership_req(#httpd{method='GET',
        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{path_parts=[<<"_membership">>]}=Req) ->
    chttpd:send_method_not_allowed(Req, "GET").

handle_shards_req(#httpd{method='GET',
        path_parts=[_DbName, <<"_shards">>]} = Req, Db) ->
    DbName = mem3:dbname(couch_db:name(Db)),
    Shards = mem3:shards(DbName),
    JsonShards = json_shards(Shards, dict:new()),
    couch_httpd:send_json(Req, {[
        {shards, JsonShards}
    ]});
handle_shards_req(#httpd{method='GET',
        path_parts=[_DbName, <<"_shards">>, DocId]} = Req, Db) ->
    DbName = mem3:dbname(couch_db:name(Db)),
    Shards = mem3:shards(DbName, DocId),
    {[{Shard, Dbs}]} = json_shards(Shards, dict:new()),
    couch_httpd:send_json(Req, {[
        {range, Shard},
        {nodes, Dbs}
    ]});
handle_shards_req(#httpd{path_parts=[_DbName, <<"_shards">>]}=Req, _Db) ->
    chttpd:send_method_not_allowed(Req, "GET");
handle_shards_req(#httpd{path_parts=[_DbName, <<"_shards">>, _DocId]}=Req, _Db) ->
    chttpd:send_method_not_allowed(Req, "GET").

%%
%% internal
%%

json_shards([], AccIn) ->
    List = dict:to_list(AccIn),
    {lists:sort(List)};
json_shards([#shard{node=Node, range=[B,E]} | Rest], AccIn) ->
    HexBeg = couch_util:to_hex(<<B:32/integer>>),
    HexEnd = couch_util:to_hex(<<E:32/integer>>),
    Range = list_to_binary(HexBeg ++ "-" ++ HexEnd),
    json_shards(Rest, dict:append(Range, Node, AccIn)).