Skip to content

Commit b4f3ca5

Browse files
committed
fix nouveau index updating ordering
Use the same connection PID for all index update requests to ensure they are applied in the correct order. Previously some requests (when purging) were handled by the pool and could get reordered.
1 parent e9135ac commit b4f3ca5

File tree

2 files changed

+23
-18
lines changed

2 files changed

+23
-18
lines changed

src/nouveau/src/nouveau_api.erl

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@
2424
delete_path/1,
2525
delete_path/2,
2626
delete_doc_async/5,
27-
purge_doc/4,
27+
purge_doc/5,
2828
update_doc_async/7,
2929
search/2,
30-
set_purge_seq/3,
31-
set_update_seq/3,
30+
set_purge_seq/4,
31+
set_update_seq/4,
3232
drain_async_responses/2,
3333
jaxrs_error/2
3434
]).
@@ -119,12 +119,17 @@ delete_doc_async(ConnPid, #index{} = Index, DocId, MatchSeq, UpdateSeq) when
119119
]
120120
).
121121

122-
purge_doc(#index{} = Index, DocId, MatchSeq, PurgeSeq) when
123-
is_binary(DocId), is_integer(MatchSeq), MatchSeq >= 0, is_integer(PurgeSeq), PurgeSeq > 0
122+
purge_doc(ConnPid, #index{} = Index, DocId, MatchSeq, PurgeSeq) when
123+
is_pid(ConnPid),
124+
is_binary(DocId),
125+
is_integer(MatchSeq),
126+
MatchSeq >= 0,
127+
is_integer(PurgeSeq),
128+
PurgeSeq > 0
124129
->
125130
ReqBody = #{match_seq => MatchSeq, seq => PurgeSeq, purge => true},
126-
Resp = send_if_enabled(
127-
doc_url(Index, DocId), [?JSON_CONTENT_TYPE], delete, jiffy:encode(ReqBody)
131+
Resp = send_direct_if_enabled(
132+
ConnPid, doc_url(Index, DocId), [?JSON_CONTENT_TYPE], delete, jiffy:encode(ReqBody), []
128133
),
129134
case Resp of
130135
{ok, "204", _, _} ->
@@ -175,22 +180,22 @@ search(#index{} = Index, QueryArgs) ->
175180
send_error(Reason)
176181
end.
177182

178-
set_update_seq(#index{} = Index, MatchSeq, UpdateSeq) ->
183+
set_update_seq(ConnPid, #index{} = Index, MatchSeq, UpdateSeq) ->
179184
ReqBody = #{
180185
match_update_seq => MatchSeq,
181186
update_seq => UpdateSeq
182187
},
183-
set_seq(Index, ReqBody).
184-
set_purge_seq(#index{} = Index, MatchSeq, PurgeSeq) ->
188+
set_seq(ConnPid, Index, ReqBody).
189+
set_purge_seq(ConnPid, #index{} = Index, MatchSeq, PurgeSeq) ->
185190
ReqBody = #{
186191
match_purge_seq => MatchSeq,
187192
purge_seq => PurgeSeq
188193
},
189-
set_seq(Index, ReqBody).
194+
set_seq(ConnPid, Index, ReqBody).
190195

191-
set_seq(#index{} = Index, ReqBody) ->
192-
Resp = send_if_enabled(
193-
index_url(Index), [?JSON_CONTENT_TYPE], post, jiffy:encode(ReqBody)
196+
set_seq(ConnPid, #index{} = Index, ReqBody) ->
197+
Resp = send_direct_if_enabled(
198+
ConnPid, index_url(Index), [?JSON_CONTENT_TYPE], post, jiffy:encode(ReqBody), []
194199
),
195200
case Resp of
196201
{ok, "204", _, _} ->

src/nouveau/src/nouveau_index_updater.erl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,9 @@ update(#index{} = Index) ->
107107
Db, Acc0#acc.update_seq, fun load_docs/2, Acc0, []
108108
),
109109
nouveau_api:drain_async_responses(Acc1#acc.reqids, 0),
110-
ibrowse:stop_worker_process(ConnPid),
111-
exit(nouveau_api:set_update_seq(Index, Acc1#acc.update_seq, NewCurSeq))
110+
exit(nouveau_api:set_update_seq(ConnPid, Index, Acc1#acc.update_seq, NewCurSeq))
112111
after
112+
ibrowse:stop_worker_process(ConnPid),
113113
ret_os_process(Proc)
114114
end
115115
end
@@ -232,7 +232,7 @@ purge_index(ConnPid, Db, Index, #purge_acc{} = PurgeAcc0) ->
232232
case couch_db:get_full_doc_info(Db, Id) of
233233
not_found ->
234234
ok = nouveau_api:purge_doc(
235-
Index, Id, PurgeAcc1#purge_acc.index_purge_seq, PurgeSeq
235+
ConnPid, Index, Id, PurgeAcc1#purge_acc.index_purge_seq, PurgeSeq
236236
),
237237
PurgeAcc1#purge_acc{index_purge_seq = PurgeSeq};
238238
FDI ->
@@ -265,7 +265,7 @@ purge_index(ConnPid, Db, Index, #purge_acc{} = PurgeAcc0) ->
265265
),
266266
DbPurgeSeq = couch_db:get_purge_seq(Db),
267267
ok = nouveau_api:set_purge_seq(
268-
Index, PurgeAcc3#purge_acc.index_purge_seq, DbPurgeSeq
268+
ConnPid, Index, PurgeAcc3#purge_acc.index_purge_seq, DbPurgeSeq
269269
),
270270
update_local_doc(Db, Index, DbPurgeSeq),
271271
{ok, PurgeAcc3}

0 commit comments

Comments
 (0)