Mercurial > templog
comparison py/configwaiter.py @ 253:0a1b642e3086
long polling config updates
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Mon, 08 Jun 2015 22:29:46 +0800 |
parents | |
children | 26eee8591f61 |
comparison
equal
deleted
inserted
replaced
251:b6079cb0c665 | 253:0a1b642e3086 |
---|---|
1 class ConfigWaiter(object): | |
2 """ Waits for config updates from the server. http long polling """ | |
3 | |
4 def __init__(self, server): | |
5 self.server = server | |
6 self.epoch_tag = None | |
7 self.http_session = aiohttp.ClientSession() | |
8 | |
9 @asyncio.coroutine | |
10 def run(self): | |
11 # wait until someting has been uploaded (the uploader itself waits 5 seconds) | |
12 yield from asyncio.sleep(10) | |
13 while True: | |
14 yield from self.do() | |
15 | |
16 # avoid spinning too fast | |
17 yield from server.sleep(1) | |
18 | |
19 @asyncio.coroutine | |
20 def do(self): | |
21 try: | |
22 if self.epoch_tag: | |
23 headers = {'etag': self.epoch_tag} | |
24 else: | |
25 headers = None | |
26 | |
27 r = yield from asyncio.wait_for( | |
28 self.http_session.get(config.SETTINGS_URL, headers=headers), | |
29 300) | |
30 if r.status == 200: | |
31 resp = yield from asyncio.wait_for(r.json(), 300) | |
32 | |
33 self.epoch_tag = resp['epoch_tag'] | |
34 epoch = self.epoch_tag.split('-')[0] | |
35 if self.server.params.receive(resp['params'], epoch): | |
36 self.server.reload_signal(True) | |
37 | |
38 except Exception as e: | |
39 E("Error watching config: %s" % str(e)) | |
40 | |
41 | |
42 | |
43 |