From 4ea6ebb41ee1e6d9add6ea4d5e45967c22076aba Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 14 Aug 2023 10:48:19 -0500 Subject: [PATCH 1/6] feat: cythonize _engine.py to improve performance --- build_ext.py | 1 + 1 file changed, 1 insertion(+) diff --git a/build_ext.py b/build_ext.py index 0020f9fe6..b86ade807 100644 --- a/build_ext.py +++ b/build_ext.py @@ -25,6 +25,7 @@ def build(setup_kwargs: Any) -> None: [ "src/zeroconf/_dns.py", "src/zeroconf/_cache.py", + "src/zeroconf/_engine.py", "src/zeroconf/_protocol/incoming.py", "src/zeroconf/_protocol/outgoing.py", ], From 155035c6b43fc726dc89365cf8696aa5074fb0d2 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 14 Aug 2023 11:03:28 -0500 Subject: [PATCH 2/6] feat: add pxd file for _engine.py --- src/zeroconf/_engine.pxd | 27 +++++++++++++++++++++++++++ src/zeroconf/_engine.py | 9 ++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 src/zeroconf/_engine.pxd diff --git a/src/zeroconf/_engine.pxd b/src/zeroconf/_engine.pxd new file mode 100644 index 000000000..8a4bee269 --- /dev/null +++ b/src/zeroconf/_engine.pxd @@ -0,0 +1,27 @@ + +import cython + + +cdef object current_time_millis +cdef object millis_to_seconds +cdef object log +cdef object logging_DEBUG + +cdef cython.float _DUPLICATE_PACKET_SUPPRESSION_INTERVAL + +from ._protocol.incoming cimport DNSIncoming + + +cdef class AsyncListener: + + cdef public object zc + cdef public cython.bytes data + cdef public cython.float last_time + cdef public DNSIncoming last_message + cdef public object transport + cdef public object sock_description + cdef public cython.dict _deferred + cdef public cython.dict _timers + + @cython.locals(now=cython.float, msg=DNSIncoming) + cpdef datagram_received(self, cython.bytes bytes, cython.tuple addrs) diff --git a/src/zeroconf/_engine.py b/src/zeroconf/_engine.py index 00ecf51ac..e0a09ab1d 100644 --- a/src/zeroconf/_engine.py +++ b/src/zeroconf/_engine.py @@ -46,6 +46,10 @@ _CLOSE_TIMEOUT = 3000 # ms +_bytes = bytes + +logging_DEBUG = logging.DEBUG + class _WrappedTransport: """A wrapper for transports.""" @@ -229,14 +233,13 @@ def __init__(self, zc: 'Zeroconf') -> None: self.sock_description: Optional[str] = None self._deferred: Dict[str, List[DNSIncoming]] = {} self._timers: Dict[str, asyncio.TimerHandle] = {} - super().__init__() def datagram_received( - self, data: bytes, addrs: Union[Tuple[str, int], Tuple[str, int, int, int]] + self, data: _bytes, addrs: Union[Tuple[str, int], Tuple[str, int, int, int]] ) -> None: assert self.transport is not None data_len = len(data) - debug = log.isEnabledFor(logging.DEBUG) + debug = log.isEnabledFor(logging_DEBUG) if data_len > _MAX_MSG_ABSOLUTE: # Guard against oversized packets to ensure bad implementations cannot overwhelm From 40c5dd2d798376f500cf3497ac2d6bf000dd77a6 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 14 Aug 2023 11:04:51 -0500 Subject: [PATCH 3/6] fix: test --- tests/test_core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_core.py b/tests/test_core.py index 8f5322bd2..696d0642b 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -13,7 +13,7 @@ import unittest import unittest.mock from typing import cast -from unittest.mock import patch +from unittest.mock import AsyncMock, patch import pytest @@ -669,7 +669,7 @@ def _background_register(): @pytest.mark.asyncio @unittest.skipIf(sys.version_info[:3][1] < 8, 'Requires Python 3.8 or later to patch _async_setup') @patch("zeroconf._core._STARTUP_TIMEOUT", 0) -@patch("zeroconf._core.AsyncEngine._async_setup") +@patch("zeroconf._core.AsyncEngine._async_setup", new_callable=AsyncMock) async def test_event_loop_blocked(mock_start): """Test we raise NotRunningException when waiting for startup that times out.""" aiozc = AsyncZeroconf(interfaces=['127.0.0.1']) From 20568e46ee4fa135be27e653febc8a3eaa849577 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 14 Aug 2023 11:12:03 -0500 Subject: [PATCH 4/6] fix: leagcy python --- tests/test_core.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/test_core.py b/tests/test_core.py index 696d0642b..303e28ef3 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -13,7 +13,14 @@ import unittest import unittest.mock from typing import cast -from unittest.mock import AsyncMock, patch +from unittest.mock import patch + +if sys.version_info[:3][1] < 8: + from unittest.mock import Mock + + AsyncMock = Mock +else: + from unittest.mock import AsyncMock import pytest From 7a2f033d858ed10066b88895e2f58b05e0c2d030 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 14 Aug 2023 11:16:52 -0500 Subject: [PATCH 5/6] fix: keep some bits patchable for tests --- src/zeroconf/_engine.pxd | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/zeroconf/_engine.pxd b/src/zeroconf/_engine.pxd index 8a4bee269..0f32a44a7 100644 --- a/src/zeroconf/_engine.pxd +++ b/src/zeroconf/_engine.pxd @@ -2,13 +2,10 @@ import cython -cdef object current_time_millis cdef object millis_to_seconds cdef object log cdef object logging_DEBUG -cdef cython.float _DUPLICATE_PACKET_SUPPRESSION_INTERVAL - from ._protocol.incoming cimport DNSIncoming From 10ae1cb9bf0b8c098b6c29ffa19430bf2b5b3650 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 14 Aug 2023 11:50:08 -0500 Subject: [PATCH 6/6] chore: update for resplit --- build_ext.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_ext.py b/build_ext.py index b86ade807..c0042df2b 100644 --- a/build_ext.py +++ b/build_ext.py @@ -25,7 +25,7 @@ def build(setup_kwargs: Any) -> None: [ "src/zeroconf/_dns.py", "src/zeroconf/_cache.py", - "src/zeroconf/_engine.py", + "src/zeroconf/_listener.py", "src/zeroconf/_protocol/incoming.py", "src/zeroconf/_protocol/outgoing.py", ],