Skip to content

Commit 2d3da7a

Browse files
authored
Remove locking from ServiceRegistry (#911)
- All calls to the ServiceRegistry are now done in async context which makes them thread safe. Locking is no longer needed.
1 parent e63ca51 commit 2d3da7a

8 files changed

Lines changed: 95 additions & 110 deletions

File tree

tests/services/test_registry.py

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ def test_only_register_once(self):
2323
)
2424

2525
registry = r.ServiceRegistry()
26-
registry.add(info)
27-
self.assertRaises(r.ServiceNameAlreadyRegistered, registry.add, info)
28-
registry.remove(info)
29-
registry.add(info)
26+
registry.async_add(info)
27+
self.assertRaises(r.ServiceNameAlreadyRegistered, registry.async_add, info)
28+
registry.async_remove(info)
29+
registry.async_add(info)
3030

3131
def test_unregister_multiple_times(self):
3232
"""Verify we can unregister a service multiple times.
@@ -46,10 +46,10 @@ def test_unregister_multiple_times(self):
4646
)
4747

4848
registry = r.ServiceRegistry()
49-
registry.add(info)
50-
self.assertRaises(r.ServiceNameAlreadyRegistered, registry.add, info)
51-
registry.remove(info)
52-
registry.remove(info)
49+
registry.async_add(info)
50+
self.assertRaises(r.ServiceNameAlreadyRegistered, registry.async_add, info)
51+
registry.async_remove(info)
52+
registry.async_remove(info)
5353

5454
def test_lookups(self):
5555
type_ = "_test-srvc-type._tcp.local."
@@ -62,13 +62,13 @@ def test_lookups(self):
6262
)
6363

6464
registry = r.ServiceRegistry()
65-
registry.add(info)
65+
registry.async_add(info)
6666

67-
assert registry.get_service_infos() == [info]
68-
assert registry.get_info_name(registration_name) == info
69-
assert registry.get_infos_type(type_) == [info]
70-
assert registry.get_infos_server("ash-2.local.") == [info]
71-
assert registry.get_types() == [type_]
67+
assert registry.async_get_service_infos() == [info]
68+
assert registry.async_get_info_name(registration_name) == info
69+
assert registry.async_get_infos_type(type_) == [info]
70+
assert registry.async_get_infos_server("ash-2.local.") == [info]
71+
assert registry.async_get_types() == [type_]
7272

7373
def test_lookups_upper_case_by_lower_case(self):
7474
type_ = "_test-SRVC-type._tcp.local."
@@ -81,13 +81,13 @@ def test_lookups_upper_case_by_lower_case(self):
8181
)
8282

8383
registry = r.ServiceRegistry()
84-
registry.add(info)
84+
registry.async_add(info)
8585

86-
assert registry.get_service_infos() == [info]
87-
assert registry.get_info_name(registration_name.lower()) == info
88-
assert registry.get_infos_type(type_.lower()) == [info]
89-
assert registry.get_infos_server("ash-2.local.") == [info]
90-
assert registry.get_types() == [type_.lower()]
86+
assert registry.async_get_service_infos() == [info]
87+
assert registry.async_get_info_name(registration_name.lower()) == info
88+
assert registry.async_get_infos_type(type_.lower()) == [info]
89+
assert registry.async_get_infos_server("ash-2.local.") == [info]
90+
assert registry.async_get_types() == [type_.lower()]
9191

9292
def test_lookups_lower_case_by_upper_case(self):
9393
type_ = "_test-srvc-type._tcp.local."
@@ -100,10 +100,10 @@ def test_lookups_lower_case_by_upper_case(self):
100100
)
101101

102102
registry = r.ServiceRegistry()
103-
registry.add(info)
103+
registry.async_add(info)
104104

105-
assert registry.get_service_infos() == [info]
106-
assert registry.get_info_name(registration_name.upper()) == info
107-
assert registry.get_infos_type(type_.upper()) == [info]
108-
assert registry.get_infos_server("ASH-2.local.") == [info]
109-
assert registry.get_types() == [type_]
105+
assert registry.async_get_service_infos() == [info]
106+
assert registry.async_get_info_name(registration_name.upper()) == info
107+
assert registry.async_get_infos_type(type_.upper()) == [info]
108+
assert registry.async_get_infos_server("ASH-2.local.") == [info]
109+
assert registry.async_get_types() == [type_]

tests/services/test_types.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def test_integration_with_listener(self):
5050
"ash-2.local.",
5151
addresses=[socket.inet_aton("10.0.1.2")],
5252
)
53-
zeroconf_registrar.registry.add(info)
53+
zeroconf_registrar.registry.async_add(info)
5454
try:
5555
with patch.object(
5656
zeroconf_registrar.engine.protocols[0], "suppress_duplicate_packet", return_value=False
@@ -87,7 +87,7 @@ def test_integration_with_listener_v6_records(self):
8787
"ash-2.local.",
8888
addresses=[socket.inet_pton(socket.AF_INET6, addr)],
8989
)
90-
zeroconf_registrar.registry.add(info)
90+
zeroconf_registrar.registry.async_add(info)
9191
try:
9292
with patch.object(
9393
zeroconf_registrar.engine.protocols[0], "suppress_duplicate_packet", return_value=False
@@ -124,7 +124,7 @@ def test_integration_with_listener_ipv6(self):
124124
"ash-2.local.",
125125
addresses=[socket.inet_pton(socket.AF_INET6, addr)],
126126
)
127-
zeroconf_registrar.registry.add(info)
127+
zeroconf_registrar.registry.async_add(info)
128128
try:
129129
with patch.object(
130130
zeroconf_registrar.engine.protocols[0], "suppress_duplicate_packet", return_value=False
@@ -160,7 +160,7 @@ def test_integration_with_subtype_and_listener(self):
160160
"ash-2.local.",
161161
addresses=[socket.inet_aton("10.0.1.2")],
162162
)
163-
zeroconf_registrar.registry.add(info)
163+
zeroconf_registrar.registry.async_add(info)
164164
try:
165165
with patch.object(
166166
zeroconf_registrar.engine.protocols[0], "suppress_duplicate_packet", return_value=False

tests/test_asyncio.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -812,7 +812,7 @@ async def test_info_asking_default_is_asking_qm_questions_after_the_first_qu():
812812
type_, registration_name, 80, 0, 0, desc, "ash-2.local.", addresses=[socket.inet_aton("10.0.1.2")]
813813
)
814814

815-
zeroconf_info.registry.add(info)
815+
zeroconf_info.registry.async_add(info)
816816

817817
# we are going to patch the zeroconf send to check query transmission
818818
old_send = zeroconf_info.async_send

tests/test_core.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -335,11 +335,11 @@ def test_goodbye_all_services():
335335
info = r.ServiceInfo(
336336
type_, registration_name, 80, 0, 0, desc, "ash-2.local.", addresses=[socket.inet_aton("10.0.1.2")]
337337
)
338-
zc.registry.add(info)
338+
zc.registry.async_add(info)
339339
out = zc.generate_unregister_all_services()
340340
assert out is not None
341341
first_packet = out.packets()
342-
zc.registry.add(info)
342+
zc.registry.async_add(info)
343343
out2 = zc.generate_unregister_all_services()
344344
assert out2 is not None
345345
second_packet = out.packets()
@@ -348,7 +348,7 @@ def test_goodbye_all_services():
348348
# Verify the registery is empty
349349
out3 = zc.generate_unregister_all_services()
350350
assert out3 is None
351-
assert zc.registry.get_service_infos() == []
351+
assert zc.registry.async_get_service_infos() == []
352352

353353
zc.close()
354354

@@ -438,9 +438,9 @@ def test_tc_bit_defers():
438438
info3 = r.ServiceInfo(
439439
type_, registration3_name, 80, 0, 0, desc, server_name3, addresses=[socket.inet_aton("10.0.1.2")]
440440
)
441-
zc.registry.add(info)
442-
zc.registry.add(info2)
443-
zc.registry.add(info3)
441+
zc.registry.async_add(info)
442+
zc.registry.async_add(info2)
443+
zc.registry.async_add(info3)
444444

445445
protocol = zc.engine.protocols[0]
446446
now = r.current_time_millis()
@@ -517,9 +517,9 @@ def test_tc_bit_defers_last_response_missing():
517517
info3 = r.ServiceInfo(
518518
type_, registration3_name, 80, 0, 0, desc, server_name3, addresses=[socket.inet_aton("10.0.1.2")]
519519
)
520-
zc.registry.add(info)
521-
zc.registry.add(info2)
522-
zc.registry.add(info3)
520+
zc.registry.async_add(info)
521+
zc.registry.async_add(info2)
522+
zc.registry.async_add(info3)
523523

524524
protocol = zc.engine.protocols[0]
525525
now = r.current_time_millis()
@@ -581,7 +581,7 @@ def test_tc_bit_defers_last_response_missing():
581581
assert source_ip not in protocol._timers
582582

583583
# unregister
584-
zc.registry.remove(info)
584+
zc.registry.async_remove(info)
585585
zc.close()
586586

587587

tests/test_handlers.py

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def _process_outgoing_packet(out):
8787
expected_ttl = None
8888
for _ in range(3):
8989
_process_outgoing_packet(zc.generate_service_query(info))
90-
zc.registry.add(info)
90+
zc.registry.async_add(info)
9191
for _ in range(3):
9292
_process_outgoing_packet(zc.generate_service_broadcast(info, None))
9393
assert nbr_answers == 12 and nbr_additionals == 0 and nbr_authorities == 3
@@ -112,7 +112,7 @@ def _process_outgoing_packet(out):
112112

113113
# unregister
114114
expected_ttl = 0
115-
zc.registry.remove(info)
115+
zc.registry.async_remove(info)
116116
for _ in range(3):
117117
_process_outgoing_packet(zc.generate_service_broadcast(info, 0))
118118
assert nbr_answers == 12 and nbr_additionals == 0 and nbr_authorities == 0
@@ -121,7 +121,7 @@ def _process_outgoing_packet(out):
121121
expected_ttl = None
122122
for _ in range(3):
123123
_process_outgoing_packet(zc.generate_service_query(info))
124-
zc.registry.add(info)
124+
zc.registry.async_add(info)
125125
# register service with custom TTL
126126
expected_ttl = const._DNS_HOST_TTL * 2
127127
assert expected_ttl != const._DNS_HOST_TTL
@@ -147,7 +147,7 @@ def _process_outgoing_packet(out):
147147

148148
# unregister
149149
expected_ttl = 0
150-
zc.registry.remove(info)
150+
zc.registry.async_remove(info)
151151
for _ in range(3):
152152
_process_outgoing_packet(zc.generate_service_broadcast(info, 0))
153153
assert nbr_answers == 12 and nbr_additionals == 0 and nbr_authorities == 0
@@ -284,7 +284,7 @@ def test_any_query_for_ptr():
284284
server_name = "ash-2.local."
285285
ipv6_address = socket.inet_pton(socket.AF_INET6, "2001:db8::1")
286286
info = ServiceInfo(type_, registration_name, 80, 0, 0, desc, server_name, addresses=[ipv6_address])
287-
zc.registry.add(info)
287+
zc.registry.async_add(info)
288288

289289
_clear_cache(zc)
290290
generated = r.DNSOutgoing(const._FLAGS_QR_QUERY)
@@ -297,7 +297,7 @@ def test_any_query_for_ptr():
297297
assert multicast_out.answers[0][0].name == type_
298298
assert multicast_out.answers[0][0].alias == registration_name
299299
# unregister
300-
zc.registry.remove(info)
300+
zc.registry.async_remove(info)
301301
zc.close()
302302

303303

@@ -311,7 +311,7 @@ def test_aaaa_query():
311311
server_name = "ash-2.local."
312312
ipv6_address = socket.inet_pton(socket.AF_INET6, "2001:db8::1")
313313
info = ServiceInfo(type_, registration_name, 80, 0, 0, desc, server_name, addresses=[ipv6_address])
314-
zc.registry.add(info)
314+
zc.registry.async_add(info)
315315

316316
generated = r.DNSOutgoing(const._FLAGS_QR_QUERY)
317317
question = r.DNSQuestion(server_name, const._TYPE_AAAA, const._CLASS_IN)
@@ -322,7 +322,7 @@ def test_aaaa_query():
322322
)
323323
assert multicast_out.answers[0][0].address == ipv6_address
324324
# unregister
325-
zc.registry.remove(info)
325+
zc.registry.async_remove(info)
326326
zc.close()
327327

328328

@@ -342,7 +342,7 @@ def test_a_and_aaaa_record_fate_sharing():
342342
aaaa_record = info.dns_addresses(version=r.IPVersion.V6Only)[0]
343343
a_record = info.dns_addresses(version=r.IPVersion.V4Only)[0]
344344

345-
zc.registry.add(info)
345+
zc.registry.async_add(info)
346346

347347
# Test AAAA query
348348
generated = r.DNSOutgoing(const._FLAGS_QR_QUERY)
@@ -375,7 +375,7 @@ def test_a_and_aaaa_record_fate_sharing():
375375
assert len(multicast_out.answers) == 1
376376
assert len(multicast_out.additionals) == 1
377377
# unregister
378-
zc.registry.remove(info)
378+
zc.registry.async_remove(info)
379379
zc.close()
380380

381381

@@ -393,7 +393,7 @@ def test_unicast_response():
393393
type_, registration_name, 80, 0, 0, desc, "ash-2.local.", addresses=[socket.inet_aton("10.0.1.2")]
394394
)
395395
# register
396-
zc.registry.add(info)
396+
zc.registry.async_add(info)
397397
_clear_cache(zc)
398398

399399
# query
@@ -420,7 +420,7 @@ def test_unicast_response():
420420
assert has_srv and has_txt and has_a
421421

422422
# unregister
423-
zc.registry.remove(info)
423+
zc.registry.async_remove(info)
424424
zc.close()
425425

426426

@@ -535,7 +535,7 @@ def test_known_answer_supression():
535535
info = ServiceInfo(
536536
type_, registration_name, 80, 0, 0, desc, server_name, addresses=[socket.inet_aton("10.0.1.2")]
537537
)
538-
zc.registry.add(info)
538+
zc.registry.async_add(info)
539539

540540
now = current_time_millis()
541541
_clear_cache(zc)
@@ -631,7 +631,7 @@ def test_known_answer_supression():
631631
assert not multicast_out or not multicast_out.answers
632632

633633
# unregister
634-
zc.registry.remove(info)
634+
zc.registry.async_remove(info)
635635
zc.close()
636636

637637

@@ -660,9 +660,9 @@ def test_multi_packet_known_answer_supression():
660660
info3 = ServiceInfo(
661661
type_, registration3_name, 80, 0, 0, desc, server_name3, addresses=[socket.inet_aton("10.0.1.2")]
662662
)
663-
zc.registry.add(info)
664-
zc.registry.add(info2)
665-
zc.registry.add(info3)
663+
zc.registry.async_add(info)
664+
zc.registry.async_add(info2)
665+
zc.registry.async_add(info3)
666666

667667
now = current_time_millis()
668668
_clear_cache(zc)
@@ -683,9 +683,9 @@ def test_multi_packet_known_answer_supression():
683683
assert unicast_out is None
684684
assert multicast_out is None
685685
# unregister
686-
zc.registry.remove(info)
687-
zc.registry.remove(info2)
688-
zc.registry.remove(info3)
686+
zc.registry.async_remove(info)
687+
zc.registry.async_remove(info2)
688+
zc.registry.async_remove(info3)
689689
zc.close()
690690

691691

@@ -699,7 +699,7 @@ def test_known_answer_supression_service_type_enumeration_query():
699699
info = ServiceInfo(
700700
type_, registration_name, 80, 0, 0, desc, server_name, addresses=[socket.inet_aton("10.0.1.2")]
701701
)
702-
zc.registry.add(info)
702+
zc.registry.async_add(info)
703703

704704
type_2 = "_otherknown2._tcp.local."
705705
name = "knownname"
@@ -709,7 +709,7 @@ def test_known_answer_supression_service_type_enumeration_query():
709709
info2 = ServiceInfo(
710710
type_2, registration_name2, 80, 0, 0, desc, server_name2, addresses=[socket.inet_aton("10.0.1.2")]
711711
)
712-
zc.registry.add(info2)
712+
zc.registry.async_add(info2)
713713
now = current_time_millis()
714714
_clear_cache(zc)
715715

@@ -755,8 +755,8 @@ def test_known_answer_supression_service_type_enumeration_query():
755755
assert not multicast_out or not multicast_out.answers
756756

757757
# unregister
758-
zc.registry.remove(info)
759-
zc.registry.remove(info2)
758+
zc.registry.async_remove(info)
759+
zc.registry.async_remove(info2)
760760
zc.close()
761761

762762

@@ -777,7 +777,7 @@ async def test_qu_response_only_sends_additionals_if_sends_answer():
777777
info = ServiceInfo(
778778
type_, registration_name, 80, 0, 0, desc, server_name, addresses=[socket.inet_aton("10.0.1.2")]
779779
)
780-
zc.registry.add(info)
780+
zc.registry.async_add(info)
781781

782782
type_2 = "_addtest2._tcp.local."
783783
name = "knownname"
@@ -787,7 +787,7 @@ async def test_qu_response_only_sends_additionals_if_sends_answer():
787787
info2 = ServiceInfo(
788788
type_2, registration_name2, 80, 0, 0, desc, server_name2, addresses=[socket.inet_aton("10.0.1.2")]
789789
)
790-
zc.registry.add(info2)
790+
zc.registry.async_add(info2)
791791

792792
ptr_record = info.dns_pointer()
793793

@@ -888,7 +888,7 @@ async def test_qu_response_only_sends_additionals_if_sends_answer():
888888
assert info2.dns_service() in unicast_out.additionals
889889

890890
# unregister
891-
zc.registry.remove(info)
891+
zc.registry.async_remove(info)
892892
await aiozc.async_close()
893893

894894

0 commit comments

Comments
 (0)