summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile1
-rw-r--r--apps/couch/src/couch_server.erl30
-rwxr-xr-xconfigure9
-rw-r--r--couchjs/c_src/SConscript3
-rwxr-xr-xrel/overlay/bin/remsh39
-rw-r--r--rel/overlay/etc/default.ini22
-rw-r--r--rel/overlay/etc/vm.args13
-rw-r--r--rel/reltool.config1
8 files changed, 91 insertions, 27 deletions
diff --git a/Makefile b/Makefile
index 4bf74e8c..ef6236cd 100644
--- a/Makefile
+++ b/Makefile
@@ -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.
diff --git a/configure b/configure
index 0e299604..72d441e2 100755
--- a/configure
+++ b/configure
@@ -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"}
]}.