diff options
-rw-r--r-- | share/www/script/test/delayed_commits.js | 22 | ||||
-rw-r--r-- | src/couchdb/couch_db.erl | 6 |
2 files changed, 25 insertions, 3 deletions
diff --git a/share/www/script/test/delayed_commits.js b/share/www/script/test/delayed_commits.js index daebdb8d..0ead2d84 100644 --- a/share/www/script/test/delayed_commits.js +++ b/share/www/script/test/delayed_commits.js @@ -90,4 +90,26 @@ couchTests.delayed_commits = function(debug) { T(db.open("4") != null); + // Now test that when we exceed the max_dbs_open, pending commits are safely + // written. + T(db.save({_id:"5",foo:"bar"}).ok); + var max = 2; + run_on_modified_server( + [{section: "couchdb", + key: "max_dbs_open", + value: max.toString()}], + + function () { + for(var i=0; i<max; i++) { + var dbi = new CouchDB("test_suite_db" + i); + dbi.deleteDb(); + dbi.createDb(); + } + T(db.open("5").foo=="bar"); + for(var i=0; i<max+1; i++) { + var dbi = new CouchDB("test_suite_db" + i); + dbi.deleteDb(); + } + }); + }; diff --git a/src/couchdb/couch_db.erl b/src/couchdb/couch_db.erl index a4b79ae5..db865482 100644 --- a/src/couchdb/couch_db.erl +++ b/src/couchdb/couch_db.erl @@ -691,11 +691,11 @@ terminate(Reason, _Db) -> handle_call({open_ref_count, OpenerPid}, _, #db{fd_ref_counter=RefCntr}=Db) -> ok = couch_ref_counter:add(RefCntr, OpenerPid), {reply, {ok, Db}, Db}; -handle_call(is_idle, _From, - #db{fd_ref_counter=RefCntr, compactor_pid=Compact}=Db) -> +handle_call(is_idle, _From, #db{fd_ref_counter=RefCntr, compactor_pid=Compact, + waiting_delayed_commit=Delay}=Db) -> % Idle means no referrers. Unless in the middle of a compaction file switch, % there are always at least 2 referrers, couch_db_updater and us. - {reply, (Compact == nil) and (couch_ref_counter:count(RefCntr) == 2), Db}; + {reply, (Delay == nil) and (Compact == nil) and (couch_ref_counter:count(RefCntr) == 2), Db}; handle_call({db_updated, #db{fd_ref_counter=NewRefCntr}=NewDb}, _From, #db{fd_ref_counter=OldRefCntr}) -> case NewRefCntr == OldRefCntr of |