summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul J. Davis <paul.joseph.davis@gmail.com>2019-08-06 12:50:53 -0500
committerPaul J. Davis <paul.joseph.davis@gmail.com>2019-08-06 12:50:53 -0500
commitacfe3fac208c3e7b08069bc2ce11edcbcb329708 (patch)
treef5acda40d014b4951beccf53ec8a7bc85ea63f72
parent0ea5237a43e8b7037e4a5fa6b016c6d9425b1e46 (diff)
downloadcouchdb-acfe3fac208c3e7b08069bc2ce11edcbcb329708.tar.gz
Remember to remove old doc bodies
-rw-r--r--src/fabric/src/fabric2_fdb.erl30
1 files changed, 25 insertions, 5 deletions
diff --git a/src/fabric/src/fabric2_fdb.erl b/src/fabric/src/fabric2_fdb.erl
index b10c35747..3f02e6ac4 100644
--- a/src/fabric/src/fabric2_fdb.erl
+++ b/src/fabric/src/fabric2_fdb.erl
@@ -509,7 +509,8 @@ write_doc(#{} = Db0, Doc, NewWinner0, OldWinner, ToUpdate, ToRemove) ->
lists:foreach(fun(RI0) ->
RI = RI0#{winner := false},
{K, _, undefined} = revinfo_to_fdb(Tx, DbPrefix, DocId, RI),
- ok = erlfdb:clear(Tx, K)
+ ok = erlfdb:clear(Tx, K),
+ ok = clear_doc_body(Db, DocId, RI0)
end, ToRemove),
% _all_docs
@@ -835,6 +836,25 @@ write_doc_body(#{} = Db0, #doc{} = Doc) ->
end, doc_to_fdb(Db, Doc)).
+clear_doc_body(_Db, _DocId, not_found) ->
+ % No old body to clear
+ ok;
+
+clear_doc_body(#{} = Db, DocId, #{} = RevInfo) ->
+ #{
+ tx := Tx,
+ db_prefix := DbPrefix
+ } = Db,
+
+ #{
+ rev_id := {RevPos, Rev}
+ } = RevInfo,
+
+ BaseKey = {?DB_DOCS, DocId, RevPos, Rev},
+ {StartKey, EndKey} = erlfdb_tuple:range(BaseKey, DbPrefix),
+ ok = erlfdb:clear_range(Tx, StartKey, EndKey).
+
+
revinfo_to_fdb(Tx, DbPrefix, DocId, #{winner := true} = RevId) ->
#{
deleted := Deleted,
@@ -911,6 +931,9 @@ doc_to_fdb(Db, #doc{} = Doc) ->
Rows.
+fdb_to_doc(_Db, _DocId, _Pos, _Path, []) ->
+ {not_found, missing};
+
fdb_to_doc(Db, DocId, Pos, Path, BinRows) when is_list(BinRows) ->
Bin = iolist_to_binary(BinRows),
{Body, DiskAtts, Deleted} = binary_to_term(Bin, [safe]),
@@ -928,10 +951,7 @@ fdb_to_doc(Db, DocId, Pos, Path, BinRows) when is_list(BinRows) ->
case Db of
#{after_doc_read := undefined} -> Doc0;
#{after_doc_read := ADR} -> ADR(Doc0, Db)
- end;
-
-fdb_to_doc(_Db, _DocId, _Pos, _Path, not_found) ->
- {not_found, missing}.
+ end.
local_doc_to_fdb(Db, #doc{} = Doc) ->