diff options
-rw-r--r-- | src/couch_views/src/couch_views_indexer.erl | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/src/couch_views/src/couch_views_indexer.erl b/src/couch_views/src/couch_views_indexer.erl index e3b2ad5bc..e3c1ebaeb 100644 --- a/src/couch_views/src/couch_views_indexer.erl +++ b/src/couch_views/src/couch_views_indexer.erl @@ -207,10 +207,12 @@ do_update(Db, Mrst0, State0) -> tx := Tx } = TxDb, + Snapshot = TxDb#{ tx := erlfdb:snapshot(Tx) }, + State1 = get_update_start_state(TxDb, Mrst0, State0), Mrst1 = couch_views_trees:open(TxDb, Mrst0), - {ok, State2} = fold_changes(State1), + {ok, State2} = fold_changes(Snapshot, State1), #{ doc_acc := DocAcc, @@ -220,7 +222,7 @@ do_update(Db, Mrst0, State0) -> design_opts := DesignOpts } = State2, - DocAcc1 = fetch_docs(TxDb, DesignOpts, DocAcc), + DocAcc1 = fetch_docs(Snapshot, DesignOpts, DocAcc), {Mrst2, MappedDocs} = map_docs(Mrst0, DocAcc1), TotalKVs = write_docs(TxDb, Mrst1, MappedDocs, State2), @@ -294,12 +296,11 @@ get_update_start_state(TxDb, _Idx, State) -> }. -fold_changes(State) -> +fold_changes(Snapshot, State) -> #{ view_seq := SinceSeq, db_seq := DbSeq, - limit := Limit, - tx_db := TxDb + limit := Limit } = State, FoldState = State#{ @@ -312,7 +313,8 @@ fold_changes(State) -> {limit, Limit}, {restart_tx, false} ], - case fabric2_db:fold_changes(TxDb, SinceSeq, Fun, FoldState, Opts) of + + case fabric2_db:fold_changes(Snapshot, SinceSeq, Fun, FoldState, Opts) of {ok, #{rows_processed := 0} = FinalState} when Limit > 0 -> % If we read zero rows with a non-zero limit % it means we've caught up to the DbSeq as our |