This is an automated email from the ASF dual-hosted git repository. jiangphcn pushed a commit to branch COUCHDB-3326-clustered-purge-pr4-on-compact-plugin in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit 0bbe59fb7e3e8d5d415e2bd6e117951ff41b296c Author: Paul J. Davis <[email protected]> AuthorDate: Wed May 30 14:34:44 2018 -0500 Create new on_compact trigger This trigger allows any storage engine that makes use of compaction to notify that compaction is starting. This is preparatory work for clustered indexes so that existing indexes are allowed to ensure they have a clustered purge local doc before compaction runs. COUCHDB-3326 Co-Authored-By: jiangphcn <[email protected]> --- src/couch/src/couch_bt_engine_compactor.erl | 2 ++ src/couch/src/couch_db_engine.erl | 31 ++++++++++++++++++++++++++++- src/couch/src/couch_db_plugin.erl | 5 +++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/couch/src/couch_bt_engine_compactor.erl b/src/couch/src/couch_bt_engine_compactor.erl index 4e52064..2c5b78e 100644 --- a/src/couch/src/couch_bt_engine_compactor.erl +++ b/src/couch/src/couch_bt_engine_compactor.erl @@ -44,6 +44,8 @@ start(#st{} = St, DbName, Options, Parent) -> } = St, couch_log:debug("Compaction process spawned for db \"~s\"", [DbName]), + couch_db_engine:trigger_on_compact(DbName), + {ok, NewSt, DName, DFd, MFd, Retry} = open_compaction_files(Header, FilePath, Options), erlang:monitor(process, MFd), diff --git a/src/couch/src/couch_db_engine.erl b/src/couch/src/couch_db_engine.erl index 4974201..2fe0b0d 100644 --- a/src/couch/src/couch_db_engine.erl +++ b/src/couch/src/couch_db_engine.erl @@ -627,7 +627,8 @@ count_changes_since/2, start_compaction/1, - finish_compaction/2 + finish_compaction/2, + trigger_on_compact/1 ]). @@ -891,3 +892,31 @@ finish_compaction(Db, CompactInfo) -> end, ok = gen_server:call(couch_server, {db_updated, NewDb}, infinity), {ok, NewDb}. + + +trigger_on_compact(DbName) -> + {ok, DDocs} = get_ddocs(DbName), + couch_db_plugin:on_compact(DbName, DDocs). + + +get_ddocs(<<"shards/", _/binary>> = DbName) -> + {_, Ref} = spawn_monitor(fun() -> + exit(fabric:design_docs(mem3:dbname(DbName))) + end), + receive + {'DOWN', Ref, _, _, {ok, JsonDDocs}} -> + {ok, lists:map(fun(JsonDDoc) -> + couch_doc:from_json_obj(JsonDDoc) + end, JsonDDocs)}; + {'DOWN', Ref, _, _, Else} -> + Else + end; +get_ddocs(DbName) -> + couch_util:with_db(DbName, fun(Db) -> + FoldFun = fun(FDI, Acc) -> + Doc = couch_db:open_doc_int(Db, FDI, []), + {ok, [Doc | Acc]} + end, + {ok, Docs} = couch_db:fold_design_docs(Db, FoldFun, [], []), + {ok, lists:reverse(Docs)} + end). diff --git a/src/couch/src/couch_db_plugin.erl b/src/couch/src/couch_db_plugin.erl index 740b812..8163256 100644 --- a/src/couch/src/couch_db_plugin.erl +++ b/src/couch/src/couch_db_plugin.erl @@ -18,6 +18,7 @@ after_doc_read/2, validate_docid/1, check_is_admin/1, + on_compact/2, on_delete/2 ]). @@ -56,6 +57,10 @@ check_is_admin(Db) -> %% callbacks return true only if it specifically allow the given Id couch_epi:any(Handle, ?SERVICE_ID, check_is_admin, [Db], []). +on_compact(DbName, DDocs) -> + Handle = couch_epi:get_handle(?SERVICE_ID), + couch_epi:apply(Handle, ?SERVICE_ID, on_compact, [DbName, DDocs], []). + on_delete(DbName, Options) -> Handle = couch_epi:get_handle(?SERVICE_ID), couch_epi:apply(Handle, ?SERVICE_ID, on_delete, [DbName, Options], []).
