/
riak.erl
103 lines (88 loc) · 3.73 KB
/
riak.erl
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
%% This file is provided to you 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.
%% @doc Riak: A lightweight, decentralized key-value store.
%% @author Andy Gross <andy@basho.com>
%% @author Justin Sheehy <justin@basho.com>
%% @author Bryan Fink <bryan@basho.com>
%% @copyright 2007-2009 Basho Technologies, Inc. All Rights Reserved.
-module(riak).
-author('Andy Gross <andy@basho.com>').
-author('Justin Sheehy <justin@basho.com>').
-author('Bryan Fink <bryan@basho.com>').
-export([start/0, start/1, stop/0, stop/1]).
-export([get_app_env/1,get_app_env/2]).
-export([client_connect/1,local_client/0]).
-include_lib("eunit/include/eunit.hrl").
%% @spec start([ConfigPath :: list()]) -> ok
%% @doc Start the riak server.
%% ConfigPath specifies the location of the riak configuration file.
start([ConfigPath]) ->
application:set_env(riak, configpath, ConfigPath),
start().
%% @spec start() -> ok
%% @doc Start the riak server.
start() ->
%% force full GC sweeps more often to resolve memory usage issues, mostly
%% on Linux. Using erlang:system_flag() is a relatively blunt way of
%% solving this (the value can be specified per-process with spawn_opt,
%% but this works and doesn't have a noticeable impact on performance.
erlang:system_flag(fullsweep_after, 20),
ensure_started(sasl),
ensure_started(crypto),
ensure_started(webmachine),
application:start(riak, permanent).
%% @spec stop() -> ok
%% @doc Stop the riak application and the calling process.
stop() -> stop("riak stop requested").
stop(Reason) ->
% we never do an application:stop because that makes it very hard
% to really halt the runtime, which is what we need here.
error_logger:info_msg(io_lib:format("~p~n",[Reason])),
init:stop().
%% @spec get_app_env(Opt :: atom()) -> term()
%% @doc The official way to get the values set in riak's configuration file.
%% Will return the undefined atom if that option is unset.
get_app_env(Opt) -> get_app_env(Opt, undefined).
%% @spec get_app_env(Opt :: atom(), Default :: term()) -> term()
%% @doc The official way to get the values set in riak's configuration file.
%% Will return Default if that option is unset.
get_app_env(Opt, Default) ->
case application:get_env(riak, Opt) of
{ok, Val} -> Val;
_ ->
case init:get_argument(Opt) of
{ok, [[Val | _]]} -> Val;
error -> Default
end
end.
%% @spec local_client() -> {ok, Client :: riak_client()}
%% @doc When you want a client for use on a running Riak node.
local_client() -> client_connect(node()).
%% @spec client_connect(Node :: node())
%% -> {ok, Client :: riak_client()} | {error, timeout}
%% @doc The usual way to get a client. Timeout often means either a bad
%% cookie or a poorly-connected distributed erlang network.
client_connect(Node) ->
% Make sure we can reach this node...
case net_adm:ping(Node) of
pang -> {error, {could_not_reach_node, Node}};
pong -> {ok, riak_client:new(Node, riak_util:mkclientid(Node))}
end.
%% @spec ensure_started(Application :: atom()) -> ok
%% @doc Start the named application if not already started.
ensure_started(App) ->
case application:start(App) of
ok ->
ok;
{error, {already_started, App}} ->
ok
end.