diff options
author | Nick Vatamaniuc <vatamane@apache.org> | 2019-09-26 01:33:01 -0400 |
---|---|---|
committer | Nick Vatamaniuc <nickva@users.noreply.github.com> | 2019-09-26 13:32:31 -0400 |
commit | dc054e7ddcc3ea059e1f86a7039cf86912ab1052 (patch) | |
tree | 41e1086713f8062134e4f4feb3643747025c4885 | |
parent | 77f64b4f4beb1b8ee7449cf2ff73d7f162366229 (diff) | |
download | couchdb-dc054e7ddcc3ea059e1f86a7039cf86912ab1052.tar.gz |
Remove delayed commits option
This effectively removes a lot couch_db:ensure_full_commit/1,2 calls.
Low level fsync configuration options are also removed as it might be tempting
to start using those instead of delayed commits, however unlike delayed
commits, changing those default could lead to data corruption.
`/_ensure_full_commit` HTTP API was left as is since replicator from older
versions of CouchDB would call that, it just returns the start time as if
ensure_commit function was called.
Issue: https://github.com/apache/couchdb/issues/2165
34 files changed, 32 insertions, 268 deletions
diff --git a/rel/overlay/etc/default.ini b/rel/overlay/etc/default.ini index dbb0744b9..3a363947b 100644 --- a/rel/overlay/etc/default.ini +++ b/rel/overlay/etc/default.ini @@ -10,7 +10,6 @@ view_index_dir = {{view_index_dir}} ; plugin_dir = os_process_timeout = 5000 ; 5 seconds. for view servers. max_dbs_open = 500 -delayed_commits = false ; Method used to compress everything that is appended to database and view index files, except ; for attachments (see the attachments section). Available methods are: ; diff --git a/src/couch/src/couch_bt_engine.erl b/src/couch/src/couch_bt_engine.erl index f4ff9a8d3..e3e4d0d32 100644 --- a/src/couch/src/couch_bt_engine.erl +++ b/src/couch/src/couch_bt_engine.erl @@ -567,7 +567,6 @@ copy_purge_infos(#st{} = St, PurgeInfos) -> commit_data(St) -> #st{ fd = Fd, - fsync_options = FsyncOptions, header = OldHeader, needs_commit = NeedsCommit } = St, @@ -576,13 +575,9 @@ commit_data(St) -> case NewHeader /= OldHeader orelse NeedsCommit of true -> - Before = lists:member(before_header, FsyncOptions), - After = lists:member(after_header, FsyncOptions), - - if Before -> couch_file:sync(Fd); true -> ok end, + couch_file:sync(Fd), ok = couch_file:write_header(Fd, NewHeader), - if After -> couch_file:sync(Fd); true -> ok end, - + couch_file:sync(Fd), {ok, St#st{ header = NewHeader, needs_commit = false @@ -872,14 +867,7 @@ open_db_file(FilePath, Options) -> init_state(FilePath, Fd, Header0, Options) -> - DefaultFSync = "[before_header, after_header, on_file_open]", - FsyncStr = config:get("couchdb", "fsync_options", DefaultFSync), - {ok, FsyncOptions} = couch_util:parse_term(FsyncStr), - - case lists:member(on_file_open, FsyncOptions) of - true -> ok = couch_file:sync(Fd); - _ -> ok - end, + ok = couch_file:sync(Fd), Compression = couch_compress:get_compression_method(), @@ -930,7 +918,6 @@ init_state(FilePath, Fd, Header0, Options) -> filepath = FilePath, fd = Fd, fd_monitor = erlang:monitor(process, Fd), - fsync_options = FsyncOptions, header = Header, needs_commit = false, id_tree = IdTree, diff --git a/src/couch/src/couch_bt_engine.hrl b/src/couch/src/couch_bt_engine.hrl index 1f5bcc9df..e3c1d4983 100644 --- a/src/couch/src/couch_bt_engine.hrl +++ b/src/couch/src/couch_bt_engine.hrl @@ -14,7 +14,8 @@ filepath, fd, fd_monitor, - fsync_options, + % deprecated but keeping it here to avoid altering the record size + fsync_options_deprecated, header, needs_commit, id_tree, diff --git a/src/couch/src/couch_db.erl b/src/couch/src/couch_db.erl index 6135813ae..1e09b9e74 100644 --- a/src/couch/src/couch_db.erl +++ b/src/couch/src/couch_db.erl @@ -65,9 +65,6 @@ set_security/2, set_user_ctx/2, - ensure_full_commit/1, - ensure_full_commit/2, - load_validation_funs/1, reload_validation_funs/1, @@ -226,21 +223,12 @@ is_partitioned(#db{options = Options}) -> Props = couch_util:get_value(props, Options, []), couch_util:get_value(partitioned, Props, false). -ensure_full_commit(#db{main_pid=Pid, instance_start_time=StartTime}) -> - ok = gen_server:call(Pid, full_commit, infinity), - {ok, StartTime}. - -ensure_full_commit(Db, RequiredSeq) -> - #db{main_pid=Pid, instance_start_time=StartTime} = Db, - ok = gen_server:call(Pid, {full_commit, RequiredSeq}, infinity), - {ok, StartTime}. - close(#db{} = Db) -> ok = couch_db_engine:decref(Db); close(?OLD_DB_REC) -> ok. -is_idle(#db{compactor_pid=nil, waiting_delayed_commit=nil} = Db) -> +is_idle(#db{compactor_pid=nil} = Db) -> monitored_by(Db) == []; is_idle(_Db) -> false. @@ -753,9 +741,7 @@ get_security(?OLD_DB_REC = Db) -> set_security(#db{main_pid=Pid}=Db, {NewSecProps}) when is_list(NewSecProps) -> check_is_admin(Db), ok = validate_security_object(NewSecProps), - ok = gen_server:call(Pid, {set_security, NewSecProps}, infinity), - {ok, _} = ensure_full_commit(Db), - ok; + gen_server:call(Pid, {set_security, NewSecProps}, infinity); set_security(_, _) -> throw(bad_request). @@ -1256,24 +1242,6 @@ make_first_doc_on_disk(Db, Id, Pos, [{_Rev, #leaf{deleted=IsDel, ptr=Sp}} |_]=Do Revs = [Rev || {Rev, _} <- DocPath], make_doc(Db, Id, IsDel, Sp, {Pos, Revs}). -set_commit_option(Options) -> - CommitSettings = { - [true || O <- Options, O==full_commit orelse O==delay_commit], - config:get("couchdb", "delayed_commits", "false") - }, - case CommitSettings of - {[true], _} -> - Options; % user requested explicit commit setting, do not change it - {_, "true"} -> - Options; % delayed commits are enabled, do nothing - {_, "false"} -> - [full_commit|Options]; - {_, Else} -> - couch_log:error("[couchdb] delayed_commits setting must be true/false," - " not ~p", [Else]), - [full_commit|Options] - end. - collect_results_with_metrics(Pid, MRef, []) -> Begin = os:timestamp(), try @@ -1299,14 +1267,12 @@ collect_results(Pid, MRef, ResultsAcc) -> end. write_and_commit(#db{main_pid=Pid, user_ctx=Ctx}=Db, DocBuckets1, - NonRepDocs, Options0) -> + NonRepDocs, Options) -> DocBuckets = prepare_doc_summaries(Db, DocBuckets1), - Options = set_commit_option(Options0), MergeConflicts = lists:member(merge_conflicts, Options), - FullCommit = lists:member(full_commit, Options), MRef = erlang:monitor(process, Pid), try - Pid ! {update_docs, self(), DocBuckets, NonRepDocs, MergeConflicts, FullCommit}, + Pid ! {update_docs, self(), DocBuckets, NonRepDocs, MergeConflicts}, case collect_results_with_metrics(Pid, MRef, []) of {ok, Results} -> {ok, Results}; retry -> @@ -1320,7 +1286,7 @@ write_and_commit(#db{main_pid=Pid, user_ctx=Ctx}=Db, DocBuckets1, % We only retry once DocBuckets3 = prepare_doc_summaries(Db2, DocBuckets2), close(Db2), - Pid ! {update_docs, self(), DocBuckets3, NonRepDocs, MergeConflicts, FullCommit}, + Pid ! {update_docs, self(), DocBuckets3, NonRepDocs, MergeConflicts}, case collect_results_with_metrics(Pid, MRef, []) of {ok, Results} -> {ok, Results}; retry -> throw({update_error, compaction_retry}) diff --git a/src/couch/src/couch_db_int.hrl b/src/couch/src/couch_db_int.hrl index a412b338b..7da0ce5df 100644 --- a/src/couch/src/couch_db_int.hrl +++ b/src/couch/src/couch_db_int.hrl @@ -32,7 +32,9 @@ before_doc_update = nil, % nil | fun(Doc, Db) -> NewDoc after_doc_read = nil, % nil | fun(Doc, Db) -> NewDoc - waiting_delayed_commit = nil, + % feature removed in 3.x, but field kept to avoid changing db record size + % and breaking rolling cluster upgrade + waiting_delayed_commit_deprecated, options = [], compression diff --git a/src/couch/src/couch_db_split.erl b/src/couch/src/couch_db_split.erl index b9c23a998..5bf98b6fd 100644 --- a/src/couch/src/couch_db_split.erl +++ b/src/couch/src/couch_db_split.erl @@ -488,7 +488,6 @@ copy_local_docs(#state{source_db = Db, targets = Targets} = State) -> [_ | _] -> Docs1 = lists:reverse(Docs), {ok, _} = couch_db:update_docs(TDb, Docs1), - {ok, _} = couch_db:ensure_full_commit(TDb), T#target{buffer = []} end end, Targets1), diff --git a/src/couch/src/couch_db_updater.erl b/src/couch/src/couch_db_updater.erl index 4227ff036..6e164e536 100644 --- a/src/couch/src/couch_db_updater.erl +++ b/src/couch/src/couch_db_updater.erl @@ -67,15 +67,6 @@ terminate(Reason, Db) -> handle_call(get_db, _From, Db) -> {reply, {ok, Db}, Db, idle_limit()}; -handle_call(full_commit, _From, #db{waiting_delayed_commit=nil}=Db) -> - {reply, ok, Db, idle_limit()}; % no data waiting, return ok immediately -handle_call(full_commit, _From, Db) -> - {reply, ok, commit_data(Db), idle_limit()}; -handle_call({full_commit, RequiredSeq}, _From, Db) - when RequiredSeq =< Db#db.committed_update_seq -> - {reply, ok, Db, idle_limit()}; -handle_call({full_commit, _}, _, Db) -> - {reply, ok, commit_data(Db), idle_limit()}; % commit the data and return ok handle_call(start_compact, _From, Db) -> {noreply, NewDb, _Timeout} = handle_cast(start_compact, Db), {reply, {ok, NewDb#db.compactor_pid}, NewDb, idle_limit()}; @@ -171,20 +162,18 @@ handle_cast(Msg, #db{name = Name} = Db) -> {stop, Msg, Db}. -handle_info({update_docs, Client, GroupedDocs, NonRepDocs, MergeConflicts, - FullCommit}, Db) -> +handle_info({update_docs, Client, GroupedDocs, NonRepDocs, MergeConflicts}, + Db) -> GroupedDocs2 = sort_and_tag_grouped_docs(Client, GroupedDocs), if NonRepDocs == [] -> - {GroupedDocs3, Clients, FullCommit2} = collect_updates(GroupedDocs2, - [Client], MergeConflicts, FullCommit); + {GroupedDocs3, Clients} = collect_updates(GroupedDocs2, + [Client], MergeConflicts); true -> GroupedDocs3 = GroupedDocs2, - FullCommit2 = FullCommit, Clients = [Client] end, NonRepDocs2 = [{Client, NRDoc} || NRDoc <- NonRepDocs], - try update_docs_int(Db, GroupedDocs3, NonRepDocs2, MergeConflicts, - FullCommit2) of + try update_docs_int(Db, GroupedDocs3, NonRepDocs2, MergeConflicts) of {ok, Db2, UpdatedDDocIds} -> ok = gen_server:call(couch_server, {db_updated, Db2}, infinity), case {couch_db:get_update_seq(Db), couch_db:get_update_seq(Db2)} of @@ -217,17 +206,6 @@ handle_info({update_docs, Client, GroupedDocs, NonRepDocs, MergeConflicts, [catch(ClientPid ! {retry, self()}) || ClientPid <- Clients], {noreply, Db, hibernate_if_no_idle_limit()} end; -handle_info(delayed_commit, #db{waiting_delayed_commit=nil}=Db) -> - %no outstanding delayed commits, ignore - {noreply, Db, idle_limit()}; -handle_info(delayed_commit, Db) -> - case commit_data(Db) of - Db -> - {noreply, Db, idle_limit()}; - Db2 -> - ok = gen_server:call(couch_server, {db_updated, Db2}, infinity), - {noreply, Db2, idle_limit()} - end; handle_info({'EXIT', _Pid, normal}, Db) -> {noreply, Db, idle_limit()}; handle_info({'EXIT', _Pid, Reason}, Db) -> @@ -295,20 +273,20 @@ merge_updates([], RestB) -> merge_updates(RestA, []) -> RestA. -collect_updates(GroupedDocsAcc, ClientsAcc, MergeConflicts, FullCommit) -> +collect_updates(GroupedDocsAcc, ClientsAcc, MergeConflicts) -> receive % Only collect updates with the same MergeConflicts flag and without % local docs. It's easier to just avoid multiple _local doc % updaters than deal with their possible conflicts, and local docs % writes are relatively rare. Can be optmized later if really needed. - {update_docs, Client, GroupedDocs, [], MergeConflicts, FullCommit2} -> + {update_docs, Client, GroupedDocs, [], MergeConflicts} -> GroupedDocs2 = sort_and_tag_grouped_docs(Client, GroupedDocs), GroupedDocsAcc2 = merge_updates(GroupedDocsAcc, GroupedDocs2), collect_updates(GroupedDocsAcc2, [Client | ClientsAcc], - MergeConflicts, (FullCommit or FullCommit2)) + MergeConflicts) after 0 -> - {GroupedDocsAcc, ClientsAcc, FullCommit} + {GroupedDocsAcc, ClientsAcc} end. @@ -633,7 +611,7 @@ maybe_stem_full_doc_info(#full_doc_info{rev_tree = Tree} = Info, Limit) -> Info end. -update_docs_int(Db, DocsList, LocalDocs, MergeConflicts, FullCommit) -> +update_docs_int(Db, DocsList, LocalDocs, MergeConflicts) -> UpdateSeq = couch_db_engine:get_update_seq(Db), RevsLimit = couch_db_engine:get_revs_limit(Db), @@ -705,7 +683,7 @@ update_docs_int(Db, DocsList, LocalDocs, MergeConflicts, FullCommit) -> (_) -> [] end, Ids), - {ok, commit_data(Db1, not FullCommit), UpdatedDDocIds}. + {ok, commit_data(Db1), UpdatedDDocIds}. update_local_doc_revs(Docs) -> @@ -852,21 +830,8 @@ apply_purge_reqs([Req | RestReqs], IdFDIs, USeq, Replies) -> commit_data(Db) -> - commit_data(Db, false). - -commit_data(#db{waiting_delayed_commit=nil} = Db, true) -> - TRef = erlang:send_after(1000,self(),delayed_commit), - Db#db{waiting_delayed_commit=TRef}; -commit_data(Db, true) -> - Db; -commit_data(Db, _) -> - #db{ - waiting_delayed_commit = Timer - } = Db, - if is_reference(Timer) -> erlang:cancel_timer(Timer); true -> ok end, {ok, Db1} = couch_db_engine:commit_data(Db), Db1#db{ - waiting_delayed_commit = nil, committed_update_seq = couch_db_engine:get_update_seq(Db) }. diff --git a/src/couch/src/couch_httpd_db.erl b/src/couch/src/couch_httpd_db.erl index 6cfae9610..1a07b202c 100644 --- a/src/couch/src/couch_httpd_db.erl +++ b/src/couch/src/couch_httpd_db.erl @@ -283,23 +283,7 @@ db_req(#httpd{path_parts=[_DbName]}=Req, _Db) -> db_req(#httpd{method='POST',path_parts=[_,<<"_ensure_full_commit">>]}=Req, Db) -> couch_httpd:validate_ctype(Req, "application/json"), _ = couch_httpd:body(Req), - UpdateSeq = couch_db:get_update_seq(Db), - CommittedSeq = couch_db:get_committed_update_seq(Db), - {ok, StartTime} = - case couch_httpd:qs_value(Req, "seq") of - undefined -> - couch_db:ensure_full_commit(Db); - RequiredStr -> - RequiredSeq = list_to_integer(RequiredStr), - if RequiredSeq > UpdateSeq -> - throw({bad_request, - "can't do a full commit ahead of current update_seq"}); - RequiredSeq > CommittedSeq -> - couch_db:ensure_full_commit(Db); - true -> - {ok, couch_db:get_instance_start_time(Db)} - end - end, + StartTime = couch_db:get_instance_start_time(Db), send_json(Req, 201, {[ {ok, true}, {instance_start_time, StartTime} diff --git a/src/couch/test/eunit/couch_auth_cache_tests.erl b/src/couch/test/eunit/couch_auth_cache_tests.erl index 706c0cee9..5439dd7b9 100644 --- a/src/couch/test/eunit/couch_auth_cache_tests.erl +++ b/src/couch/test/eunit/couch_auth_cache_tests.erl @@ -191,7 +191,6 @@ should_restore_cache_after_userdoc_recreation(DbName) -> should_drop_cache_on_auth_db_change(DbName) -> ?_test(begin {ok, _} = update_user_doc(DbName, "joe", "pass1"), - full_commit(DbName), config:set("couch_httpd_auth", "authentication_db", ?b2l(?tempdb()), false), ?assertEqual(nil, couch_auth_cache:get_user_creds("joe")) @@ -202,14 +201,12 @@ should_restore_cache_on_auth_db_change(DbName) -> PasswordHash = hash_password("pass1"), {ok, _} = update_user_doc(DbName, "joe", "pass1"), {ok, Creds, _} = couch_auth_cache:get_user_creds("joe"), - full_commit(DbName), DbName1 = ?tempdb(), config:set("couch_httpd_auth", "authentication_db", ?b2l(DbName1), false), {ok, _} = update_user_doc(DbName1, "joe", "pass5"), - full_commit(DbName1), config:set("couch_httpd_auth", "authentication_db", ?b2l(DbName), false), @@ -224,7 +221,6 @@ should_recover_cache_after_shutdown(DbName) -> PasswordHash = hash_password("pass2"), {ok, Rev0} = update_user_doc(DbName, "joe", "pass1"), {ok, Rev1} = update_user_doc(DbName, "joe", "pass2", Rev0), - full_commit(DbName), shutdown_db(DbName), {ok, Rev1} = get_doc_rev(DbName, "joe"), ?assertEqual(PasswordHash, get_user_doc_password_sha(DbName, "joe")) @@ -328,11 +324,6 @@ delete_user_doc(DbName, UserName) -> {ok, _} = couch_db:update_doc(AuthDb, DeletedDoc, []), ok = couch_db:close(AuthDb). -full_commit(DbName) -> - {ok, AuthDb} = couch_db:open_int(DbName, [?ADMIN_CTX]), - {ok, _} = couch_db:ensure_full_commit(AuthDb), - ok = couch_db:close(AuthDb). - is_opened(DbName) -> {ok, AuthDb} = couch_db:open_int(DbName, [?ADMIN_CTX]), Monitors = couch_db:monitored_by(AuthDb) -- [self()], diff --git a/src/couch/test/eunit/couch_bt_engine_compactor_tests.erl b/src/couch/test/eunit/couch_bt_engine_compactor_tests.erl index 6c99ceb73..4c4c43958 100644 --- a/src/couch/test/eunit/couch_bt_engine_compactor_tests.erl +++ b/src/couch/test/eunit/couch_bt_engine_compactor_tests.erl @@ -101,8 +101,7 @@ create_docs(DbName) -> {<<"value">>, 3} ]}), - {ok, _} = couch_db:update_docs(Db, [Doc1, Doc2, Doc3]), - couch_db:ensure_full_commit(Db) + {ok, _} = couch_db:update_docs(Db, [Doc1, Doc2, Doc3]) end). diff --git a/src/couch/test/eunit/couch_changes_tests.erl b/src/couch/test/eunit/couch_changes_tests.erl index 0c2f5f91f..10cd56cee 100644 --- a/src/couch/test/eunit/couch_changes_tests.erl +++ b/src/couch/test/eunit/couch_changes_tests.erl @@ -36,7 +36,6 @@ setup() -> save_doc(Db, {[{<<"_id">>, <<"doc5">>}]}) ]], Rev = lists:nth(3, Revs), - couch_db:ensure_full_commit(Db), {ok, Db1} = couch_db:reopen(Db), {ok, Rev1} = save_doc(Db1, {[{<<"_id">>, <<"doc3">>}, {<<"_rev">>, Rev}]}), diff --git a/src/couch/test/eunit/couch_db_doc_tests.erl b/src/couch/test/eunit/couch_db_doc_tests.erl index cdcf81d15..1de26c768 100644 --- a/src/couch/test/eunit/couch_db_doc_tests.erl +++ b/src/couch/test/eunit/couch_db_doc_tests.erl @@ -103,7 +103,6 @@ add_revision(Db0, DocId, Rev) -> {<<"value">>, DocId} ] ++ Rev}), {ok, NewRev} = couch_db:update_doc(Db, Doc, []), - {ok, _} = couch_db:ensure_full_commit(Db), couch_doc:rev_to_str(NewRev). diff --git a/src/couch/test/eunit/couch_db_split_tests.erl b/src/couch/test/eunit/couch_db_split_tests.erl index 312b5f84d..8e64c39ee 100644 --- a/src/couch/test/eunit/couch_db_split_tests.erl +++ b/src/couch/test/eunit/couch_db_split_tests.erl @@ -277,7 +277,6 @@ create_docs(DbName, DocNum) -> end, [], lists:seq(DocNum, 1, -1)), couch_util:with_db(DbName, fun(Db) -> {ok, _Result} = couch_db:update_docs(Db, Docs), - {ok, _StartTime} = couch_db:ensure_full_commit(Db), {ok, Db1} = couch_db:reopen(Db), UpdateSeq = couch_db:get_update_seq(Db1), {ok, UpdateSeq} diff --git a/src/couch/test/eunit/couch_index_tests.erl b/src/couch/test/eunit/couch_index_tests.erl index fab3806d0..23c857d6c 100644 --- a/src/couch/test/eunit/couch_index_tests.erl +++ b/src/couch/test/eunit/couch_index_tests.erl @@ -113,7 +113,6 @@ create_docs(DbName) -> ]}), {ok, _} = couch_db:update_docs(Db, [Doc1, Doc2, Doc3]), - couch_db:ensure_full_commit(Db), couch_db:close(Db). create_design_doc(DbName, DDName, ViewName) -> @@ -128,7 +127,6 @@ create_design_doc(DbName, DDName, ViewName) -> ]}} ]}), {ok, Rev} = couch_db:update_doc(Db, DDoc, []), - couch_db:ensure_full_commit(Db), couch_db:close(Db), Rev. diff --git a/src/couch/test/eunit/couchdb_design_doc_tests.erl b/src/couch/test/eunit/couchdb_design_doc_tests.erl index eef12e039..653a6cb17 100644 --- a/src/couch/test/eunit/couchdb_design_doc_tests.erl +++ b/src/couch/test/eunit/couchdb_design_doc_tests.erl @@ -77,7 +77,6 @@ create_design_doc(DbName, DDName) -> ]}} ]}), {ok, Rev} = couch_db:update_doc(Db, DDoc, []), - couch_db:ensure_full_commit(Db), couch_db:close(Db), Rev. diff --git a/src/couch/test/eunit/couchdb_mrview_tests.erl b/src/couch/test/eunit/couchdb_mrview_tests.erl index 1c96a0ae0..f5bad7321 100644 --- a/src/couch/test/eunit/couchdb_mrview_tests.erl +++ b/src/couch/test/eunit/couchdb_mrview_tests.erl @@ -187,7 +187,6 @@ create_doc(backdoor, DbName, Id, Body) -> Doc = couch_doc:from_json_obj(JsonDoc), {ok, Db} = couch_db:open(DbName, [?ADMIN_CTX]), {ok, _} = couch_db:update_docs(Db, [Doc]), - couch_db:ensure_full_commit(Db), couch_db:close(Db); create_doc(clustered, DbName, Id, Body) -> JsonDoc = couch_util:json_apply_field({<<"_id">>, Id}, Body), diff --git a/src/couch/test/eunit/couchdb_update_conflicts_tests.erl b/src/couch/test/eunit/couchdb_update_conflicts_tests.erl index e92c73856..1329aba27 100644 --- a/src/couch/test/eunit/couchdb_update_conflicts_tests.erl +++ b/src/couch/test/eunit/couchdb_update_conflicts_tests.erl @@ -22,9 +22,8 @@ -define(TIMEOUT, 20000). start() -> - Ctx = test_util:start_couch(), - config:set("couchdb", "delayed_commits", "true", false), - Ctx. + test_util:start_couch(). + setup() -> DbName = ?tempdb(), diff --git a/src/couch/test/eunit/couchdb_vhosts_tests.erl b/src/couch/test/eunit/couchdb_vhosts_tests.erl index 1c4117215..fbe5579cd 100644 --- a/src/couch/test/eunit/couchdb_vhosts_tests.erl +++ b/src/couch/test/eunit/couchdb_vhosts_tests.erl @@ -43,7 +43,6 @@ setup() -> ]} ]}), {ok, _} = couch_db:update_docs(Db, [Doc, Doc1]), - couch_db:ensure_full_commit(Db), couch_db:close(Db), Addr = config:get("httpd", "bind_address", "127.0.0.1"), diff --git a/src/couch/test/eunit/couchdb_views_tests.erl b/src/couch/test/eunit/couchdb_views_tests.erl index 60bb5c975..d1aba8fd5 100644 --- a/src/couch/test/eunit/couchdb_views_tests.erl +++ b/src/couch/test/eunit/couchdb_views_tests.erl @@ -322,7 +322,6 @@ couchdb_1309(DbName) -> couchdb_1283() -> ?_test(begin ok = config:set("couchdb", "max_dbs_open", "3", false), - ok = config:set("couchdb", "delayed_commits", "false", false), {ok, MDb1} = couch_db:create(?tempdb(), [?ADMIN_CTX]), DDoc = couch_doc:from_json_obj({[ @@ -406,7 +405,6 @@ create_doc(DbName, DocId) when is_binary(DocId) -> {<<"value">>, 999} ]}), {ok, _} = couch_db:update_docs(Db, [Doc666]), - couch_db:ensure_full_commit(Db), couch_db:close(Db). create_docs(DbName) -> @@ -427,7 +425,6 @@ create_docs(DbName) -> ]}), {ok, _} = couch_db:update_docs(Db, [Doc1, Doc2, Doc3]), - couch_db:ensure_full_commit(Db), couch_db:close(Db). populate_db(Db, BatchSize, N) when N > 0 -> @@ -456,7 +453,6 @@ create_design_doc(DbName, DDName, ViewName) -> ]}} ]}), {ok, Rev} = couch_db:update_doc(Db, DDoc, []), - couch_db:ensure_full_commit(Db), couch_db:close(Db), Rev. @@ -476,7 +472,6 @@ update_design_doc(DbName, DDName, ViewName) -> ]}} ]}), {ok, NewRev} = couch_db:update_doc(Db, DDoc, [?ADMIN_CTX]), - couch_db:ensure_full_commit(Db), couch_db:close(Db), NewRev. diff --git a/src/couch_index/src/couch_index.erl b/src/couch_index/src/couch_index.erl index cae95779e..ab6deae59 100644 --- a/src/couch_index/src/couch_index.erl +++ b/src/couch_index/src/couch_index.erl @@ -377,17 +377,7 @@ code_change(_OldVsn, State, _Extra) -> maybe_restart_updater(#st{waiters=[]}) -> ok; -maybe_restart_updater(#st{mod=Mod, idx_state=IdxState}=State) -> - couch_util:with_db(Mod:get(db_name, IdxState), fun(Db) -> - UpdateSeq = couch_db:get_update_seq(Db), - CommittedSeq = couch_db:get_committed_update_seq(Db), - CanUpdate = UpdateSeq > CommittedSeq, - UOpts = Mod:get(update_options, IdxState), - case CanUpdate and lists:member(committed_only, UOpts) of - true -> couch_db:ensure_full_commit(Db); - false -> ok - end - end), +maybe_restart_updater(#st{idx_state=IdxState}=State) -> couch_index_updater:run(State#st.updater, IdxState). diff --git a/src/couch_mrview/test/eunit/couch_mrview_changes_since_tests.erl b/src/couch_mrview/test/eunit/couch_mrview_changes_since_tests.erl index d670e109b..67106419f 100644 --- a/src/couch_mrview/test/eunit/couch_mrview_changes_since_tests.erl +++ b/src/couch_mrview/test/eunit/couch_mrview_changes_since_tests.erl @@ -168,7 +168,6 @@ test_remove_key(Db) -> Doc = couch_mrview_test_util:doc(11), {ok, Rev} = couch_db:update_doc(Db, Doc, []), RevStr = couch_doc:rev_to_str(Rev), - {ok, _} = couch_db:ensure_full_commit(Db), {ok, Db1} = couch_db:reopen(Db), Result = run_count_query(Db1, 0, []), %% check new view key diff --git a/src/couch_mrview/test/eunit/couch_mrview_index_changes_tests.erl b/src/couch_mrview/test/eunit/couch_mrview_index_changes_tests.erl index f0be1b9b1..d8dd28773 100644 --- a/src/couch_mrview/test/eunit/couch_mrview_index_changes_tests.erl +++ b/src/couch_mrview/test/eunit/couch_mrview_index_changes_tests.erl @@ -198,7 +198,6 @@ test_indexer(Db) -> save_doc(Db, Id) -> Doc = couch_mrview_test_util:doc(Id), {ok, _Rev} = couch_db:update_doc(Db, Doc, []), - {ok, _} = couch_db:ensure_full_commit(Db), couch_db:reopen(Db). run_query(Db, Opts) -> diff --git a/src/couch_pse_tests/src/cpse_test_attachments.erl b/src/couch_pse_tests/src/cpse_test_attachments.erl index 8c454ecb6..ddd1077d1 100644 --- a/src/couch_pse_tests/src/cpse_test_attachments.erl +++ b/src/couch_pse_tests/src/cpse_test_attachments.erl @@ -41,7 +41,6 @@ cpse_write_attachment(Db1) -> Actions = [{create, {<<"first">>, {[]}, [Att0]}}], {ok, Db2} = cpse_util:apply_actions(Db1, Actions), - {ok, _} = couch_db:ensure_full_commit(Db2), cpse_util:shutdown_db(Db2), {ok, Db3} = couch_db:reopen(Db2), diff --git a/src/couch_pse_tests/src/cpse_test_compaction.erl b/src/couch_pse_tests/src/cpse_test_compaction.erl index c8a2c1a7d..6bc470b2f 100644 --- a/src/couch_pse_tests/src/cpse_test_compaction.erl +++ b/src/couch_pse_tests/src/cpse_test_compaction.erl @@ -131,7 +131,6 @@ cpse_compact_with_everything(Db1) -> catch throw:not_supported -> {ok, Db4} end, - {ok, _} = couch_db:ensure_full_commit(Db5), {ok, Db6} = couch_db:reopen(Db5), Term1 = cpse_util:db_as_term(Db6), diff --git a/src/couch_pse_tests/src/cpse_test_get_set_props.erl b/src/couch_pse_tests/src/cpse_test_get_set_props.erl index 02f0eb531..d49f67f49 100644 --- a/src/couch_pse_tests/src/cpse_test_get_set_props.erl +++ b/src/couch_pse_tests/src/cpse_test_get_set_props.erl @@ -89,7 +89,6 @@ check_prop_set(DbName, GetFun, SetFun, Default, Value) -> {ok, Db1} = couch_db:reopen(Db0), ?assertEqual(Value, couch_db:GetFun(Db1)), - ?assertMatch({ok, _}, couch_db:ensure_full_commit(Db1)), cpse_util:shutdown_db(Db1), {ok, Db2} = couch_db:reopen(Db1), diff --git a/src/couch_pse_tests/src/cpse_test_read_write_docs.erl b/src/couch_pse_tests/src/cpse_test_read_write_docs.erl index fd830d812..a2151340a 100644 --- a/src/couch_pse_tests/src/cpse_test_read_write_docs.erl +++ b/src/couch_pse_tests/src/cpse_test_read_write_docs.erl @@ -56,7 +56,6 @@ cpse_write_one_doc(Db1) -> {ok, Db2} = cpse_util:apply_actions(Db1, Actions), ?assertEqual(1, couch_db_engine:get_doc_count(Db2)), - {ok, _} = couch_db:ensure_full_commit(Db2), cpse_util:shutdown_db(Db2), {ok, Db3} = couch_db:reopen(Db2), @@ -96,7 +95,6 @@ cpse_write_two_docs(Db1) -> {create, {<<"bar">>, {[{<<"stuff">>, true}]}}} ], {ok, Db2} = cpse_util:apply_actions(Db1, Actions), - {ok, _} = couch_db:ensure_full_commit(Db2), cpse_util:shutdown_db(Db2), {ok, Db3} = couch_db:reopen(Db2), @@ -122,7 +120,6 @@ cpse_write_three_doc_batch(Db1) -> ]} ], {ok, Db2} = cpse_util:apply_actions(Db1, Actions), - {ok, _} = couch_db:ensure_full_commit(Db2), cpse_util:shutdown_db(Db2), {ok, Db3} = couch_db:reopen(Db2), @@ -145,7 +142,7 @@ cpse_update_doc(Db1) -> {update, {<<"foo">>, {[{<<"vsn">>, 2}]}}} ], {ok, Db2} = cpse_util:apply_actions(Db1, Actions), - {ok, _} = couch_db:ensure_full_commit(Db2), + cpse_util:shutdown_db(Db2), {ok, Db3} = couch_db:reopen(Db2), @@ -187,7 +184,6 @@ cpse_delete_doc(Db1) -> {delete, {<<"foo">>, {[]}}} ], {ok, Db2} = cpse_util:apply_actions(Db1, Actions), - {ok, _} = couch_db:ensure_full_commit(Db2), cpse_util:shutdown_db(Db2), {ok, Db3} = couch_db:reopen(Db2), @@ -227,7 +223,6 @@ cpse_write_local_doc(Db1) -> {create, {<<"_local/foo">>, {[{<<"yay">>, false}]}}} ], {ok, Db2} = cpse_util:apply_actions(Db1, Actions), - {ok, _} = couch_db:ensure_full_commit(Db2), cpse_util:shutdown_db(Db2), {ok, Db3} = couch_db:reopen(Db2), @@ -253,7 +248,6 @@ cpse_write_mixed_batch(Db1) -> ]} ], {ok, Db2} = cpse_util:apply_actions(Db1, Actions), - {ok, _} = couch_db:ensure_full_commit(Db2), cpse_util:shutdown_db(Db2), {ok, Db3} = couch_db:reopen(Db2), @@ -279,7 +273,6 @@ cpse_update_local_doc(Db1) -> {update, {<<"_local/foo">>, {[{<<"stuff">>, null}]}}} ], {ok, Db2} = cpse_util:apply_actions(Db1, Actions), - {ok, _} = couch_db:ensure_full_commit(Db1), cpse_util:shutdown_db(Db2), {ok, Db3} = couch_db:reopen(Db2), @@ -303,7 +296,6 @@ cpse_delete_local_doc(Db1) -> {delete, {<<"_local/foo">>, []}} ], {ok, Db2} = cpse_util:apply_actions(Db1, Actions), - {ok, _} = couch_db:ensure_full_commit(Db2), cpse_util:shutdown_db(Db2), {ok, Db3} = couch_db:reopen(Db2), diff --git a/src/couch_replicator/src/couch_replicator_docs.erl b/src/couch_replicator/src/couch_replicator_docs.erl index 81685cd48..e23344122 100644 --- a/src/couch_replicator/src/couch_replicator_docs.erl +++ b/src/couch_replicator/src/couch_replicator_docs.erl @@ -805,8 +805,7 @@ create_vdu(DbName) -> id = <<"_design/vdu">>, body = {[{<<"validate_doc_update">>, VduFun}]} }, - {ok, _} = couch_db:update_docs(Db, [Doc]), - couch_db:ensure_full_commit(Db) + {ok, _} = couch_db:update_docs(Db, [Doc]) end). diff --git a/src/couch_replicator/test/eunit/couch_replicator_filtered_tests.erl b/src/couch_replicator/test/eunit/couch_replicator_filtered_tests.erl index 70b25a31b..7ac9a4d71 100644 --- a/src/couch_replicator/test/eunit/couch_replicator_filtered_tests.erl +++ b/src/couch_replicator/test/eunit/couch_replicator_filtered_tests.erl @@ -228,7 +228,6 @@ create_docs(DbName) -> ]}), {ok, _} = couch_db:update_docs(Db, [DDoc, Doc1, Doc2, Doc3, Doc4]), - couch_db:ensure_full_commit(Db), couch_db:close(Db). delete_db(DbName) -> diff --git a/src/couch_replicator/test/eunit/couch_replicator_id_too_long_tests.erl b/src/couch_replicator/test/eunit/couch_replicator_id_too_long_tests.erl index 1447acfa7..a4696c4b8 100644 --- a/src/couch_replicator/test/eunit/couch_replicator_id_too_long_tests.erl +++ b/src/couch_replicator/test/eunit/couch_replicator_id_too_long_tests.erl @@ -77,7 +77,6 @@ create_doc(DbName) -> {ok, Db} = couch_db:open(DbName, [?ADMIN_CTX]), Doc = couch_doc:from_json_obj({[{<<"_id">>, <<"12345">>}]}), {ok, _} = couch_db:update_doc(Db, Doc, []), - couch_db:ensure_full_commit(Db), couch_db:close(Db). diff --git a/src/couch_replicator/test/eunit/couch_replicator_selector_tests.erl b/src/couch_replicator/test/eunit/couch_replicator_selector_tests.erl index 7d92bdcb1..5026c1435 100644 --- a/src/couch_replicator/test/eunit/couch_replicator_selector_tests.erl +++ b/src/couch_replicator/test/eunit/couch_replicator_selector_tests.erl @@ -106,7 +106,6 @@ create_docs(DbName) -> {<<"_id">>, <<"doc2">>} ]}), {ok, _} = couch_db:update_docs(Db, [Doc1, Doc2]), - couch_db:ensure_full_commit(Db), couch_db:close(Db). delete_db(DbName) -> diff --git a/src/mem3/src/mem3_reshard_store.erl b/src/mem3/src/mem3_reshard_store.erl index a1e00544a..c3534b374 100644 --- a/src/mem3/src/mem3_reshard_store.erl +++ b/src/mem3/src/mem3_reshard_store.erl @@ -169,7 +169,6 @@ delete_doc(Db, DocId) -> case couch_db:open_doc(Db, DocId, []) of {ok, #doc{revs = {_, Revs}}} -> {ok, _} = couch_db:delete_doc(Db, DocId, Revs), - {ok, _} = couch_db:ensure_full_commit(Db), ok; {not_found, _} -> ok @@ -190,7 +189,6 @@ update_doc(Db, DocId, Body) -> true -> {ok, _} = couch_db:update_doc(Db, Doc, []), couch_log:debug("~p updated doc ~p ~p", [?MODULE, DocId, Body]), - {ok, _} = couch_db:ensure_full_commit(Db), ok; false -> couch_log:debug("~p not storing state in ~p", [?MODULE, DocId]), diff --git a/test/elixir/README.md b/test/elixir/README.md index f7691ad3c..7c6b10e5a 100644 --- a/test/elixir/README.md +++ b/test/elixir/README.md @@ -42,7 +42,6 @@ X means done, - means partially - [X] Port conflicts.js - [ ] Port cookie_auth.js - [X] Port copy_doc.js - - [X] Port delayed_commits.js - [ ] Port design_docs.js - [ ] Port design_options.js - [ ] Port design_paths.js @@ -253,4 +252,4 @@ defmodule Couch.Test.CRUD do end end end -```
\ No newline at end of file +``` diff --git a/test/elixir/test/delayed_commits_test.exs b/test/elixir/test/delayed_commits_test.exs deleted file mode 100644 index 9b00a5916..000000000 --- a/test/elixir/test/delayed_commits_test.exs +++ /dev/null @@ -1,35 +0,0 @@ -defmodule DelayedCommitsTest do - use CouchTestCase - - @moduledoc """ - Test CouchDB delayed commits - This is a port of the delayed_commits.js suite - - Note that delayed_commits is deprecated in 2.0, so this is a minimal - test to show it still works. delayed_commits will be removed in 3.0. - - This test is now skipped. Its a bit of a flaky test so no point running it - since we are removing this feature. - """ - - @tag :pending - @tag config: [ - {"couchdb", "delayed_commits", "true"} - ] - @tag :with_db - test "delayed commit", context do - db_name = context[:db_name] - doc_id = "doc-1" - resp = Couch.put("/#{db_name}/#{doc_id}", body: %{a: 2, b: 4}) - assert resp.status_code in 201..204 - assert resp.body["ok"] - - resp = Couch.get("/#{db_name}/#{doc_id}") - assert resp.status_code == 200, "The new doc should be in the database" - - restart_cluster() - - resp = Couch.get("/#{db_name}/#{doc_id}") - assert resp.status_code == 404, "The new doc should be missing" - end -end diff --git a/test/javascript/tests/delayed_commits.js b/test/javascript/tests/delayed_commits.js deleted file mode 100644 index cfb59d11e..000000000 --- a/test/javascript/tests/delayed_commits.js +++ /dev/null @@ -1,50 +0,0 @@ -// 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. - -couchTests.delayed_commits = function(debug) { - - // Note that delayed_commits is deprecated in 2.0, so this is a minimal - // test to show it still works. delayed_commits will be removed in 3.0. - - db_name = get_random_db_name(); - var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"}); - db.deleteDb(); - db.createDb(); - if (debug) debugger; - - run_on_modified_server( - [{section: "couchdb", - key: "delayed_commits", - value: "true"}], - - function () { - // By default, couchdb doesn't fully commit documents to disk right away, - // it waits about a second to batch the full commit flush along with any - // other updates. If it crashes or is restarted you may lose the most - // recent commits. - - // restartServer() requires a server to be up 15s before it restarts - sleep(15000); - - T(db.save({_id:"1",a:2,b:4}).ok); - T(db.open("1") != null); - - restartServer(); - - T(db.open("1") == null); // lost the update. - // note if we waited > 1 sec before the restart, the doc would likely - // commit. - }); - - // cleanup - db.deleteDb(); -}; |