Skip to content

Commit e7d1240

Browse files
committed
remote/coordinator: move yaml generation off the main loop
With many resources, yaml.dump(resources) takes a few seconds. To avoid blocking the main loop for this long, make a copy and serialize via a threaded executor. Signed-off-by: Jan Luebbe <[email protected]>
1 parent c0ad3b5 commit e7d1240

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

labgrid/remote/coordinator.py

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from functools import wraps
88
import time
99
from contextlib import contextmanager
10+
import copy
1011

1112
import attr
1213
import grpc
@@ -267,19 +268,24 @@ async def save(self):
267268
logging.debug("Running Save")
268269
self.save_scheduled = False
269270

270-
with warn_if_slow("dump resources"):
271-
resources = self._get_resources()
272-
resources = yaml.dump(resources)
273-
resources = resources.encode()
274-
with warn_if_slow("dump places"):
275-
places = self._get_places()
276-
places = yaml.dump(places)
277-
places = places.encode()
278-
279-
logging.debug("Awaiting resources")
280-
await self.loop.run_in_executor(None, atomic_replace, "resources.yaml", resources)
281-
logging.debug("Awaiting places")
282-
await self.loop.run_in_executor(None, atomic_replace, "places.yaml", places)
271+
with warn_if_slow("create resources snapshot"):
272+
resources = copy.deepcopy(self._get_resources())
273+
with warn_if_slow("create places snapshot"):
274+
places = copy.deepcopy(self._get_places())
275+
276+
def save_sync(resources, places):
277+
with warn_if_slow("dump resources"):
278+
resources = yaml.dump(resources)
279+
resources = resources.encode()
280+
with warn_if_slow("dump places"):
281+
places = yaml.dump(places)
282+
places = places.encode()
283+
with warn_if_slow("write resources"):
284+
atomic_replace("resources.yaml", resources)
285+
with warn_if_slow("write places"):
286+
atomic_replace("places.yaml", places)
287+
288+
await self.loop.run_in_executor(None, save_sync, resources, places)
283289

284290
def load(self):
285291
try:

0 commit comments

Comments
 (0)