diff --git a/artiq/frontend/artiq_client.py b/artiq/frontend/artiq_client.py index 8305bc787..e7035381a 100755 --- a/artiq/frontend/artiq_client.py +++ b/artiq/frontend/artiq_client.py @@ -82,6 +82,9 @@ def get_argparser(): "what", help="select object to show: schedule/devices/parameters") + parser_scan_repository = subparsers.add_parser( + "scan-repository", help="rescan repository") + return parser @@ -134,6 +137,10 @@ def _action_del_parameter(remote, args): remote.delete(args.name) +def _action_scan_repository(remote, args): + remote.scan_async() + + def _show_schedule(schedule): clear_screen() if schedule: @@ -228,6 +235,7 @@ def main(): "del_device": "master_ddb", "set_parameter": "master_pdb", "del_parameter": "master_pdb", + "scan_repository": "master_repository" }[action] remote = Client(args.server, port, target_name) try: diff --git a/artiq/frontend/artiq_master.py b/artiq/frontend/artiq_master.py index bf3b6d0c5..196d4643c 100755 --- a/artiq/frontend/artiq_master.py +++ b/artiq/frontend/artiq_master.py @@ -56,18 +56,19 @@ def main(): scheduler.start() atexit.register(lambda: loop.run_until_complete(scheduler.stop())) + repository = Repository() + repository.scan_async() + server_control = Server({ "master_ddb": ddb, "master_pdb": pdb, "master_schedule": scheduler, + "master_repository": repository }) loop.run_until_complete(server_control.start( args.bind, args.port_control)) atexit.register(lambda: loop.run_until_complete(server_control.stop())) - repository = Repository() - loop.run_until_complete(repository.scan()) - server_notify = Publisher({ "schedule": scheduler.notifier, "devices": ddb.data, diff --git a/artiq/master/repository.py b/artiq/master/repository.py index c4c098f2b..3e5e2a783 100644 --- a/artiq/master/repository.py +++ b/artiq/master/repository.py @@ -54,8 +54,16 @@ def _sync_explist(target, source): class Repository: def __init__(self): self.explist = Notifier(dict()) + self._scanning = False @asyncio.coroutine def scan(self): + if self._scanning: + return + self._scanning = True new_explist = yield from _scan_experiments() _sync_explist(self.explist, new_explist) + self._scanning = False + + def scan_async(self): + asyncio.async(self.scan())