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"