You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ja...@apache.org on 2008/06/04 16:18:16 UTC
svn commit: r663113 - in /incubator/couchdb/branches/runtimeconfig:
etc/Makefile.am etc/couchdb/Makefile.am src/couchdb/couch_config.erl
src/couchdb/couch_config_writer.erl src/couchdb/couch_httpd.erl
src/couchdb/couch_server.erl
Author: jan
Date: Wed Jun 4 07:18:16 2008
New Revision: 663113
URL: http://svn.apache.org/viewvc?rev=663113&view=rev
Log:
The runtimeconfig branch is now equipped with everything that it needs to be merged back, it just needs a bit of a clean-up. I'm committing this as an intermediate stage.
Modified:
incubator/couchdb/branches/runtimeconfig/etc/Makefile.am
incubator/couchdb/branches/runtimeconfig/etc/couchdb/Makefile.am
incubator/couchdb/branches/runtimeconfig/src/couchdb/couch_config.erl
incubator/couchdb/branches/runtimeconfig/src/couchdb/couch_config_writer.erl
incubator/couchdb/branches/runtimeconfig/src/couchdb/couch_httpd.erl
incubator/couchdb/branches/runtimeconfig/src/couchdb/couch_server.erl
Modified: incubator/couchdb/branches/runtimeconfig/etc/Makefile.am
URL: http://svn.apache.org/viewvc/incubator/couchdb/branches/runtimeconfig/etc/Makefile.am?rev=663113&r1=663112&r2=663113&view=diff
==============================================================================
--- incubator/couchdb/branches/runtimeconfig/etc/Makefile.am (original)
+++ incubator/couchdb/branches/runtimeconfig/etc/Makefile.am Wed Jun 4 07:18:16 2008
@@ -46,7 +46,7 @@
mkdir default; \
fi \
fi
- sed -r -e "s|%configure_input%|$@. Generated from $< by configure.|" \
+ sed -E -e "s|%configure_input%|$@. Generated from $< by configure.|" \
-e "s|%pkgconfdir%|$(abs_pkgconfdir)|g" \
-e "s|%sysconfdir%|$(abs_sysconfdir)|" \
-e "s|%localstatedir%|$(abs_localstatedir)|" \
@@ -60,7 +60,7 @@
mkdir init; \
fi \
fi
- sed -r -e "s|%configure_input%|$@. Generated from $< by configure.|" \
+ sed -E -e "s|%configure_input%|$@. Generated from $< by configure.|" \
-e "s|%bindir%|$(abs_bindir)|" \
-e "s|%sysconfdir%|$(abs_sysconfdir)|" \
-e "s|%erlangbindir%|$(abs_erlangbindir)|" \
@@ -78,7 +78,7 @@
mkdir launchd; \
fi \
fi
- sed -r -e "s|%configure_input%|$@. Generated from $< by configure.|" \
+ sed -E -e "s|%configure_input%|$@. Generated from $< by configure.|" \
-e "s|%bindir%|$(abs_bindir)|" \
-e "s|%couchdb_command_name%|$(couchdb_command_name)|" \
< $< > $@
Modified: incubator/couchdb/branches/runtimeconfig/etc/couchdb/Makefile.am
URL: http://svn.apache.org/viewvc/incubator/couchdb/branches/runtimeconfig/etc/couchdb/Makefile.am?rev=663113&r1=663112&r2=663113&view=diff
==============================================================================
--- incubator/couchdb/branches/runtimeconfig/etc/couchdb/Makefile.am (original)
+++ incubator/couchdb/branches/runtimeconfig/etc/couchdb/Makefile.am Wed Jun 4 07:18:16 2008
@@ -28,7 +28,7 @@
abs_pkgstatelogdir = $(abspath $(pkgstatelogdir))
couch.ini: couch.ini.tpl
- sed -r -e "s|%bindir%|$(abs_bindir)|g" \
+ sed -E -e "s|%bindir%|$(abs_bindir)|g" \
-e "s|%pkgconfdir%|$(abs_pkgconfdir)|g" \
-e "s|%pkgdatadir%|$(abs_pkgdatadir)|g" \
-e "s|%pkgstatelibdir%|$(abs_pkgstatelibdir)|g" \
Modified: incubator/couchdb/branches/runtimeconfig/src/couchdb/couch_config.erl
URL: http://svn.apache.org/viewvc/incubator/couchdb/branches/runtimeconfig/src/couchdb/couch_config.erl?rev=663113&r1=663112&r2=663113&view=diff
==============================================================================
--- incubator/couchdb/branches/runtimeconfig/src/couchdb/couch_config.erl (original)
+++ incubator/couchdb/branches/runtimeconfig/src/couchdb/couch_config.erl Wed Jun 4 07:18:16 2008
@@ -16,29 +16,34 @@
-define(DEFAULT_INI, "couch.ini").
-behaviour(gen_server).
--export([start_link/0, init/1 ,
+-export([start_link/0, init/1, stop/0,
handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
--export([store/2,
+-export([store/2, register/2, lookup_and_register/2,
lookup/1, lookup/2, lookup_match/1, lookup_match/2, dump/0,
init_value/2, unset/1, load_ini_file/1,
load_ini_files/1]).
start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
+stop() ->
+ ok.
+
init_value(Key, Value) -> gen_server:call(?MODULE, {init_value, Key, Value}).
store(Key, Value) -> gen_server:call(?MODULE, {store, [{Key, Value}]}).
lookup(Key) -> gen_server:call(?MODULE, {lookup, Key}).
lookup(Key, Default) -> gen_server:call(?MODULE, {lookup, Key, Default}).
+lookup_and_register(Key, CallbackFunction) -> gen_server:call(?MODULE, {lookup_and_register, Key, CallbackFunction}).
lookup_match(Key) -> gen_server:call(?MODULE, {lookup_match, Key}).
lookup_match(Key, Default) -> gen_server:call(?MODULE, {lookup_match, Key, Default}).
dump() -> gen_server:call(?MODULE, {dump, []}).
+register(Key, Fun) -> gen_server:call(?MODULE, {register, Key, Fun}).
unset(Key) -> gen_server:call(?MODULE, {unset, Key}).
init([]) ->
- Tap = ets:new(?MODULE, []),
- {ok, Tap}.
+ Tab = ets:new(?MODULE, [set]),
+ {ok, Tab}.
handle_call({store, Config}, _From, Tab) ->
[insert_and_commit(Tab, Config2) || Config2 <- Config],
@@ -54,10 +59,14 @@
handle_call({lookup, Key}, _From, Tab) ->
lookup(Key, fun(Tab_, Key_) -> ets:lookup(Tab_, Key_) end, null, Tab);
-
+
handle_call({lookup, Key, Default}, _From, Tab) ->
lookup(Key, fun(Tab_, Key_) -> ets:lookup(Tab_, Key_) end, Default, Tab);
+handle_call({lookup_and_register, Key, CallbackFunction}, _From, Tab) ->
+ ?MODULE:handle_call({register, Key, CallbackFunction}, _From, Tab),
+ lookup(Key, fun(Tab_, Key_) -> ets:lookup(Tab_, Key_) end, null, Tab);
+
handle_call({lookup_match, Key}, _From, Tab) ->
lookup(Key, fun(Tab_, Key_) -> ets:match(Tab_, Key_) end, null, Tab);
@@ -66,8 +75,30 @@
handle_call({dump, []}, _From, Tab) ->
io:format("~p~n", [ets:match(Tab, '$1')]),
+ {reply, ok, Tab};
+
+handle_call({register, Key, Fun}, From, Tab) ->
+ io:format("registered for '~p' '", [Key]),
+ ets:insert(Tab, {{"_CouchDB", Key}, {From, Fun}}),
{reply, ok, Tab}.
+notify_registered_modules(Tab, {{Module, Variable}, _Value}) ->
+ % ModuleName = atom_to_list(Module),
+ % VariableName = atom_to_list(Variable),
+ Look = ets:lookup(Tab, {"_CouchDB", {Module, Variable}}),
+ io:format("looked for '~p' and got '~p'~n", [{Module, Variable}, Look]),
+
+ case Look of
+ % found
+ [{{"_CouchDB", {Module, Variable}}, {_From, Fun}}] ->
+ io:format("got it '~p'~n", [ets:lookup(Tab, {Module, Variable})]),
+ Fun();
+ _ -> % not found
+ io:format("not it~n", []),
+ ok
+ end.
+
+
lookup(Key, Fun, Default, Tab) ->
Reply = case Fun(Tab, Key) of
[{Key, Value}] ->
@@ -80,12 +111,18 @@
{reply, Reply, Tab}.
insert_and_commit(Tab, Config) ->
+ ets:insert(Tab, Config),
+ {Key, _Value} = Config,
+ io:format("just inserted '~p' and now it is '~p~n", [Config, ets:lookup(Tab, Key)]),
{reply, File, _Tab} =
lookup({"_CouchDB", "ConfigurationStorageFile"},
fun(Tab_, Key_) -> ets:lookup(Tab_, Key_) end,
null, Tab
),
- ets:insert(Tab, Config),
+
+ io:format("got it '~p' but stored '~p'~n", [ets:lookup(Tab, {"HTTPd", "Port"}), Config]),
+
+ notify_registered_modules(Tab, Config),
commit(Config, File).
commit(Config, File) ->
@@ -99,7 +136,7 @@
load_ini_files(IniFiles) ->
% store the name of the last ini file for storing changes made at runtime
[LastIniFile|_] = lists:reverse(IniFiles),
- couch_config:init_value({"_CouchDB", "ConfigurationStorageFile"}, LastIniFile),
+ ?MODULE:init_value({"_CouchDB", "ConfigurationStorageFile"}, LastIniFile),
% load all ini files in the order they come in.
lists:foreach(fun(IniFile) -> load_ini_file(IniFile) end, IniFiles).
@@ -145,7 +182,7 @@
lists:foreach(
fun({Key, Value}) ->
- couch_config:init_value(Key, Value)
+ ?MODULE:init_value(Key, Value)
end,
lists:reverse(ParsedIniValues)
),
Modified: incubator/couchdb/branches/runtimeconfig/src/couchdb/couch_config_writer.erl
URL: http://svn.apache.org/viewvc/incubator/couchdb/branches/runtimeconfig/src/couchdb/couch_config_writer.erl?rev=663113&r1=663112&r2=663113&view=diff
==============================================================================
--- incubator/couchdb/branches/runtimeconfig/src/couchdb/couch_config_writer.erl (original)
+++ incubator/couchdb/branches/runtimeconfig/src/couchdb/couch_config_writer.erl Wed Jun 4 07:18:16 2008
@@ -19,8 +19,8 @@
{ok, Lines} = regexp:split(binary_to_list(Stream), "\r\n|\n|\r|\032"),
% prepare input variables
- ModuleName = "[" ++ atom_to_list(Module) ++ "]",
- VariableList = atom_to_list(Variable),
+ ModuleName = "[" ++ Module ++ "]",
+ VariableList = Variable,
% produce the contents for the config file
NewFileContents = save_loop({{ModuleName, VariableList}, Value}, Lines, "", "", []),
Modified: incubator/couchdb/branches/runtimeconfig/src/couchdb/couch_httpd.erl
URL: http://svn.apache.org/viewvc/incubator/couchdb/branches/runtimeconfig/src/couchdb/couch_httpd.erl?rev=663113&r1=663112&r2=663113&view=diff
==============================================================================
--- incubator/couchdb/branches/runtimeconfig/src/couchdb/couch_httpd.erl (original)
+++ incubator/couchdb/branches/runtimeconfig/src/couchdb/couch_httpd.erl Wed Jun 4 07:18:16 2008
@@ -13,7 +13,7 @@
-module(couch_httpd).
-include("couch_db.hrl").
--export([start_link/0, stop/0, handle_request/2]).
+-export([start_link/0, stop/0, handle_request/1, handle_request/2]).
% Maximum size of document PUT request body (4GB)
-define(MAX_DOC_SIZE, (4*1024*1024*1024)).
@@ -39,11 +39,21 @@
}).
start_link() ->
- % read config
- BindAddress = couch_config:lookup({"HTTPd", "BindAddress"}),
- Port = couch_config:lookup({"HTTPd", "Port"}),
- DocumentRoot = couch_config:lookup({"HTTPd", "DocumentRoot"}),
+
+ % read config and register for configuration changes
+
+ % just stop if one of the config settings change. couch_server_sup
+ % will restart us and then we will pick up the new settings.
+ ConfigChangeCallbackFunction = fun() -> couch_httpd:stop() end,
+ BindAddress = couch_config:lookup_and_register(
+ {"HTTPd", "BindAddress"}, ConfigChangeCallbackFunction),
+ Port = couch_config:lookup_and_register(
+ {"HTTPd", "Port"}, ConfigChangeCallbackFunction),
+ DocumentRoot = couch_config:lookup_and_register(
+ {"HTTPd", "DocumentRoot"}, ConfigChangeCallbackFunction),
+
+ % and off we go
Loop = fun (Req) -> apply(couch_httpd, handle_request, [Req, DocumentRoot]) end,
mochiweb_http:start([
{loop, Loop},
@@ -55,6 +65,9 @@
stop() ->
mochiweb_http:stop(?MODULE).
+handle_request(config_change) ->
+ stop().
+
handle_request(Req, DocumentRoot) ->
% alias HEAD to GET as mochiweb takes care of stripping the body
Method = case Req:get(method) of
@@ -649,7 +662,7 @@
handle_config_request(_Req, Method, {config, Config}) ->
[Module, Key] = string:tokens(Config, "/"),
- handle_config_request(_Req, Method, {[list_to_atom(Module), list_to_atom(Key)]});
+ handle_config_request(_Req, Method, {[Module, Key]});
% PUT /_config/Module/Key
Modified: incubator/couchdb/branches/runtimeconfig/src/couchdb/couch_server.erl
URL: http://svn.apache.org/viewvc/incubator/couchdb/branches/runtimeconfig/src/couchdb/couch_server.erl?rev=663113&r1=663112&r2=663113&view=diff
==============================================================================
--- incubator/couchdb/branches/runtimeconfig/src/couchdb/couch_server.erl (original)
+++ incubator/couchdb/branches/runtimeconfig/src/couchdb/couch_server.erl Wed Jun 4 07:18:16 2008
@@ -14,7 +14,7 @@
-behaviour(gen_server).
-behaviour(application).
--export([start/0,start/1,start/2,stop/0,stop/1]).
+-export([start/0,start/1,start/2,stop/0,stop/1,restart/0]).
-export([open/1,create/2,delete/1,all_databases/0,get_version/0]).
-export([init/1, handle_call/3,sup_start_link/0]).
-export([handle_cast/2,code_change/3,handle_info/2,terminate/2]).
@@ -37,6 +37,10 @@
start(_Type, _Args) ->
start().
+restart() ->
+ stop(),
+ start().
+
stop() ->
couch_server_sup:stop().