Skip to content

Commit 3d1d524

Browse files
committed
Fix BQM cache race: serve stale cache during refresh instead of duplicate broker queries
When PeriodicProcessor starts a refresh, concurrent user requests were bypassing the cache and each sending expensive queries to the broker. Now non-forced requests return the stale cached model while a refresh is already in progress, eliminating redundant broker round-trips.
1 parent d5ba99c commit 3d1d524

1 file changed

Lines changed: 14 additions & 4 deletions

File tree

fabric_cf/orchestrator/core/orchestrator_handler.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,15 @@ def discover_broker_query_model(self, *, controller: ABCMgmtControllerMixin, tok
151151
if not start and not end and not includes and not excludes:
152152
saved_bqm = self.controller_state.get_saved_bqm(graph_format=graph_format, level=level)
153153
if saved_bqm is not None:
154-
if not force_refresh and not saved_bqm.can_refresh() and not saved_bqm.refresh_in_progress:
154+
if force_refresh:
155+
saved_bqm.start_refresh()
156+
elif saved_bqm.can_refresh():
157+
saved_bqm.start_refresh()
158+
elif saved_bqm.refresh_in_progress and saved_bqm.get_bqm():
159+
# Serve stale cache while a refresh is already in progress
155160
broker_query_model = saved_bqm.get_bqm()
156161
else:
157-
saved_bqm.start_refresh()
162+
broker_query_model = saved_bqm.get_bqm()
158163

159164
# Request the model from Broker as a fallback
160165
if not broker_query_model:
@@ -243,10 +248,15 @@ def discover_broker_query_model_summary(self, *, controller: ABCMgmtControllerMi
243248
if not start and not end and not includes and not excludes:
244249
saved = self.controller_state.get_saved_summary(level=level)
245250
if saved is not None:
246-
if not force_refresh and not saved.can_refresh() and not saved.refresh_in_progress:
251+
if force_refresh:
252+
saved.start_refresh()
253+
elif saved.can_refresh():
254+
saved.start_refresh()
255+
elif saved.refresh_in_progress and saved.get_bqm():
256+
# Serve stale cache while a refresh is already in progress
247257
summary_json = saved.get_bqm()
248258
else:
249-
saved.start_refresh()
259+
summary_json = saved.get_bqm()
250260

251261
if not summary_json:
252262
broker = self.get_broker(controller=controller)

0 commit comments

Comments
 (0)