You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ja...@apache.org on 2019/07/19 15:56:57 UTC

[couchdb] 01/02: fix access CRUD for reads

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

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

commit 8d593d1cc7d879cea9c432de35879f9d2367b9c6
Author: Jan Lehnardt <ja...@apache.org>
AuthorDate: Fri Jul 19 17:31:51 2019 +0200

    fix access CRUD for reads
---
 rel/overlay/etc/default.ini        |  2 +-
 src/chttpd/src/chttpd_db.erl       |  4 +++-
 src/couch/src/couch_bt_engine.erl  | 42 +++++++++++++++++++++++++++--------
 src/couch/src/couch_btree.erl      |  7 ++----
 src/couch/src/couch_db.erl         | 29 +++++++++++++++++-------
 src/couch/src/couch_db_updater.erl |  4 ++--
 src/couch/src/couch_doc.erl        |  6 +++--
 t.sh                               | 45 +++++++++++++++++++-------------------
 user.json                          |  2 +-
 9 files changed, 89 insertions(+), 52 deletions(-)

diff --git a/rel/overlay/etc/default.ini b/rel/overlay/etc/default.ini
index 3e2e877..e8df095 100644
--- a/rel/overlay/etc/default.ini
+++ b/rel/overlay/etc/default.ini
@@ -505,7 +505,7 @@ _default = [{db_fragmentation, "70%"}, {view_fragmentation, "60%"}]
 ;  emergency, emerg
 ;  none
 ;
-level = info
+level = debug
 ;
 ; Set the maximum log message length in bytes that will be
 ; passed through the writer
diff --git a/src/chttpd/src/chttpd_db.erl b/src/chttpd/src/chttpd_db.erl
index 53cede4..48cef48 100644
--- a/src/chttpd/src/chttpd_db.erl
+++ b/src/chttpd/src/chttpd_db.erl
@@ -1269,8 +1269,10 @@ couch_doc_open(Db, DocId, Rev, Options0) ->
     nil -> % open most recent rev
         case fabric:open_doc(Db, DocId, Options) of
         {ok, Doc} ->
-            Doc;
+             couch_log:info("~n################ chttpd couch_doc_open: Doc: ~p", [Doc]),
+             Doc;
          Error ->
+             couch_log:info("~n################ chttpd couch_doc_open ERROR: Error: ~p", [Error]),
              throw(Error)
          end;
     _ -> % open a specific rev (deletions come back as stubs)
diff --git a/src/couch/src/couch_bt_engine.erl b/src/couch/src/couch_bt_engine.erl
index b9cd33d..287c84e 100644
--- a/src/couch/src/couch_bt_engine.erl
+++ b/src/couch/src/couch_bt_engine.erl
@@ -409,7 +409,7 @@ write_doc_infos(#st{} = St, Pairs, LocalDocs) ->
     end, {[], [], []}, Pairs),
 
     {Add, RemIds, RemSeqs} = FinalAcc,
-    couch_log:info("~n~nadding these to by-id and by-seq~p~n~n", [Add]),
+    couch_log:info("~n > > > > > write path: ENGINE:write_doc_infos: FinalAcc:~p ~n", [FinalAcc]),
     {ok, IdTree2} = couch_btree:add_remove(IdTree, Add, RemIds),
     {ok, SeqTree2} = couch_btree:add_remove(SeqTree, Add, RemSeqs),
 
@@ -595,22 +595,25 @@ id_tree_split(#full_doc_info{}=Info) ->
         update_seq = Seq,
         deleted = Deleted,
         sizes = SizeInfo,
-        rev_tree = Tree
+        rev_tree = Tree,
+        access = Access
     } = Info,
-    {Id, {Seq, ?b2i(Deleted), split_sizes(SizeInfo), disk_tree(Tree)}}.
+    {Id, {Seq, ?b2i(Deleted), split_sizes(SizeInfo), disk_tree(Tree), split_access(Access)}}.
 
 
 id_tree_join(Id, {HighSeq, Deleted, DiskTree}) ->
     % Handle old formats before data_size was added
     id_tree_join(Id, {HighSeq, Deleted, #size_info{}, DiskTree});
-
 id_tree_join(Id, {HighSeq, Deleted, Sizes, DiskTree}) ->
+    id_tree_join(Id, {HighSeq, Deleted, Sizes, DiskTree, []});
+id_tree_join(Id, {HighSeq, Deleted, Sizes, DiskTree, Access}) ->
     #full_doc_info{
         id = Id,
         update_seq = HighSeq,
         deleted = ?i2b(Deleted),
         sizes = couch_db_updater:upgrade_sizes(Sizes),
-        rev_tree = rev_tree(DiskTree)
+        rev_tree = rev_tree(DiskTree),
+        access = join_access(Access)
     }.
 
 
@@ -641,21 +644,24 @@ seq_tree_split(#full_doc_info{}=Info) ->
         update_seq = Seq,
         deleted = Del,
         sizes = SizeInfo,
-        rev_tree = Tree
+        rev_tree = Tree,
+        access = Access
     } = Info,
-    {Seq, {Id, ?b2i(Del), split_sizes(SizeInfo), disk_tree(Tree)}}.
+    {Seq, {Id, ?b2i(Del), split_sizes(SizeInfo), disk_tree(Tree), split_access(Access)}}.
 
 
 seq_tree_join(Seq, {Id, Del, DiskTree}) when is_integer(Del) ->
     seq_tree_join(Seq, {Id, Del, {0, 0}, DiskTree});
-
 seq_tree_join(Seq, {Id, Del, Sizes, DiskTree}) when is_integer(Del) ->
+    seq_tree_join(Seq, {Id, Del, Sizes, DiskTree, []});
+seq_tree_join(Seq, {Id, Del, Sizes, DiskTree, Access}) when is_integer(Del) ->
     #full_doc_info{
         id = Id,
         update_seq = Seq,
         deleted = ?i2b(Del),
         sizes = join_sizes(Sizes),
-        rev_tree = rev_tree(DiskTree)
+        rev_tree = rev_tree(DiskTree),
+        access = join_access(Access)
     };
 
 seq_tree_join(KeySeq, {Id, RevInfos, DeletedRevInfos}) ->
@@ -680,6 +686,24 @@ seq_tree_reduce(reduce, DocInfos) ->
 seq_tree_reduce(rereduce, Reds) ->
     lists:sum(Reds).
 
+join_access(Access) -> Access.
+split_access(Access) -> Access.
+
+% split_access([]) ->
+%     [];
+% split_access(Access) when is_list(Access) ->
+%     term_to_binary(Access);
+% split_access(Access) ->
+%     couch_log:info("~n~n &&&&&&&& split IN VAL ID ACC ESS: ~p~n~n", [Access]),
+%     throw(invalid_access_term_in_fdi).
+%
+% join_access([]) ->
+%     [];
+% join_access(Access) when is_binary(Access) ->
+%     binary_to_term(Access);
+% join_access(Access) ->
+%     couch_log:info("~n~n &&&&&&&& JOIN IN VAL ID ACC ESS: ~p~n~n", [Access]),
+%     throw(invalid_access_term_in_fdi).
 
 local_tree_split(#doc{revs = {0, [Rev]}} = Doc) when is_binary(Rev) ->
     #doc{
diff --git a/src/couch/src/couch_btree.erl b/src/couch/src/couch_btree.erl
index 031ce68..f45d9e7 100644
--- a/src/couch/src/couch_btree.erl
+++ b/src/couch/src/couch_btree.erl
@@ -35,8 +35,6 @@ assemble(#btree{assemble_kv=Assemble}, Key, Value) ->
 less(#btree{less=undefined}, A, B) ->
     A < B;
 less(#btree{less=Less}, A, B) ->
-    couch_log:info("~n A:~p~n", [A]),
-    couch_log:info("~n B:~p~n", [B]),
     Less(A, B).
 
 % pass in 'nil' for State if a new Btree.
@@ -107,9 +105,9 @@ full_reduce_with_options(Bt, Options0) ->
     Options = Options0 ++ [
         {end_key, EndKey}
     ],
-    couch_log:info("~n Options:~p~n", [Options]),
+    % couch_log:info("~n Options:~p~n", [Options]),
     R = fold_reduce(Bt, CountFun, 0, Options),
-    couch_log:info("~n~n R: ~p ~n", [R]),
+    % couch_log:info("~n~n R: ~p ~n", [R]),
     R.
 
 full_reduce(#btree{root=nil,reduce=Reduce}) ->
@@ -117,7 +115,6 @@ full_reduce(#btree{root=nil,reduce=Reduce}) ->
 full_reduce(#btree{root=Root}) ->
     {ok, element(2, Root)}.
 
-
 size(#btree{root = nil}) ->
     0;
 size(#btree{root = {_P, _Red}}) ->
diff --git a/src/couch/src/couch_db.erl b/src/couch/src/couch_db.erl
index 37fdee9..72a9d8f 100644
--- a/src/couch/src/couch_db.erl
+++ b/src/couch/src/couch_db.erl
@@ -280,6 +280,7 @@ open_doc(Db, IdOrDocInfo) ->
     open_doc(Db, IdOrDocInfo, []).
 
 open_doc(Db, Id, Options) ->
+    couch_log:info("~n$$$$$$$$$$$$$$$$$$$$$: open_doc Id: ~p~n", [Id]),
     increment_stat(Db, [couchdb, database_reads]),
     case open_doc_int(Db, Id, Options) of
     {ok, #doc{deleted=true}=Doc} ->
@@ -290,7 +291,8 @@ open_doc(Db, Id, Options) ->
             {not_found, deleted}
         end;
     Else ->
-        apply_open_options(Db, Else,Options)
+        couch_log:info("~n$$$$$$$$$$$$$$$$$$$$$: opened_doc Else : ~p~n", [Else ]),
+        apply_open_options(Db, Else, Options)
     end.
 
 apply_open_options(Db, {ok, Doc}, Options) ->
@@ -732,7 +734,7 @@ validate_access1(_) -> throw({forbidden, <<"can't touch this">>}).
 
 
 check_access(Db, #doc{access=Access}=Doc) ->
-    couch_log:info("check_access: ~n~n~p ~p~n~n", [Db, Doc]),
+    couch_log:info("check_access: ~n~n~p ~p~n~n", [Db#db.name, Doc]),
     check_access(Db, Access);
 check_access(Db, Access) ->
     #user_ctx{
@@ -1733,6 +1735,7 @@ open_doc_revs_int(Db, IdRevs, Options) ->
         IdRevs, LookupResults).
 
 open_doc_int(Db, <<?LOCAL_DOC_PREFIX, _/binary>> = Id, Options) ->
+    couch_log:info(">>> open_doc_int 1", []),
     case couch_db_engine:open_local_docs(Db, [Id]) of
     [#doc{} = Doc] ->
         apply_open_options(Db, {ok, Doc}, Options);
@@ -1740,18 +1743,22 @@ open_doc_int(Db, <<?LOCAL_DOC_PREFIX, _/binary>> = Id, Options) ->
         {not_found, missing}
     end;
 open_doc_int(Db, #doc_info{id=Id,revs=[RevInfo|_]}=DocInfo, Options) ->
+    couch_log:info(">>> open_doc_int 2", []),
     #rev_info{deleted=IsDeleted,rev={Pos,RevId},body_sp=Bp} = RevInfo,
     Doc = make_doc(Db, Id, IsDeleted, Bp, {Pos,[RevId]}),
     apply_open_options(Db,
        {ok, Doc#doc{meta=doc_meta_info(DocInfo, [], Options)}}, Options);
-open_doc_int(Db, #full_doc_info{id=Id,rev_tree=RevTree}=FullDocInfo, Options) ->
+open_doc_int(Db, #full_doc_info{id=Id,rev_tree=RevTree,access=Access}=FullDocInfo, Options) ->
+    couch_log:info(">>> open_doc_int 3, FDI: ~p, Access: ~p", [FullDocInfo, Access]),
     #doc_info{revs=[#rev_info{deleted=IsDeleted,rev=Rev,body_sp=Bp}|_]} =
         DocInfo = couch_doc:to_doc_info(FullDocInfo),
     {[{_, RevPath}], []} = couch_key_tree:get(RevTree, [Rev]),
-    Doc = make_doc(Db, Id, IsDeleted, Bp, RevPath),
+    Doc = make_doc(Db, Id, IsDeleted, Bp, RevPath, Access),
+    couch_log:info(">>> ***** open_doc_int 3 made that doc: ~p", [Doc]),
     apply_open_options(Db,
         {ok, Doc#doc{meta=doc_meta_info(DocInfo, RevTree, Options)}}, Options);
 open_doc_int(Db, Id, Options) ->
+    couch_log:info(">>> open_doc_int 4", []),
     case get_full_doc_info(Db, Id) of
     #full_doc_info{} = FullDocInfo ->
         open_doc_int(Db, FullDocInfo, Options);
@@ -1799,22 +1806,28 @@ doc_meta_info(#doc_info{high_seq=Seq,revs=[#rev_info{rev=Rev}|RestInfo]}, RevTre
     true -> [{local_seq, Seq}]
     end.
 
+make_doc(Db, Id, Deleted, Bp, RevisionPath) ->
+    make_doc(Db, Id, Deleted, Bp, RevisionPath, []);
+make_doc(Db, Id, Deleted, Bp, {Pos, Revs}) ->
+    make_doc(Db, Id, Deleted, Bp, {Pos, Revs}, []).
 
-make_doc(_Db, Id, Deleted, nil = _Bp, RevisionPath) ->
+make_doc(_Db, Id, Deleted, nil = _Bp, RevisionPath, Access) ->
     #doc{
         id = Id,
         revs = RevisionPath,
         body = [],
         atts = [],
-        deleted = Deleted
+        deleted = Deleted,
+        access = Access
     };
-make_doc(#db{} = Db, Id, Deleted, Bp, {Pos, Revs}) ->
+make_doc(#db{} = Db, Id, Deleted, Bp, {Pos, Revs}, Access) ->
     RevsLimit = get_revs_limit(Db),
     Doc0 = couch_db_engine:read_doc_body(Db, #doc{
         id = Id,
         revs = {Pos, lists:sublist(Revs, 1, RevsLimit)},
         body = Bp,
-        deleted = Deleted
+        deleted = Deleted,
+        access = Access
     }),
 
     Doc1 = case Doc0#doc.atts of
diff --git a/src/couch/src/couch_db_updater.erl b/src/couch/src/couch_db_updater.erl
index 4546be5..f5ebc53 100644
--- a/src/couch/src/couch_db_updater.erl
+++ b/src/couch/src/couch_db_updater.erl
@@ -255,6 +255,7 @@ code_change(_OldVsn, State, _Extra) ->
     {ok, State}.
 
 sort_and_tag_grouped_docs(Client, GroupedDocs) ->
+    couch_log:info("~nBERTBERTBERTBERTBERTBERTBERTBERTBERT: GroupedDocs: ~p", [GroupedDocs]),
     % These groups should already be sorted but sometimes clients misbehave.
     % The merge_updates function will fail and the database can end up with
     % duplicate documents if the incoming groups are not sorted, so as a sanity
@@ -311,7 +312,7 @@ init_db(DbName, FilePath, EngineState, Options) ->
     ADR = couch_util:get_value(after_doc_read, Options, nil),
     Access = couch_util:get_value(access, Options, false),
     CleanedOpts = [Opt || Opt <- Options, Opt /= create],
-    
+
     InitDb = #db{
         name = DbName,
         filepath = FilePath,
@@ -607,7 +608,6 @@ update_docs_int(Db, DocsList, LocalDocs, MergeConflicts, FullCommit) ->
     {ok, IndexFDIs} = flush_trees(Db, NewFullDocInfos, []),
     Pairs = pair_write_info(OldDocLookups, IndexFDIs),
     LocalDocs2 = update_local_doc_revs(LocalDocs),
-
     {ok, Db1} = couch_db_engine:write_doc_infos(Db, Pairs, LocalDocs2),
 
     WriteCount = length(IndexFDIs),
diff --git a/src/couch/src/couch_doc.erl b/src/couch/src/couch_doc.erl
index 500a5c7..0d9d0cb 100644
--- a/src/couch/src/couch_doc.erl
+++ b/src/couch/src/couch_doc.erl
@@ -57,7 +57,7 @@ to_json_body(true, {Body}, Access0) ->
     Body ++ [{<<"_deleted">>, true}] ++ [{<<"_access">>, {Access}}];
 to_json_body(false, {Body}, Access0) ->
     Access = reduce_access(Access0),
-    Body ++ [{<<"_access">>, {Access}}].
+    Body ++ [{<<"_access">>, Access}].
 
 to_json_revisions(Options, Start, RevIds0) ->
     RevIds = case proplists:get_value(revs, Options) of
@@ -127,6 +127,8 @@ to_json_obj(Doc, Options) ->
 
 doc_to_json_obj(#doc{id=Id,deleted=Del,body=Body,revs={Start, RevIds},
             meta=Meta,access=Access}=Doc,Options)->
+    couch_log:info("~n~n ___________________doc_to_json_obj Access: ~p ~n~n", [Access]),
+            
     R={[{<<"_id">>, Id}]
         ++ to_json_rev(Start, RevIds)
         ++ to_json_body(Del, Body, Access)
@@ -134,7 +136,7 @@ doc_to_json_obj(#doc{id=Id,deleted=Del,body=Body,revs={Start, RevIds},
         ++ to_json_meta(Meta)
         ++ to_json_attachments(Doc#doc.atts, Options)
     },
-    couch_log:info("~n~n loading this from disk: Doc: ~p ~n~n", [R]),
+    couch_log:info("~n~n ___________________loaded this from disk: Doc: ~p ~n~n", [R]),
     R.
 
 from_json_obj_validate(EJson) ->
diff --git a/t.sh b/t.sh
index 89e1283..e9a7694 100755
--- a/t.sh
+++ b/t.sh
@@ -1,33 +1,32 @@
 #!/bin/sh -x
 DB=http://a:a@127.0.0.1:15984 #
-XDB=http://x:x@127.0.0.1:15984
+XDB=http://xxxx:x@127.0.0.1:15984
 YDB=http://y:y@127.0.0.1:15984
 
-curl -sX PUT $DB/_users/org.couchdb.user:x -d @user.json > /dev/null #
+curl -sX PUT $DB/_users/org.couchdb.user:xxxx -d @user.json > /dev/null #
 curl -sX PUT $DB/_users/org.couchdb.user:y -d @user2.json > /dev/null #
 
 curl -sX DELETE $DB/db
-
-
 curl -sX PUT $DB/db?q=1'&access=true'
 ##############
-
-
-
-curl -sX PUT $DB/db/a -d '{"a":1,"_access":["x"]}'
-curl -sX PUT $DB/db/b -d '{"b":2,"_access":["x"]}'
-curl -sX PUT $DB/db/c -d '{"c":3,"_access":["y"]}'
-curl -X PUT $XDB/db/c?rev="1-0865d643568aa9be6bcdc15d88b25912" -d '{"c":6,"_access":["y"]}'
+curl -sX PUT $DB/db/a -d '{"a":1,"_access":["xxxx"]}'
+curl -s $DB/db/a
+curl -s $XDB/db/a
+curl -s $YDB/db/a
 #
-curl -sX PUT $DB/db/d -d '{"d":4,"_access":["y"]}'
+# curl -sX PUT $DB/db/b -d '{"b":2,"_access":["x"]}'
+# curl -sX PUT $DB/db/c -d '{"c":3,"_access":["y"]}'
+# curl -X PUT $XDB/db/c?rev="1-0865d643568aa9be6bcdc15d88b25912" -d '{"c":6,"_access":["y"]}'
+# #
+# curl -sX PUT $DB/db/d -d '{"d":4,"_access":["y"]}'
+# #
+# curl -sX DELETE $DB/db/a?rev="1-967a00dff5e02add41819138abb3284d"
 #
-curl -sX DELETE $DB/db/a?rev="1-967a00dff5e02add41819138abb3284d"
-
-echo 
-echo "setup done"
-echo
-
+# echo
+# echo "setup done"
+# echo
 #
+# #
 # curl -s $DB/db/_all_docs?include_docs=true
 # curl -s $XDB/db/_all_docs?include_docs=true
 # curl -s $YDB/db/_all_docs?include_docs=true
@@ -35,16 +34,16 @@ echo
 # curl -s $DB/db/_changes?include_docs=true
 # curl -s $XDB/db/_changes?include_docs=true
 # curl -s $YDB/db/_changes?include_docs=true
-# #
+# # #
 # curl -s $DB/db/a
 # curl -s $DB/db/b
 # curl -s $DB/db/c
 # curl -s $DB/db/d
 #
-curl -s $XDB/db/a
-curl -s $XDB/db/b
-curl -s $XDB/db/c
-curl -s $XDB/db/d
+# curl -s $XDB/db/a
+# curl -s $XDB/db/b
+# curl -s $XDB/db/c
+# curl -s $XDB/db/d
 #
 # curl -s $YDB/db/a
 # curl -s $YDB/db/b
diff --git a/user.json b/user.json
index ad07a54..43e62c6 100644
--- a/user.json
+++ b/user.json
@@ -1,5 +1,5 @@
 {
-    "name":"x",
+    "name":"xxxx",
     "roles": [],
     "password":"x",
     "type": "user"