Skip to content

Commit c204b88

Browse files
1.1.x (#395)
* fix unregister double update/delta * adjust disconnect scenarios Co-authored-by: David Sutherland <[email protected]>
1 parent da038f0 commit c204b88

File tree

2 files changed

+25
-14
lines changed

2 files changed

+25
-14
lines changed

cylc/uiserver/data_store_mgr.py

+20-13
Original file line numberDiff line numberDiff line change
@@ -167,16 +167,27 @@ async def connect_workflow(self, w_id, contact_data):
167167
self._update_contact(w_id, contact_data)
168168

169169
@log_call
170-
def disconnect_workflow(self, w_id):
170+
def disconnect_workflow(self, w_id, update_contact=True):
171171
"""Terminate workflow subscriptions.
172172
173173
Call this when a workflow has stopped.
174174
"""
175-
self._update_contact(
176-
w_id,
177-
status=WorkflowStatus.STOPPED.value,
178-
status_msg=self._get_status_msg(w_id, False),
179-
)
175+
disconnect_msg = self._get_status_msg(w_id, False)
176+
if (
177+
update_contact
178+
and w_id in self.data
179+
and (
180+
self.data[w_id][WORKFLOW].status != (
181+
WorkflowStatus.STOPPED.value
182+
)
183+
or self.data[w_id][WORKFLOW].status_msg != disconnect_msg
184+
)
185+
):
186+
self._update_contact(
187+
w_id,
188+
status=WorkflowStatus.STOPPED.value,
189+
status_msg=disconnect_msg,
190+
)
180191
if w_id in self.w_subs:
181192
self.w_subs[w_id].stop()
182193
del self.w_subs[w_id]
@@ -202,7 +213,9 @@ def get_workflows(self):
202213
@log_call
203214
def _purge_workflow(self, w_id):
204215
"""Purge the manager of a workflow's subscription and data."""
205-
self.disconnect_workflow(w_id)
216+
# Ensure no old/new subscriptions exist on purge,
217+
# this shouldn't happen if disconnect is run before unregister.
218+
self.disconnect_workflow(w_id, update_contact=False)
206219
if w_id in self.data:
207220
del self.data[w_id]
208221
if w_id in self.delta_queues:
@@ -251,12 +264,6 @@ def _update_workflow_data(self, topic, delta, w_id):
251264
continue
252265
if topic == 'shutdown':
253266
self._delta_store_to_queues(w_id, topic, delta)
254-
# update the status to stopped and set the status message
255-
self._update_contact(
256-
w_id,
257-
status=WorkflowStatus.STOPPED.value,
258-
status_msg=self._get_status_msg(w_id, False),
259-
)
260267
# close connections
261268
self.disconnect_workflow(w_id)
262269
return

cylc/uiserver/tests/test_data_store_mgr.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,11 @@ async def test_disconnect_workflow(
193193
CFF.PORT: 40000,
194194
CFF.API: api_version
195195
}
196-
data_store_mgr._update_contact(w_id=w_id, contact_data=contact_data)
196+
data_store_mgr._update_contact(
197+
w_id=w_id,
198+
contact_data=contact_data,
199+
status='Something'
200+
)
197201
assert api_version == data_store_mgr.data[w_id]['workflow'].api_version
198202

199203
data_store_mgr.disconnect_workflow(w_id=w_id)

0 commit comments

Comments
 (0)