changeset 2264:74b4acd3dde0

collector client retries a bit. not sure we want this.
author drewp@bigasterisk.com
date Mon, 29 May 2023 11:47:35 -0700
parents f226f40a731d
children 18d6bdd422f2
files light9/collector/collector_client_asyncio.py pdm.lock pyproject.toml
diffstat 3 files changed, 41 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/light9/collector/collector_client_asyncio.py	Mon May 29 11:46:25 2023 -0700
+++ b/light9/collector/collector_client_asyncio.py	Mon May 29 11:47:35 2023 -0700
@@ -1,23 +1,46 @@
+import logging
+import tenacity
 from light9 import networking
 from light9.collector.collector_client import toCollectorJson
 from light9.effect.settings import DeviceSettings
 import aiohttp
 
-class Sender:
+
+log = logging.getLogger('coll_client')
+
+
+class _Sender:
+
     def __init__(self):
-        pass#self.http_session = aiohttp.ClientSession()
+        self.reconnect()
+
+    def reconnect(self):
+        self.http_session = aiohttp.ClientSession()
 
     async def send(self, client: str, session: str, settings: DeviceSettings):
         msg = toCollectorJson(client, session, settings).encode('utf8')
 
-        async with aiohttp.ClientSession() as ses: # i want to use the one from __init__!
-            async with ses.put(
-                networking.collector.path('attrs'), data=msg, timeout=1) as resp:
+        @tenacity.retry(
+            retry=tenacity.retry_if_exception_type(aiohttp.ServerTimeoutError),
+            reraise=True, 
+            stop=tenacity.stop_after_attempt(3),
+            )
+        async def put():
+
+            async with self.http_session.put(networking.collector.path('attrs'), data=msg, timeout=.2) as resp:
                 if resp.status != 202:
                     body = await resp.text()
+                    self.reconnect()
                     raise ValueError(f'collector returned {resp.status}: {body}')
 
-_sender = Sender()
+        await put()
+        attempts = put.retry.statistics['attempt_number']
+        if attempts!=1:
+            log.warning(f"{attempts=}")
+
+
+_sender = _Sender()
+
 
 async def sendToCollector(client: str, session: str, settings: DeviceSettings, useZmq=False):
     await _sender.send(client, session, settings)
--- a/pdm.lock	Mon May 29 11:46:25 2023 -0700
+++ b/pdm.lock	Mon May 29 11:47:35 2023 -0700
@@ -829,6 +829,12 @@
 summary = "A list of Python Standard Libraries (2.6-7, 3.2-9)."
 
 [[package]]
+name = "tenacity"
+version = "8.2.2"
+requires_python = ">=3.6"
+summary = "Retry code until it succeeds"
+
+[[package]]
 name = "tomli"
 version = "2.0.1"
 requires_python = ">=3.7"
@@ -1026,7 +1032,7 @@
 
 [metadata]
 lock_version = "4.1"
-content_hash = "sha256:b143dcaeecae81f7c7c117ef8680f17f1e7ba3b43102cf94d5dd000299db60bc"
+content_hash = "sha256:dc1401c032c754cf047170f72e28807ba5f94185bb51f54d2b038dbacf44ac64"
 
 [metadata.files]
 "aiohttp 3.8.4" = [
@@ -2215,6 +2221,10 @@
     {url = "https://files.pythonhosted.org/packages/7a/b1/52f59dcf31ead2f0ceff8976288449608d912972b911f55dff712cef5719/stdlib_list-0.8.0-py3-none-any.whl", hash = "sha256:2ae0712a55b68f3fbbc9e58d6fa1b646a062188f49745b495f94d3310a9fdd3e"},
     {url = "https://files.pythonhosted.org/packages/bb/01/237cea071fd305f162ebbe1db18a59b56b0b5fdff19533c9a1beea0bdee7/stdlib-list-0.8.0.tar.gz", hash = "sha256:a1e503719720d71e2ed70ed809b385c60cd3fb555ba7ec046b96360d30b16d9f"},
 ]
+"tenacity 8.2.2" = [
+    {url = "https://files.pythonhosted.org/packages/d3/f0/6ccd8854f4421ce1f227caf3421d9be2979aa046939268c9300030c0d250/tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"},
+    {url = "https://files.pythonhosted.org/packages/e7/b0/c23bd61e1b32c9b96fbca996c87784e196a812da8d621d8d04851f6c8181/tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"},
+]
 "tomli 2.0.1" = [
     {url = "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
     {url = "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
--- a/pyproject.toml	Mon May 29 11:46:25 2023 -0700
+++ b/pyproject.toml	Mon May 29 11:47:35 2023 -0700
@@ -37,6 +37,7 @@
     "webcolors>=1.11.1",
     "scipy>=1.9.3",
     "braillegraph>=0.6",
+    "tenacity>=8.2.2",
 ]
 requires-python = ">=3.10"