summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTony Sun <tony.sun427@gmail.com>2020-07-24 09:51:29 -0700
committerTony Sun <tony.sun427@gmail.com>2020-07-24 09:51:29 -0700
commitfd9557a9afd6831bd4271176937bab3b932f88d9 (patch)
tree822a4c3f4822627db7d7fff92f1c58d9e05adf98
parent0a444461920c2b95d9ef8ef3c6512ee37f9af351 (diff)
downloadcouchdb-fd9557a9afd6831bd4271176937bab3b932f88d9.tar.gz
add support for active_tasks via fabric2
Instead of relying on couch_task_status, we use fabric2_active_tasks to construct active_task info via couch_jobs.
-rw-r--r--src/chttpd/src/chttpd_misc.erl7
-rw-r--r--src/fabric/src/fabric2_active_tasks.erl51
2 files changed, 53 insertions, 5 deletions
diff --git a/src/chttpd/src/chttpd_misc.erl b/src/chttpd/src/chttpd_misc.erl
index 07d53714a..ec2435c41 100644
--- a/src/chttpd/src/chttpd_misc.erl
+++ b/src/chttpd/src/chttpd_misc.erl
@@ -294,11 +294,8 @@ dbs_info_callback({error, Reason}, #vacc{resp = Resp0} = Acc) ->
handle_task_status_req(#httpd{method='GET'}=Req) ->
ok = chttpd:verify_is_server_admin(Req),
- {Replies, _BadNodes} = gen_server:multi_call(couch_task_status, all),
- Response = lists:flatmap(fun({Node, Tasks}) ->
- [{[{node,Node} | Task]} || Task <- Tasks]
- end, Replies),
- send_json(Req, lists:sort(Response));
+ ActiveTasks = fabric2_active_tasks:get_active_tasks(),
+ send_json(Req, ActiveTasks);
handle_task_status_req(Req) ->
send_method_not_allowed(Req, "GET,HEAD").
diff --git a/src/fabric/src/fabric2_active_tasks.erl b/src/fabric/src/fabric2_active_tasks.erl
new file mode 100644
index 000000000..2c03ec3a9
--- /dev/null
+++ b/src/fabric/src/fabric2_active_tasks.erl
@@ -0,0 +1,51 @@
+% 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.
+
+
+-module(fabric2_active_tasks).
+
+
+-export([
+ get_active_tasks/0,
+ get_active_task_info/1,
+
+ update_active_task_info/2
+]).
+
+
+-define(ACTIVE_TASK_INFO, <<"active_task_info">>).
+
+
+get_active_tasks() ->
+ couch_jobs_fdb:tx(couch_jobs_fdb:get_jtx(undefined), fun(JTx) ->
+ Types = couch_jobs:get_types(JTx),
+ lists:foldl(fun(Type, TaskAcc) ->
+ JobIds = couch_jobs:get_active_jobs_ids(JTx, Type),
+ Tasks = lists:filtermap(fun(JobId) ->
+ {ok, Data} = couch_jobs:get_job_data(JTx, Type, JobId),
+ case maps:get(?ACTIVE_TASK_INFO, Data, not_found) of
+ not_found -> false;
+ Info -> {true, Info}
+ end
+ end, JobIds),
+ TaskAcc ++ Tasks
+ end, [], Types)
+ end).
+
+
+get_active_task_info(JobData) ->
+ #{?ACTIVE_TASK_INFO:= ActiveTaskInfo} = JobData,
+ ActiveTaskInfo.
+
+
+update_active_task_info(JobData, ActiveTaskInfo) ->
+ JobData#{?ACTIVE_TASK_INFO => ActiveTaskInfo}.