From e0fa642496f404f9271e5e725c96dbd65ba691ca Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Thu, 8 Aug 2024 17:06:57 -0400 Subject: [PATCH] Fix SLP asyncio performance issue SLP asyncio performance spent too much time tied up in futile processing, avoid duplicate deferpeers and simplify the loop iteration. --- .../confluent/discovery/protocols/slp.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/confluent_server/confluent/discovery/protocols/slp.py b/confluent_server/confluent/discovery/protocols/slp.py index 94b8b5bc..40c9d936 100644 --- a/confluent_server/confluent/discovery/protocols/slp.py +++ b/confluent_server/confluent/discovery/protocols/slp.py @@ -502,8 +502,14 @@ async def snoop(handler, protocol=None): srp = await pktq.get() while srp and len(deferpeers) < 256: s, rsp, peer = srp + try: + srp = await asyncio.wait_for(pktq.get(), 0.2) + except asyncio.exceptions.TimeoutError: + srp = None if peer in known_peers: continue + if peer in deferpeers: + continue mac = neighutil.get_hwaddr(peer[0]) if not mac: probepeer = (peer[0], struct.unpack('H', os.urandom(2))[0] | 1025) + peer[2:] @@ -511,20 +517,10 @@ async def snoop(handler, protocol=None): s.setblocking(1) s.sendto(b'\x00', probepeer) except Exception as e: - try: - srp = await asyncio.wait_for(pktq.get(), 0.2) - except asyncio.exceptions.TimeoutError: - break continue deferpeers.append(peer) continue await process_peer(newmacs, known_peers, peerbymacaddress, peer) - if len(deferpeers) >= 256: - break - try: - srp = await asyncio.wait_for(pktq.get(), 0.2) - except asyncio.exceptions.TimeoutError: - break if deferpeers: await asyncio.sleep(2.2) for peer in deferpeers: