summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Vatamaniuc <vatamane@apache.org>2020-03-08 00:38:48 -0500
committerNick Vatamaniuc <vatamane@apache.org>2020-03-09 13:10:12 -0400
commit3710421502031b4000badbff6e713b9f93ce4228 (patch)
tree1649836b90f920972c4c9cd65c63ace42750ef64
parentd1ba9d16b10d411c3ce93d33b554edaa8b6d30fa (diff)
downloadcouchdb-ken-2.tar.gz
Enable index auto-updating for couch_viewsken-2
* Register with the fabric2_index module * Provide a build_indices/2 callback * In the callback attempt to parse an `#mrst{}` indexing context and then trigger an indexing job. We don't wait for the job to finish but instead rely on `couch_job`'s max worker limit to keep concurrency in check.
-rw-r--r--src/couch_views/src/couch_views.erl27
-rw-r--r--src/couch_views/src/couch_views_sup.erl8
-rw-r--r--src/couch_views/test/couch_views_indexer_test.erl18
3 files changed, 51 insertions, 2 deletions
diff --git a/src/couch_views/src/couch_views.erl b/src/couch_views/src/couch_views.erl
index 322415b91..8f7db04df 100644
--- a/src/couch_views/src/couch_views.erl
+++ b/src/couch_views/src/couch_views.erl
@@ -12,8 +12,17 @@
-module(couch_views).
+
+-behavior(fabric2_index).
+
+
-export([
- query/6
+ query/6,
+
+ register_index/0,
+
+ % fabric2_index behavior
+ build_indices/2
]).
@@ -55,6 +64,22 @@ query(Db, DDoc, ViewName, Callback, Acc0, Args0) ->
end.
+register_index() ->
+ fabric2_index:register_index(?MODULE).
+
+
+build_indices(#{} = Db, DDocs) when is_list(DDocs) ->
+ DbName = fabric2_db:name(Db),
+ lists:filtermap(fun(DDoc) ->
+ try couch_views_util:ddoc_to_mrst(DbName, DDoc) of
+ {ok, #mrst{} = Mrst} ->
+ {true, couch_views_jobs:build_view_async(Db, Mrst)}
+ catch _:_ ->
+ false
+ end
+ end, DDocs).
+
+
read_view(Db, Mrst, ViewName, Callback, Acc0, Args) ->
fabric2_fdb:transactional(Db, fun(TxDb) ->
try
diff --git a/src/couch_views/src/couch_views_sup.erl b/src/couch_views/src/couch_views_sup.erl
index 7a72a1f33..d84ec9f16 100644
--- a/src/couch_views/src/couch_views_sup.erl
+++ b/src/couch_views/src/couch_views_sup.erl
@@ -28,6 +28,7 @@
start_link() ->
+ ok = register_views_index(),
Arg = case fabric2_node_types:is_type(view_indexing) of
true -> normal;
false -> builds_disabled
@@ -50,6 +51,13 @@ init(builds_disabled) ->
{ok, {flags(), []}}.
+register_views_index() ->
+ case fabric2_node_types:is_type(api_frontend) of
+ true -> couch_views:register_index();
+ false -> ok
+ end.
+
+
flags() ->
#{
strategy => one_for_one,
diff --git a/src/couch_views/test/couch_views_indexer_test.erl b/src/couch_views/test/couch_views_indexer_test.erl
index cd5b2b0bf..02a12e788 100644
--- a/src/couch_views/test/couch_views_indexer_test.erl
+++ b/src/couch_views/test/couch_views_indexer_test.erl
@@ -41,7 +41,8 @@ indexer_test_() ->
?TDEF_FE(multipe_identical_keys_from_same_doc),
?TDEF_FE(fewer_multipe_identical_keys_from_same_doc),
?TDEF_FE(handle_size_key_limits),
- ?TDEF_FE(handle_size_value_limits)
+ ?TDEF_FE(handle_size_value_limits),
+ ?TDEF_FE(index_autoupdater_callback)
]
}
}
@@ -536,6 +537,21 @@ handle_size_value_limits(Db) ->
], Out1).
+index_autoupdater_callback(Db) ->
+ DDoc = create_ddoc(),
+ Doc1 = doc(0),
+ {ok, _} = fabric2_db:update_doc(Db, DDoc, []),
+ {ok, _} = fabric2_db:update_doc(Db, Doc1, []),
+
+ DbSeq = fabric2_db:get_update_seq(Db),
+
+ Result = couch_views:build_indices(Db, [DDoc]),
+ ?assertMatch([{ok, <<_/binary>>}], Result),
+ [{ok, JobId}] = Result,
+
+ ?assertEqual(ok, couch_views_jobs:wait_for_job(JobId, DbSeq)).
+
+
row(Id, Key, Value) ->
{row, [
{id, Id},