Permalink
Browse files

Reorganize upper levels of supervision tree

* Primary and secondary supervisors get their own callback modules
* Use a dedicated supervised process for ICU collation driver
* Correct child specification for update notifier supervisor

COUCHDB-1010

git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@1060969 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information...
1 parent f396bf5 commit c39a75019fe6eee211cffa8f44cd10111dabb67a @kocolosk kocolosk committed Jan 19, 2011
@@ -53,7 +53,6 @@ os_process_limit = 25
[daemons]
view_manager={couch_view, start_link, []}
external_manager={couch_external_manager, start_link, []}
-db_update_notifier={couch_db_update_notifier_sup, start_link, []}
query_servers={couch_query_servers, start_link, []}
httpd={couch_httpd, start_link, []}
stats_aggregator={couch_stats_aggregator, start, []}
View
@@ -38,6 +38,7 @@ source_files = \
couch_db_update_notifier.erl \
couch_db_update_notifier_sup.erl \
couch_doc.erl \
+ couch_drv.erl \
couch_event_sup.erl \
couch_external_manager.erl \
couch_external_server.erl \
@@ -59,6 +60,7 @@ source_files = \
couch_native_process.erl \
couch_os_daemons.erl \
couch_os_process.erl \
+ couch_primary_sup.erl \
couch_query_servers.erl \
couch_ref_counter.erl \
couch_rep.erl \
@@ -70,6 +72,7 @@ source_files = \
couch_rep_sup.erl \
couch_rep_writer.erl \
couch_rep_db_listener.erl \
+ couch_secondary_sup.erl \
couch_server.erl \
couch_server_sup.erl \
couch_stats_aggregator.erl \
@@ -100,6 +103,7 @@ compiled_files = \
couch_db_update_notifier.beam \
couch_db_update_notifier_sup.beam \
couch_doc.beam \
+ couch_drv.beam \
couch_event_sup.beam \
couch_external_manager.beam \
couch_external_server.beam \
@@ -121,6 +125,7 @@ compiled_files = \
couch_native_process.beam \
couch_os_daemons.beam \
couch_os_process.beam \
+ couch_primary_sup.beam \
couch_query_servers.beam \
couch_ref_counter.beam \
couch_rep.beam \
@@ -132,6 +137,7 @@ compiled_files = \
couch_rep_sup.beam \
couch_rep_writer.beam \
couch_rep_db_listener.beam \
+ couch_secondary_sup.beam \
couch_server.beam \
couch_server_sup.beam \
couch_stats_aggregator.beam \
View
@@ -0,0 +1,62 @@
+% 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_drv).
+-behaviour(gen_server).
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2,
+ code_change/3]).
+
+-export([start_link/0]).
+
+-include("couch_db.hrl").
+
+start_link() ->
+ gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
+
+init([]) ->
+ LibDir = util_driver_dir(),
+ case erl_ddll:load(LibDir, "couch_icu_driver") of
+ ok ->
+ {ok, nil};
+ {error, already_loaded} ->
+ ?LOG_INFO("~p reloading couch_icu_driver", [?MODULE]),
+ ok = erl_ddll:reload(LibDir, "couch_icu_driver"),
+ {ok, nil};
+ {error, Error} ->
+ {stop, erl_ddll:format_error(Error)}
+ end.
+
+handle_call(_Request, _From, State) ->
+ {reply, ok, State}.
+
+handle_cast(_Request, State) ->
+ {noreply, State}.
+
+handle_info(_Info, State) ->
+ {noreply, State}.
+
+terminate(_Reason, _State) ->
+ ok.
+
+code_change(_OldVsn, State, _Extra) ->
+
+ {ok, State}.
+
+
+% private API
+util_driver_dir() ->
+ case couch_config:get("couchdb", "util_driver_dir", null) of
+ null ->
+ filename:join(couch_util:priv_dir(), "lib");
+ LibDir0 ->
+ LibDir0
+ end.
@@ -0,0 +1,60 @@
+% 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_primary_sup).
+-behaviour(supervisor).
+-export([init/1, start_link/0]).
+
+start_link() ->
+ supervisor:start_link({local,couch_primary_services}, ?MODULE, []).
+
+init([]) ->
+ Children = [
+ {collation_driver,
+ {couch_drv, start_link, []},
+ permanent,
+ infinity,
+ supervisor,
+ [couch_drv]},
+ {couch_task_status,
+ {couch_task_status, start_link, []},
+ permanent,
+ brutal_kill,
+ worker,
+ [couch_task_status]},
+ {couch_server,
+ {couch_server, sup_start_link, []},
+ permanent,
+ brutal_kill,
+ worker,
+ [couch_server]},
+ {couch_db_update_event,
+ {gen_event, start_link, [{local, couch_db_update}]},
+ permanent,
+ brutal_kill,
+ worker,
+ dynamic},
+ {couch_replication_supervisor,
+ {couch_rep_sup, start_link, []},
+ permanent,
+ infinity,
+ supervisor,
+ [couch_rep_sup]},
+ {couch_log,
+ {couch_log, start_link, []},
+ permanent,
+ brutal_kill,
+ worker,
+ [couch_log]}
+ ],
+ {ok, {{one_for_one, 10, 3600}, Children}}.
+
@@ -0,0 +1,42 @@
+% 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_secondary_sup).
+-behaviour(supervisor).
+-export([init/1, start_link/0]).
+
+start_link() ->
+ supervisor:start_link({local,couch_secondary_services}, ?MODULE, []).
+
+init([]) ->
+ SecondarySupervisors = [
+ {couch_db_update_notifier_sup,
+ {couch_db_update_notifier_sup, start_link, []},
+ permanent,
+ infinity,
+ supervisor,
+ [couch_db_update_notifier_sup]}
+ ],
+ Children = SecondarySupervisors ++ [
+ begin
+ {ok, {Module, Fun, Args}} = couch_util:parse_term(SpecStr),
+
+ {list_to_atom(Name),
+ {Module, Fun, Args},
+ permanent,
+ brutal_kill,
+ worker,
+ [Module]}
+ end
+ || {Name, SpecStr}
+ <- couch_config:get("daemons"), SpecStr /= ""],
+ {ok, {{one_for_one, 10, 3600}, Children}}.
@@ -15,7 +15,6 @@
-export([start_link/1,stop/0, couch_config_start_link_wrapper/2,
- start_primary_services/0,start_secondary_services/0,
restart_core_server/0, config_change/2]).
-include("couch_db.hrl").
@@ -68,15 +67,6 @@ start_server(IniFiles) ->
_ -> ok
end,
- LibDir =
- case couch_config:get("couchdb", "util_driver_dir", null) of
- null ->
- filename:join(couch_util:priv_dir(), "lib");
- LibDir0 -> LibDir0
- end,
-
- ok = couch_util:start_driver(LibDir),
-
BaseChildSpecs =
{{one_for_all, 10, 3600},
[{couch_config,
@@ -86,17 +76,17 @@ start_server(IniFiles) ->
worker,
[couch_config]},
{couch_primary_services,
- {couch_server_sup, start_primary_services, []},
+ {couch_primary_sup, start_link, []},
permanent,
infinity,
supervisor,
- [couch_server_sup]},
+ [couch_primary_sup]},
{couch_secondary_services,
- {couch_server_sup, start_secondary_services, []},
+ {couch_secondary_sup, start_link, []},
permanent,
infinity,
supervisor,
- [couch_server_sup]}
+ [couch_secondary_sup]}
]},
% ensure these applications are running
@@ -126,60 +116,6 @@ start_server(IniFiles) ->
{ok, Pid}.
-start_primary_services() ->
- supervisor:start_link({local, couch_primary_services}, couch_server_sup,
- {{one_for_one, 10, 3600},
- [{couch_log,
- {couch_log, start_link, []},
- permanent,
- brutal_kill,
- worker,
- [couch_log]},
- {couch_replication_supervisor,
- {couch_rep_sup, start_link, []},
- permanent,
- infinity,
- supervisor,
- [couch_rep_sup]},
- {couch_task_status,
- {couch_task_status, start_link, []},
- permanent,
- brutal_kill,
- worker,
- [couch_task_status]},
- {couch_server,
- {couch_server, sup_start_link, []},
- permanent,
- 1000,
- worker,
- [couch_server]},
- {couch_db_update_event,
- {gen_event, start_link, [{local, couch_db_update}]},
- permanent,
- brutal_kill,
- worker,
- dynamic}
- ]
- }).
-
-start_secondary_services() ->
- DaemonChildSpecs = [
- begin
- {ok, {Module, Fun, Args}} = couch_util:parse_term(SpecStr),
-
- {list_to_atom(Name),
- {Module, Fun, Args},
- permanent,
- 1000,
- worker,
- [Module]}
- end
- || {Name, SpecStr}
- <- couch_config:get("daemons"), SpecStr /= ""],
-
- supervisor:start_link({local, couch_secondary_services}, couch_server_sup,
- {{one_for_one, 10, 3600}, DaemonChildSpecs}).
-
stop() ->
catch exit(whereis(couch_server_sup), normal).
View
@@ -12,7 +12,7 @@
-module(couch_util).
--export([priv_dir/0, start_driver/1, normpath/1]).
+-export([priv_dir/0, normpath/1]).
-export([should_flush/0, should_flush/1, to_existing_atom/1]).
-export([rand32/0, implode/2, collate/2, collate/3]).
-export([abs_pathname/1,abs_pathname/2, trim/1]).
@@ -44,16 +44,6 @@ priv_dir() ->
Dir -> Dir
end.
-start_driver(LibDir) ->
- case erl_ddll:load_driver(LibDir, "couch_icu_driver") of
- ok ->
- ok;
- {error, already_loaded} ->
- ok = erl_ddll:reload_driver(LibDir, "couch_icu_driver");
- {error, Error} ->
- exit(erl_ddll:format_error(Error))
- end.
-
% Normalize a pathname by removing .. and . components.
normpath(Path) ->
normparts(filename:split(Path), []).
View
5 test/etap/002-icu-driver.t 100644 → 100755
@@ -11,12 +11,15 @@
% License for the specific language governing permissions and limitations under
% the License.
+default_config() ->
+ test_util:build_file("etc/couchdb/default_dev.ini").
main(_) ->
test_util:init_code_path(),
+ couch_config:start_link([default_config()]),
etap:plan(3),
etap:is(
- couch_util:start_driver("src/couchdb/priv/.libs"),
+ element(1, couch_drv:start_link()),
ok,
"Started couch_icu_driver."
),

0 comments on commit c39a750

Please sign in to comment.