atlanticwave-sdx / kytos-sdx-topology

0 stars 3 forks source link

Earlier request to kytos topology API can result in unhandled exceptions by topology event handler #19

Closed italovalcy closed 10 months ago

italovalcy commented 10 months ago

Hi,

If we restart Kytos with sdx_topology enabled, we can have errors like this:

2023-08-24 13:43:20,958 - ERROR [kytos.core.helpers] [helpers.py:147:handler_context] (thread_pool_app_0) listen_to handler: <function Main.listen_event at 0x7f12443101f0>, args: (<Main(sdx_topology, stopped 139716430137088)>, KytosEvent('kytos/topology.port.created', {'switch': 'aa:00:00:00:00:00:00:01', 'port': 1, 'port_description': {'alias': 'Ampath1-eth1', 'mac': 'f2:a4:dd:09:1a:4f', 'state': None}}, 0)) traceback: Traceback (most recent call last):,   File "/usr/local/lib/python3.9/dist-packages/urllib3/connection.py", line 174, in _new_conn,     conn = connection.create_connection(,   File "/usr/local/lib/python3.9/dist-packages/urllib3/util/connection.py", line 96, in create_connection,     raise err,   File "/usr/local/lib/python3.9/dist-packages/urllib3/util/connection.py", line 86, in create_connection,     sock.connect(sa), ConnectionRefusedError: [Errno 111] Connection refused, , During handling of the above exception, another exception occurred:, , Traceback (most recent call last):,   File "/usr/local/lib/python3.9/dist-packages/urllib3/connectionpool.py", line 699, in urlopen,     httplib_response = self._make_request(,   File "/usr/local/lib/python3.9/dist-packages/urllib3/connectionpool.py", line 394, in _make_request,     conn.request(method, url, **httplib_request_kw),   File "/usr/local/lib/python3.9/dist-packages/urllib3/connection.py", line 239, in request,     super(HTTPConnection, self).request(method, url, body=body, headers=headers),   File "/usr/lib/python3.9/http/client.py", line 1255, in request,     self._send_request(method, url, body, headers, encode_chunked),   File "/usr/lib/python3.9/http/client.py", line 1301, in _send_request,     self.endheaders(body, encode_chunked=encode_chunked),   File "/usr/lib/python3.9/http/client.py", line 1250, in endheaders,     self._send_output(message_body, encode_chunked=encode_chunked),   File "/usr/lib/python3.9/http/client.py", line 1010, in _send_output,     self.send(msg),   File "/usr/lib/python3.9/http/client.py", line 950, in send,     self.connect(),   File "/usr/local/lib/python3.9/dist-packages/urllib3/connection.py", line 205, in connect,     conn = self._new_conn(),   File "/usr/local/lib/python3.9/dist-packages/urllib3/connection.py", line 186, in _new_conn,     raise NewConnectionError(, urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x7f12428253d0>: Failed to establish a new connection: [Errno 111] Connection refused, , During handling of the above exception, another exception occurred:, , Traceback (most recent call last):,   File "/usr/local/lib/python3.9/dist-packages/requests/adapters.py", line 486, in send,     resp = conn.urlopen(,   File "/usr/local/lib/python3.9/dist-packages/urllib3/connectionpool.py", line 755, in urlopen,     retries = retries.increment(,   File "/usr/local/lib/python3.9/dist-packages/urllib3/util/retry.py", line 574, in increment,     raise MaxRetryError(_pool, url, error or ResponseError(cause)), urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='0.0.0.0', port=8181): Max retries exceeded with url: /api/kytos/topology/v3/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f12428253d0>: Failed to establish a new connection: [Errno 111] Connection refused')), , During handling of the above exception, another exception occurred:, , Traceback (most recent call last):,   File "/usr/local/lib/python3.9/dist-packages/kytos/core/helpers.py", line 143, in handler_context,     result = handler(*args),   File "//var/lib/kytos/napps/kytos/sdx_topology/main.py", line 189, in listen_event,     if event is not None and self.get_kytos_topology():,   File "//var/lib/kytos/napps/kytos/sdx_topology/main.py", line 78, in get_kytos_topology,     kytos_topology = requests.get(,   File "/usr/local/lib/python3.9/dist-packages/requests/api.py", line 73, in get,     return request("get", url, params=params, **kwargs),   File "/usr/local/lib/python3.9/dist-packages/requests/api.py", line 59, in request,     return session.request(method=method, url=url, **kwargs),   File "/usr/local/lib/python3.9/dist-packages/requests/sessions.py", line 587, in request,     resp = self.send(prep, **send_kwargs),   File "/usr/local/lib/python3.9/dist-packages/requests/sessions.py", line 701, in send,     r = adapter.send(request, **kwargs),   File "/usr/local/lib/python3.9/dist-packages/requests/adapters.py", line 519, in send,     raise ConnectionError(e, request=request), requests.exceptions.ConnectionError: HTTPConnectionPool(host='0.0.0.0', port=8181): Max retries exceeded with url: /api/kytos/topology/v3/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f12428253d0>: Failed to establish a new connection: [Errno 111] Connection refused')),

This happens probably due to earlier requests to topology API, when the server is still booting UP. We should have error handler there and a retry mechanism with considers a retry interval, and possibly overlapping requests (since we will have multiple topology.updated / port.created events at the begin)

lmarinve commented 10 months ago

sdx_topology napps have a version control method that determines when to initiate an initial request to the Kytos topology API. This is controlled by the SDX-LC app.