diff options
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | apps/couch/src/couch_server.erl | 30 | ||||
-rwxr-xr-x | configure | 9 | ||||
-rw-r--r-- | couchjs/c_src/SConscript | 3 | ||||
-rwxr-xr-x | rel/overlay/bin/remsh | 39 | ||||
-rw-r--r-- | rel/overlay/etc/default.ini | 22 | ||||
-rw-r--r-- | rel/overlay/etc/vm.args | 13 | ||||
-rw-r--r-- | rel/reltool.config | 1 |
8 files changed, 91 insertions, 27 deletions
@@ -24,6 +24,7 @@ compile: clean: @echo "==> couchjs (clean)" @cd couchjs && python scons/scons.py --clean + @rm -rf couchjs/.sconf_temp couchjs/.sconsign.dblite @./rebar clean # compile is required here because of cross-dependencies between apps diff --git a/apps/couch/src/couch_server.erl b/apps/couch/src/couch_server.erl index f9c960c5..c7850990 100644 --- a/apps/couch/src/couch_server.erl +++ b/apps/couch/src/couch_server.erl @@ -199,16 +199,28 @@ try_close_lru(StartTime) -> % There may exist an extremely small possibility of a race % condition here, if a process could lookup the DB before the lock, % but fail to monitor the fd before the is_idle check. - true = ets:update_element(couch_dbs, DbName, {#db.fd_monitor, locked}), - [#db{main_pid = Pid} = Db] = ets:lookup(couch_dbs, DbName), - case couch_db:is_idle(Db) of true -> - true = ets:delete(couch_dbs, DbName), - true = ets:delete(couch_lru, DbName), - exit(Pid, kill), - ok; + % + % If we do hit this race condition the behavior is that the process + % grabbing the database will end up inserting a value into the + % couch_lru table. Its possible that we end up picking that up + % as the DbName above to close. So we here we'll just remove the + % couch_lru entry and ignore it. + case ets:update_element(couch_dbs, DbName, {#db.fd_monitor, locked}) of + true -> + [#db{main_pid = Pid} = Db] = ets:lookup(couch_dbs, DbName), + case couch_db:is_idle(Db) of true -> + true = ets:delete(couch_dbs, DbName), + true = ets:delete(couch_lru, DbName), + exit(Pid, kill), + ok; + false -> + Update = {#db.fd_monitor, nil}, + true = ets:update_element(couch_dbs, DbName, Update), + true = ets:insert(couch_lru, {DbName, now()}), + try_close_lru(StartTime) + end; false -> - true = ets:update_element(couch_dbs, DbName, {#db.fd_monitor, nil}), - true = ets:insert(couch_lru, {DbName, now()}), + true = ets:delete(couch_lru, DbName), try_close_lru(StartTime) end end. @@ -44,8 +44,12 @@ do BIGCOUCH_USER=$2 shift 2 ;; + -c) + COOKIE=$2 + shift 2 + ;; *) - echo "usage: $0 [-p {prefix} -t {template} -d {data_dir} -v {view_dir} -u {user}]" + echo "usage: $0 [-p {prefix} -t {template} -d {data_dir} -v {view_dir} -u {user} -c {cookie}]" exit ;; esac @@ -53,6 +57,7 @@ done if test ! -n "$DATA"; then DATA="$PREFIX/var/lib"; fi if test ! -n "$VIEW"; then VIEW="$PREFIX/var/lib"; fi +if test -n "$COOKIE"; then COOKIE="-setcookie $COOKIE"; fi echo "==> configuring bigcouch in rel/bigcouch.config" cat > rel/bigcouch.config << EOF @@ -61,6 +66,7 @@ cat > rel/bigcouch.config << EOF {view_dir, "$VIEW"}. {user, "$BIGCOUCH_USER"}. {node_name, "-name bigcouch"}. +{cookie, "$COOKIE"}. {cluster_port, 5984}. {cluster_ssl, 6984}. {backend_port, 5986}. @@ -81,6 +87,7 @@ cat > rel/dev$i.config << EOF {data_dir, "$DIRPATH/rel/tmpdata/dev$i"}. {view_dir, "$DIRPATH/rel/tmpdata/dev$i"}. {node_name, "-name dev$i@127.0.0.1"}. +{cookie, "$COOKIE"}. {cluster_port, `expr 10000 \* $i + 5984`}. {cluster_ssl, `expr 10000 \* $i + 6984`}. {backend_port, `expr 10000 \* $i + 5986`}. diff --git a/couchjs/c_src/SConscript b/couchjs/c_src/SConscript index a3e0cc07..a5f8b66b 100644 --- a/couchjs/c_src/SConscript +++ b/couchjs/c_src/SConscript @@ -13,7 +13,6 @@ # the License. import os import commands -import subprocess def require_lib(name): if not conf.CheckLib(name): @@ -89,7 +88,7 @@ if not env.GetOption('clean'): ## Define properties for -h / -V - vsn = subprocess.check_output(["git","describe","--match","1.*"]) + (_, vsn) = runcmd("git describe --match 1.*") conf.Define("PACKAGE_STRING", '"%s"' % vsn.rstrip()) conf.Define("PACKAGE_NAME", '"Cloudant BigCouch"') conf.Define("PACKAGE_BUGREPORT", '"https://github.com/cloudant/bigcouch/issues"') diff --git a/rel/overlay/bin/remsh b/rel/overlay/bin/remsh new file mode 100755 index 00000000..39955ae8 --- /dev/null +++ b/rel/overlay/bin/remsh @@ -0,0 +1,39 @@ +#!/bin/bash + +# 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. + +NAME="remsh$$" +REM_NODE="{{node_name}}" +NAME_TYPE=${REM_NODE% *} +REM_NODE=${REM_NODE#* } +HOST=`echo "$REM_NODE" | grep -o "@.*" | sed 's/@//'` + +if test -n $HOST; then + NAME="$NAME_TYPE $NAME@$HOST" +else + NAME="$NAME_TYPE $NAME" +fi + +ERTS_BIN_DIR=$(cd ${0%/*} && pwd) +ROOTDIR=${ERTS_BIN_DIR%/*} + +START_ERL=`cat $ROOTDIR/releases/start_erl.data` +ERTS_VSN=${START_ERL% *} +APP_VSN=${START_ERL#* } +START_CLEAN="${ROOTDIR}/releases/${APP_VSN}/start_clean" + +BINDIR=$ROOTDIR/erts-$ERTS_VSN/bin + +COOKIE="{{cookie}}" + +exec $BINDIR/erl $NAME -remsh $REM_NODE $COOKIE -hidden -boot $START_CLEAN diff --git a/rel/overlay/etc/default.ini b/rel/overlay/etc/default.ini index 55371083..fdd11e14 100644 --- a/rel/overlay/etc/default.ini +++ b/rel/overlay/etc/default.ini @@ -7,16 +7,21 @@ max_dbs_open = 500 delayed_commits = false [cluster] -q=8 -r=2 -w=2 -n=3 +; Default number of shards for a new database +q = 8 +; Default number of copies of each shard +n = 3 [chttpd] port = {{cluster_port}} -backlog = 512 docroot = {{prefix}}/share/www +; Options for the MochiWeb HTTP server. +;server_options = [{backlog, 128}, {acceptor_pool_size, 16}] + +; For more socket options, consult Erlang's module 'inet' man page. +;socket_options = [{recbuf, 262144}, {sndbuf, 262144}, {nodelay, true}] + [chttps] port = {{cluster_ssl}} @@ -41,16 +46,11 @@ ssl_certificate_max_depth = 1 [httpd] port = {{backend_port}} bind_address = 127.0.0.1 -max_connections = 2048 authentication_handlers = {couch_httpd_oauth, oauth_authentication_handler}, {couch_httpd_auth, cookie_authentication_handler}, {couch_httpd_auth, default_authentication_handler} default_handler = {couch_httpd_db, handle_request} secure_rewrites = true vhost_global_handlers = _utils, _uuids, _session, _oauth, _users allow_jsonp = false -; Options for the MochiWeb HTTP server. -;server_options = [{backlog, 128}, {acceptor_pool_size, 16}] -; For more socket options, consult Erlang's module 'inet' man page. -;socket_options = [{recbuf, 262144}, {sndbuf, 262144}, {nodelay, true}] log_max_chunk_size = 1000000 [ssl] @@ -73,7 +73,7 @@ javascript = {{prefix}}/bin/couchjs {{prefix}}/share/couchjs/main.js [query_server_config] reduce_limit = true -os_process_limit = 25 +os_process_soft_limit = 100 [daemons] view_manager={couch_view, start_link, []} diff --git a/rel/overlay/etc/vm.args b/rel/overlay/etc/vm.args index bb143502..03e5af27 100644 --- a/rel/overlay/etc/vm.args +++ b/rel/overlay/etc/vm.args @@ -4,10 +4,15 @@ # with the -name flag. {{node_name}} -# All nodes must share the same magic cookie for distributed Erlang to work. -# Comment out this line if you synchronized the cookies by other means (using -# the ~/.erlang.cookie file, for example). --setcookie monster +# If you passed a value for the cookie to ./configure it will be set here. +# Otherwise it will default to using ~/.erlang.cookie which will be generated +# automatically if it doesn't exist. +# +# Note that you need to make sure that the cookie value used is synchronized +# across all nodes in the cluster. This means that if you don't set the +# cookie by hand you need to manually sync ~/.erlang.cookie across all nodes +# in the cluster. +{{cookie}} # Tell SASL not to log progress reports -sasl errlog_type error diff --git a/rel/reltool.config b/rel/reltool.config index d8403865..ccca5aed 100644 --- a/rel/reltool.config +++ b/rel/reltool.config @@ -57,6 +57,7 @@ {copy, "overlay/share"}, {copy, "../couchjs/build/couchjs", "bin/couchjs"}, {copy, "../couchjs/build/main.js", "share/couchjs/main.js"}, + {template, "overlay/bin/remsh", "bin/remsh"}, {template, "overlay/etc/default.ini", "etc/default.ini"}, {template, "overlay/etc/vm.args", "etc/vm.args"} ]}. |