summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul J. Davis <paul.joseph.davis@gmail.com>2018-05-30 14:34:44 -0500
committerjiangph <jiangph@cn.ibm.com>2018-08-22 00:15:58 +0800
commitab12e0be80f37bbf9b77f0977393c89696a0b948 (patch)
tree9700a0eef38fe255333aeeaee05ac51facd0678b
parentc02f6d294d962d18c22d8179f43ee07add5437eb (diff)
downloadcouchdb-COUCHDB-3326-clustered-purge-pr4-on-compact-plugin.tar.gz
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 <jiangph@cn.ibm.com>
-rw-r--r--src/couch/src/couch_bt_engine_compactor.erl2
-rw-r--r--src/couch/src/couch_db_engine.erl31
-rw-r--r--src/couch/src/couch_db_plugin.erl5
3 files changed, 37 insertions, 1 deletions
diff --git a/src/couch/src/couch_bt_engine_compactor.erl b/src/couch/src/couch_bt_engine_compactor.erl
index 4e52064b4..2c5b78e0b 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 49742012d..2fe0b0d9d 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 740b8121b..816325699 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], []).