You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by da...@apache.org on 2014/02/05 00:06:52 UTC

[39/50] couch commit: updated refs/heads/import to c3116d7

Rewrite the boot procedure for the couch app

We had a lot of historical cruft lying around from before people knew
hot OTP worked. This does some cleanup to make things a bit more tidy
through this section but we still have a long ways to go.


Project: http://git-wip-us.apache.org/repos/asf/couchdb-couch/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-couch/commit/7474dfe5
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-couch/tree/7474dfe5
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-couch/diff/7474dfe5

Branch: refs/heads/import
Commit: 7474dfe5531871baad403248fbc7b81aece77d63
Parents: e09b807
Author: Paul J. Davis <pa...@gmail.com>
Authored: Mon Mar 11 16:13:14 2013 -0500
Committer: Paul J. Davis <pa...@gmail.com>
Committed: Tue Feb 4 17:03:25 2014 -0600

----------------------------------------------------------------------
 Makefile.am                       |   5 +-
 src/couch.app.tpl.in              |   2 +-
 src/couch.erl                     |  48 ++++++++--
 src/couch_app.erl                 |  37 ++------
 src/couch_httpd_misc_handlers.erl |   2 +-
 src/couch_proc_manager.erl        |   3 +
 src/couch_secondary_sup.erl       |   2 +-
 src/couch_server_sup.erl          | 153 -------------------------------
 src/couch_sup.erl                 | 159 +++++++++++++++++++++++++++++++++
 9 files changed, 214 insertions(+), 197 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/7474dfe5/Makefile.am
----------------------------------------------------------------------
diff --git a/Makefile.am b/Makefile.am
index 63c557e..9a656f7 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -70,10 +70,10 @@ source_files = \
     src/couch_query_servers.erl \
     src/couch_secondary_sup.erl \
     src/couch_server.erl \
-    src/couch_server_sup.erl \
     src/couch_stats_aggregator.erl \
     src/couch_stats_collector.erl \
     src/couch_stream.erl \
+    src/couch_sup.erl \
     src/couch_task_status.erl \
     src/couch_users_db.erl \
     src/couch_util.erl \
@@ -131,10 +131,10 @@ compiled_files = \
     ebin/couch_query_servers.beam \
     ebin/couch_secondary_sup.beam \
     ebin/couch_server.beam \
-    ebin/couch_server_sup.beam \
     ebin/couch_stats_aggregator.beam \
     ebin/couch_stats_collector.beam \
     ebin/couch_stream.beam \
+    ebin/couch_sup.beam \
     ebin/couch_task_status.beam \
     ebin/couch_users_db.beam \
     ebin/couch_util.beam \
@@ -167,7 +167,6 @@ compiled_files = \
 #     couch_rep.html \
 #     couch_rep_sup.html \
 #     couch_server.html \
-#     couch_server_sup.html \
 #     couch_stream.html \
 #     couch_util.html
 

http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/7474dfe5/src/couch.app.tpl.in
----------------------------------------------------------------------
diff --git a/src/couch.app.tpl.in b/src/couch.app.tpl.in
index 1cd0154..9b7536b 100644
--- a/src/couch.app.tpl.in
+++ b/src/couch.app.tpl.in
@@ -12,7 +12,7 @@
         couch_proc_manager,
         couch_secondary_services,
         couch_server,
-        couch_server_sup,
+        couch_sup,
         couch_stats_aggregator,
         couch_stats_collector,
         couch_task_status

http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/7474dfe5/src/couch.erl
----------------------------------------------------------------------
diff --git a/src/couch.erl b/src/couch.erl
index 7d53d0c..15cffbc 100644
--- a/src/couch.erl
+++ b/src/couch.erl
@@ -14,18 +14,52 @@
 
 -compile(export_all).
 
+
+deps() ->
+    [
+        sasl,
+        inets,
+        os_mon,
+        crypto,
+        public_key,
+        ssl,
+        oauth,
+        ibrowse,
+        mochiweb,
+        config,
+        twig
+    ].
+
+
 start() ->
-    ok = application:start(couch).
+    catch erlang:system_flag(scheduler_bind_type, default_bind),
+    case start_apps(deps()) of
+        ok ->
+            ok = application:start(couch);
+        Else ->
+            throw(Else)
+    end.
+
 
 stop() ->
     application:stop(couch).
 
+
 restart() ->
-    case stop() of
+    init:restart().
+
+
+start_apps([]) ->
+    ok;
+start_apps([App|Rest]) ->
+    case application:start(App) of
     ok ->
-        start();
-    {error, {not_started,couch}} ->
-        start();
-    {error, Reason} ->
-        {error, Reason}
+       start_apps(Rest);
+    {error, {already_started, App}} ->
+       start_apps(Rest);
+    {error, _Reason} when App =:= public_key ->
+       % ignore on R12B5
+       start_apps(Rest);
+    {error, _Reason} ->
+       {error, {app_would_not_start, App}}
     end.

http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/7474dfe5/src/couch_app.erl
----------------------------------------------------------------------
diff --git a/src/couch_app.erl b/src/couch_app.erl
index 3120a1f..d284c2b 100644
--- a/src/couch_app.erl
+++ b/src/couch_app.erl
@@ -18,39 +18,14 @@
 
 -export([start/2, stop/1]).
 
-start(_Type, DefaultIniFiles) ->
-    IniFiles = get_ini_files(DefaultIniFiles),
-    case start_apps([crypto, public_key, sasl, inets, oauth, ssl, ibrowse, mochiweb, os_mon]) of
-    ok ->
-        couch_server_sup:start_link(IniFiles);
-    {error, Reason} ->
-        {error, Reason}
+start(_Type, _) ->
+    case couch_sup:start_link() of
+        {ok, _} = Resp ->
+            Resp;
+        Else ->
+            throw(Else)
     end.
 
 stop(_) ->
     ok.
 
-get_ini_files(Default) ->
-    case init:get_argument(couch_ini) of
-    error ->
-        Default;
-    {ok, [[]]} ->
-        Default;
-    {ok, [Values]} ->
-        Values
-    end.
-
-start_apps([]) ->
-    ok;
-start_apps([App|Rest]) ->
-    case application:start(App) of
-    ok ->
-       start_apps(Rest);
-    {error, {already_started, App}} ->
-       start_apps(Rest);
-    {error, _Reason} when App =:= public_key ->
-       % ignore on R12B5
-       start_apps(Rest);
-    {error, _Reason} ->
-       {error, {app_would_not_start, App}}
-    end.

http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/7474dfe5/src/couch_httpd_misc_handlers.erl
----------------------------------------------------------------------
diff --git a/src/couch_httpd_misc_handlers.erl b/src/couch_httpd_misc_handlers.erl
index e46dee3..b8f59cd 100644
--- a/src/couch_httpd_misc_handlers.erl
+++ b/src/couch_httpd_misc_handlers.erl
@@ -98,7 +98,7 @@ handle_restart_req(#httpd{method='POST'}=Req) ->
     couch_httpd:validate_ctype(Req, "application/json"),
     ok = couch_httpd:verify_is_server_admin(Req),
     Result = send_json(Req, 202, {[{ok, true}]}),
-    couch_server_sup:restart_core_server(),
+    couch:restart(),
     Result;
 handle_restart_req(Req) ->
     send_method_not_allowed(Req, "POST").

http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/7474dfe5/src/couch_proc_manager.erl
----------------------------------------------------------------------
diff --git a/src/couch_proc_manager.erl b/src/couch_proc_manager.erl
index 6130fc9..45b334f 100644
--- a/src/couch_proc_manager.erl
+++ b/src/couch_proc_manager.erl
@@ -127,6 +127,9 @@ handle_cast(_Msg, State) ->
     {noreply, State}.
 
 
+handle_info(shutdown, State) ->
+    {stop, shutdown, State};
+
 handle_info({'EXIT', _, {ok, Proc0, {Client,_} = From}}, State) ->
     link(Proc0#proc.pid),
     Proc = assign_proc(State#state.tab, Client, Proc0),

http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/7474dfe5/src/couch_secondary_sup.erl
----------------------------------------------------------------------
diff --git a/src/couch_secondary_sup.erl b/src/couch_secondary_sup.erl
index 4f2d1c8..d0ed0c2 100644
--- a/src/couch_secondary_sup.erl
+++ b/src/couch_secondary_sup.erl
@@ -39,4 +39,4 @@ init([]) ->
         end
         || {Name, SpecStr}
         <- config:get("daemons"), SpecStr /= ""],
-    {ok, {{one_for_one, 10, 3600}, Children}}.
+    {ok, {{one_for_one, 50, 3600}, Children}}.

http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/7474dfe5/src/couch_server_sup.erl
----------------------------------------------------------------------
diff --git a/src/couch_server_sup.erl b/src/couch_server_sup.erl
deleted file mode 100644
index c42bcfb..0000000
--- a/src/couch_server_sup.erl
+++ /dev/null
@@ -1,153 +0,0 @@
-% 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(couch_server_sup).
--behaviour(supervisor).
--behaviour(config_listener).
-
-
--export([start_link/1,stop/0, restart_core_server/0]).
-
--include_lib("couch/include/couch_db.hrl").
-
-%% supervisor callbacks
--export([init/1]).
-
-% config_listener api
--export([handle_config_change/5]).
-
-start_link(IniFiles) ->
-    case whereis(couch_server_sup) of
-    undefined ->
-        start_server(IniFiles);
-    _Else ->
-        {error, already_started}
-    end.
-
-restart_core_server() ->
-    init:restart().
-
-start_server(IniFiles) ->
-    case init:get_argument(pidfile) of
-    {ok, [PidFile]} ->
-        case file:write_file(PidFile, os:getpid()) of
-        ok -> ok;
-        {error, Reason} ->
-            io:format("Failed to write PID file ~s: ~s",
-                [PidFile, file:format_error(Reason)])
-        end;
-    _ -> ok
-    end,
-
-    LogLevel = config:get("log", "level", "info"),
-    % announce startup
-    io:format("Apache CouchDB ~s (LogLevel=~s) is starting.~n", [
-        couch_server:get_version(),
-        LogLevel
-    ]),
-    case LogLevel of
-    "debug" ->
-        io:format("Configuration Settings ~p:~n", [IniFiles]),
-        [io:format("  [~s] ~s=~p~n", [Module, Variable, Value])
-            || {{Module, Variable}, Value} <- config:all()];
-    _ -> ok
-    end,
-
-    BaseChildSpecs =
-    {{one_for_one, 10, 60}, [
-        {couch_primary_services,
-            {couch_primary_sup, start_link, []},
-            permanent,
-            infinity,
-            supervisor,
-            [couch_primary_sup]},
-        {couch_secondary_services,
-            {couch_secondary_sup, start_link, []},
-            permanent,
-            infinity,
-            supervisor,
-            [couch_secondary_sup]}
-        ]},
-
-    % ensure these applications are running
-    application:start(ibrowse),
-    application:start(crypto),
-
-    {ok, Pid} = supervisor:start_link(
-        {local, couch_server_sup}, couch_server_sup, BaseChildSpecs),
-
-    ok = config:listen_for_changes(?MODULE, nil),
-
-    Ip = config:get("httpd", "bind_address"),
-    io:format("Apache CouchDB has started. Time to relax.~n"),
-    Uris = [get_uri(Name, Ip) || Name <- [couch_httpd, https]],
-    [begin
-        case Uri of
-            undefined -> ok;
-            Uri -> ?LOG_INFO("Apache CouchDB has started on ~s", [Uri])
-        end
-    end
-    || Uri <- Uris],
-    case config:get("couchdb", "uri_file", null) of 
-    null -> ok;
-    UriFile ->
-        Lines = [begin case Uri of
-            undefined -> [];
-            Uri -> io_lib:format("~s~n", [Uri])
-            end end || Uri <- Uris],
-        case file:write_file(UriFile, Lines) of
-        ok -> ok;
-        {error, Reason2} = Error ->
-            ?LOG_ERROR("Failed to write to URI file ~s: ~s",
-                [UriFile, file:format_error(Reason2)]),
-            throw(Error)
-        end
-    end,
-
-    {ok, Pid}.
-
-stop() ->
-    catch exit(whereis(couch_server_sup), normal).
-
-
-handle_config_change("daemons", _, _, _, _) ->
-    exit(whereis(couch_server_sup), shutdown),
-    remove_handler;
-handle_config_change("couchdb", "util_driver_dir", _, _, _) ->
-    [Pid] = [P || {collation_driver, P, _, _}
-        <- supervisor:which_children(couch_primary_services)],
-    Pid ! reload_driver,
-    {ok, nil};
-handle_config_change(_, _, _, _, _) ->
-    {ok, nil}.
-
-init(ChildSpecs) ->
-    {ok, ChildSpecs}.
-
-get_uri(Name, Ip) ->
-    case get_port(Name) of
-        undefined ->
-            undefined;
-        Port ->
-            io_lib:format("~s://~s:~w/", [get_scheme(Name), Ip, Port])
-    end.
-
-get_scheme(couch_httpd) -> "http";
-get_scheme(https) -> "https".
-
-get_port(Name) ->
-    try
-        mochiweb_socket_server:get(Name, port)
-    catch
-        exit:{noproc, _}->
-            undefined
-    end.

http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/7474dfe5/src/couch_sup.erl
----------------------------------------------------------------------
diff --git a/src/couch_sup.erl b/src/couch_sup.erl
new file mode 100644
index 0000000..3508d4f
--- /dev/null
+++ b/src/couch_sup.erl
@@ -0,0 +1,159 @@
+% 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(couch_sup).
+-behaviour(supervisor).
+-behaviour(config_listener).
+
+
+-export([
+    start_link/0,
+    init/1,
+    handle_config_change/5
+]).
+
+
+-include_lib("couch/include/couch_db.hrl").
+
+
+start_link() ->
+    write_pidfile(),
+    notify_starting(),
+
+    case supervisor:start_link({local, ?MODULE}, ?MODULE, []) of
+        {ok, _} = Resp ->
+            notify_started(),
+            notify_uris(),
+            write_uris(),
+            ok = config:listen_for_changes(?MODULE, nil),
+            Resp;
+        Else ->
+            notify_error(Else),
+            Else
+    end.
+
+
+init(_Args) ->
+    twig:log(info, "Starting ~s", [?MODULE]),
+    {ok, {{one_for_one,10, 60}, [
+        {
+            couch_primary_services,
+            {couch_primary_sup, start_link, []},
+            permanent,
+            infinity,
+            supervisor,
+            [couch_primary_sup]
+        },
+        {
+            couch_secondary_services,
+            {couch_secondary_sup, start_link, []},
+            permanent,
+            infinity,
+            supervisor,
+            [couch_secondary_sup]
+        }
+    ]}}.
+
+
+handle_config_change("daemons", _, _, _, _) ->
+    exit(whereis(couch_server_sup), shutdown),
+    remove_handler;
+handle_config_change("couchdb", "util_driver_dir", _, _, _) ->
+    [Pid] = [P || {collation_driver, P, _, _}
+        <- supervisor:which_children(couch_primary_services)],
+    Pid ! reload_driver,
+    {ok, nil};
+handle_config_change(_, _, _, _, _) ->
+    {ok, nil}.
+
+
+notify_starting() ->
+    io:format("Apache CouchDB ~s (LogLevel=~s) is starting.~n", [
+        couch_server:get_version(),
+        config:get("log", "level", "info")
+    ]).
+
+
+notify_started() ->
+    io:format("Apache CouchDB has started. Time to relax.~n").
+
+
+notify_error(Error) ->
+    io:format("Error starting Apache CouchDB:~n~n    ~p~n~n", [Error]).
+
+
+notify_uris() ->
+    lists:foreach(fun(Uri) ->
+        ?LOG_INFO("Apache CouchDB has started on ~s", [Uri])
+    end, get_uris()).
+
+
+write_pidfile() ->
+    case init:get_argument(pidfile) of
+        {ok, [PidFile]} ->
+            write_file(PidFile, os:getpid());
+        _ ->
+            ok
+    end.
+
+
+write_uris() ->
+    case config:get("couchdb", "uri_file", null) of
+        null ->
+            ok;
+        UriFile ->
+            Lines = [io_lib:format("~s~n", [Uri]) || Uri <- get_uris()],
+            write_file(UriFile, Lines)
+    end.
+
+
+get_uris() ->
+    Ip = config:get("httpd", "bind_address"),
+    lists:flatmap(fun(Uri) ->
+        case get_uri(Uri, Ip) of
+            undefined -> [];
+            Else -> [Else]
+        end
+    end, [couch_httpd, https]).
+
+
+get_uri(Name, Ip) ->
+    case get_port(Name) of
+        undefined ->
+            undefined;
+        Port ->
+            io_lib:format("~s://~s:~w/", [get_scheme(Name), Ip, Port])
+    end.
+
+
+get_scheme(couch_httpd) -> "http";
+get_scheme(https) -> "https".
+
+
+get_port(Name) ->
+    try
+        mochiweb_socket_server:get(Name, port)
+    catch
+        exit:{noproc, _} ->
+            undefined
+    end.
+
+
+write_file(FileName, Contents) ->
+    case file:write_file(FileName, Contents) of
+        ok ->
+            ok;
+        {error, Reason} ->
+            Args = [FileName, file:format_error(Reason)],
+            io:format(standard_error, "Failed ot write ~s :: ~s", Args),
+            throw({error, Reason})
+    end.