summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul J. Davis <paul.joseph.davis@gmail.com>2020-03-13 15:40:53 -0500
committerPaul J. Davis <paul.joseph.davis@gmail.com>2020-03-13 17:05:14 -0500
commit308762be8658153be1d58e3f8378b75a5b84d7d9 (patch)
treec657d2002d4a800075dd00c7ad95816462e429a6
parent0db143a7a86927cd503baf14e8d56ac922590b46 (diff)
downloadcouchdb-308762be8658153be1d58e3f8378b75a5b84d7d9.tar.gz
Support tracing view builds
-rw-r--r--src/couch_views/src/couch_views_fdb.erl1
-rw-r--r--src/couch_views/src/couch_views_indexer.erl126
2 files changed, 81 insertions, 46 deletions
diff --git a/src/couch_views/src/couch_views_fdb.erl b/src/couch_views/src/couch_views_fdb.erl
index a0224b2b8..b85f2bd18 100644
--- a/src/couch_views/src/couch_views_fdb.erl
+++ b/src/couch_views/src/couch_views_fdb.erl
@@ -131,7 +131,6 @@ write_doc(TxDb, Sig, ViewIds, Doc) ->
ExistingViewKeys = get_view_keys(TxDb, Sig, DocId),
clear_id_idx(TxDb, Sig, DocId),
-
lists:foreach(fun({ViewId, NewRows, KVSize}) ->
update_id_idx(TxDb, Sig, ViewId, DocId, NewRows, KVSize),
diff --git a/src/couch_views/src/couch_views_indexer.erl b/src/couch_views/src/couch_views_indexer.erl
index fb732a698..b787574d0 100644
--- a/src/couch_views/src/couch_views_indexer.erl
+++ b/src/couch_views/src/couch_views_indexer.erl
@@ -105,6 +105,8 @@ init() ->
NewRetry = Retries + 1,
RetryLimit = retry_limit(),
+ couch_log:error("XKCD: ~p:~p~n~p~n", [Error, Reason, erlang:get_stacktrace()]),
+
case should_retry(NewRetry, RetryLimit, Reason) of
true ->
DataErr = Data#{<<"retries">> := NewRetry},
@@ -156,50 +158,64 @@ add_error(Error, Reason, Data) ->
update(#{} = Db, Mrst0, State0) ->
- {Mrst2, State4} = fabric2_fdb:transactional(Db, fun(TxDb) ->
- % In the first iteration of update we need
- % to populate our db and view sequences
- State1 = case State0 of
- #{db_seq := undefined} ->
- ViewSeq = couch_views_fdb:get_update_seq(TxDb, Mrst0),
- State0#{
- tx_db := TxDb,
- db_seq := fabric2_db:get_update_seq(TxDb),
- view_seq := ViewSeq,
- last_seq := ViewSeq
- };
- _ ->
- State0#{
- tx_db := TxDb
- }
- end,
-
- {ok, State2} = fold_changes(State1),
-
- #{
- count := Count,
- limit := Limit,
- doc_acc := DocAcc,
- last_seq := LastSeq
- } = State2,
-
- DocAcc1 = fetch_docs(TxDb, DocAcc),
- {Mrst1, MappedDocs} = map_docs(Mrst0, DocAcc1),
- write_docs(TxDb, Mrst1, MappedDocs, State2),
-
- case Count < Limit of
- true ->
- report_progress(State2, finished),
- {Mrst1, finished};
- false ->
- State3 = report_progress(State2, update),
- {Mrst1, State3#{
- tx_db := undefined,
- count := 0,
- doc_acc := [],
- view_seq := LastSeq
- }}
- end
+ {Mrst2, State4} = with_root_span(Mrst0, fun() ->
+ fabric2_fdb:transactional(Db, fun(TxDb) ->
+ % In the first iteration of update we need
+ % to populate our db and view sequences
+ State1 = case State0 of
+ #{db_seq := undefined} ->
+ ViewSeq = couch_views_fdb:get_update_seq(TxDb, Mrst0),
+ State0#{
+ tx_db := TxDb,
+ db_seq := fabric2_db:get_update_seq(TxDb),
+ view_seq := ViewSeq,
+ last_seq := ViewSeq
+ };
+ _ ->
+ State0#{
+ tx_db := TxDb
+ }
+ end,
+
+ {ok, State2} = ctrace:with_span(fold_changes, fun() ->
+ fold_changes(State1)
+ end),
+
+ #{
+ count := Count,
+ limit := Limit,
+ doc_acc := DocAcc,
+ last_seq := LastSeq
+ } = State2,
+
+ DocAcc1 = ctrace:with_span(fetch_docs, fun() ->
+ fetch_docs(TxDb, DocAcc)
+ end),
+ {Mrst1, MappedDocs} = ctrace:with_span(map_docs, fun() ->
+ map_docs(Mrst0, DocAcc1)
+ end),
+ ctrace:with_span(write_docs, fun() ->
+ write_docs(TxDb, Mrst1, MappedDocs, State2)
+ end),
+
+ case Count < Limit of
+ true ->
+ ctrace:with_span(report_progress, fun() ->
+ report_progress(State2, finished)
+ end),
+ {Mrst1, finished};
+ false ->
+ State3 = ctrace:with_span(report_progress, fun() ->
+ report_progress(State2, update)
+ end),
+ {Mrst1, State3#{
+ tx_db := undefined,
+ count := 0,
+ doc_acc := [],
+ view_seq := LastSeq
+ }}
+ end
+ end)
end),
case State4 of
@@ -310,7 +326,10 @@ write_docs(TxDb, Mrst, Docs, State) ->
lists:foreach(fun(Doc0) ->
Doc1 = calculate_kv_sizes(Mrst, Doc0, KeyLimit, ValLimit),
- couch_views_fdb:write_doc(TxDb, Sig, ViewIds, Doc1)
+ Tags = #{doc_id => maps:get(id, Doc0)},
+ ctrace:with_span(write_doc, [{tags, Tags}], fun() ->
+ couch_views_fdb:write_doc(TxDb, Sig, ViewIds, Doc1)
+ end)
end, Docs),
couch_views_fdb:set_update_seq(TxDb, Sig, LastSeq).
@@ -460,6 +479,23 @@ report_progress(State, UpdateType) ->
end.
+with_root_span(Mrst, Fun) ->
+ TraceEnabled = fabric2_util:get_value(<<"trace">>, Mrst#mrst.design_opts),
+ case ctrace:is_enabled() andalso TraceEnabled == true of
+ true ->
+ Tags = #{
+ 'db_name' => Mrst#mrst.db_name,
+ 'idx_name' => Mrst#mrst.idx_name,
+ 'signature' => Mrst#mrst.sig,
+ 'language' => Mrst#mrst.language,
+ 'views' => length(Mrst#mrst.views)
+ },
+ ctrace:with_span('views.build', [{tags, Tags}], Fun);
+ false ->
+ Fun()
+ end.
+
+
num_changes() ->
config:get_integer("couch_views", "change_limit", 100).