You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by va...@apache.org on 2023/02/24 22:07:36 UTC

[couchdb] 01/04: hide shard-sync and purge documents from `_local_docs`

This is an automated email from the ASF dual-hosted git repository.

vatamane pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit 7a2705ac67fe4ac6072224f87174fa41da7e274e
Author: Christian Kruse <cj...@defunct.ch>
AuthorDate: Sun Feb 19 09:41:45 2023 +0100

    hide shard-sync and purge documents from `_local_docs`
    
    It hides the shard-sync and purge documents from the response unless a `?include_system=true` is given.
    
    Fixes #3930
---
 src/chttpd/src/chttpd_db.erl          |  9 ++++-
 src/couch_mrview/src/couch_mrview.erl | 69 ++++++++++++++++++++---------------
 2 files changed, 47 insertions(+), 31 deletions(-)

diff --git a/src/chttpd/src/chttpd_db.erl b/src/chttpd/src/chttpd_db.erl
index 748b356fd..db506e8e2 100644
--- a/src/chttpd/src/chttpd_db.erl
+++ b/src/chttpd/src/chttpd_db.erl
@@ -938,10 +938,11 @@ all_docs_view(Req, Db, Keys, OP) ->
     Args1 = Args0#mrargs{view_type = map},
     Args2 = fabric_util:validate_all_docs_args(Db, Args1),
     Args3 = set_namespace(OP, Args2),
+    Args4 = set_include_sysdocs(OP, Req, Args3),
     Options = [{user_ctx, Req#httpd.user_ctx}],
     Max = chttpd:chunked_response_buffer_size(),
     VAcc = #vacc{db = Db, req = Req, threshold = Max},
-    {ok, Resp} = fabric:all_docs(Db, Options, fun view_cb/2, VAcc, Args3),
+    {ok, Resp} = fabric:all_docs(Db, Options, fun view_cb/2, VAcc, Args4),
     {ok, Resp#vacc.resp}.
 
 view_cb({row, Row} = Msg, Acc) ->
@@ -2286,6 +2287,12 @@ set_namespace(<<"_design_docs">>, Args) ->
 set_namespace(NS, #mrargs{} = Args) ->
     couch_mrview_util:set_extra(Args, namespace, NS).
 
+set_include_sysdocs(<<"_local_docs">>, Req, Args) ->
+    Val = chttpd:qs_value(Req, "include_system", "false") == "true",
+    couch_mrview_util:set_extra(Args, include_system, Val);
+set_include_sysdocs(_OP, _Req, Args) ->
+    Args.
+
 %% /db/_bulk_get stuff
 
 bulk_get_is_multipart(#httpd{mochi_req = MochiReq}) ->
diff --git a/src/couch_mrview/src/couch_mrview.erl b/src/couch_mrview/src/couch_mrview.erl
index d8640c903..3616af7df 100644
--- a/src/couch_mrview/src/couch_mrview.erl
+++ b/src/couch_mrview/src/couch_mrview.erl
@@ -531,36 +531,45 @@ map_fold({{Key, Id}, Val}, _Offset, Acc) ->
         user_acc = UAcc1,
         last_go = Go
     }};
-map_fold(#doc{id = <<"_local/", _/binary>>} = Doc, _Offset, #mracc{} = Acc) ->
-    #mracc{
-        limit = Limit,
-        callback = Callback,
-        user_acc = UAcc0,
-        args = Args
-    } = Acc,
-    #doc{
-        id = DocId,
-        revs = {Pos, [RevId | _]}
-    } = Doc,
-    Rev = {Pos, RevId},
-    Row =
-        [
-            {id, DocId},
-            {key, DocId},
-            {value, {[{rev, couch_doc:rev_to_str(Rev)}]}}
-        ] ++
-            if
-                not Args#mrargs.include_docs -> [];
-                true -> [{doc, couch_doc:to_json_obj(Doc, Args#mrargs.doc_options)}]
-            end,
-    {Go, UAcc1} = Callback({row, Row}, UAcc0),
-    {Go, Acc#mracc{
-        limit = Limit - 1,
-        reduce_fun = undefined,
-        doc_info = undefined,
-        user_acc = UAcc1,
-        last_go = Go
-    }}.
+map_fold(#doc{id = <<"_local/", IdTail/binary>>} = Doc, _Offset, #mracc{} = Acc) ->
+    IncludeSys = couch_util:get_value(include_system, Acc#mracc.args#mrargs.extra),
+
+    case {IncludeSys, IdTail} of
+        {false, <<"purge-", _/binary>>} ->
+            {ok, Acc};
+        {false, <<"shard-sync", _/binary>>} ->
+            {ok, Acc};
+        _ ->
+            #mracc{
+                limit = Limit,
+                callback = Callback,
+                user_acc = UAcc0,
+                args = Args
+            } = Acc,
+            #doc{
+                id = DocId,
+                revs = {Pos, [RevId | _]}
+            } = Doc,
+            Rev = {Pos, RevId},
+            Row =
+                [
+                    {id, DocId},
+                    {key, DocId},
+                    {value, {[{rev, couch_doc:rev_to_str(Rev)}]}}
+                ] ++
+                    if
+                        not Args#mrargs.include_docs -> [];
+                        true -> [{doc, couch_doc:to_json_obj(Doc, Args#mrargs.doc_options)}]
+                    end,
+            {Go, UAcc1} = Callback({row, Row}, UAcc0),
+            {Go, Acc#mracc{
+                limit = Limit - 1,
+                reduce_fun = undefined,
+                doc_info = undefined,
+                user_acc = UAcc1,
+                last_go = Go
+            }}
+    end.
 
 red_fold(Db, {NthRed, _Lang, View} = RedView, Args, Callback, UAcc) ->
     Finalizer =