Merge ~blake-rouse/maas:fix-1768575-uvloop-rack into maas:master

Proposed by Blake Rouse
Status: Merged
Approved by: Blake Rouse
Approved revision: cb261995ff125d8747b3ccaaee2c299d78b5dcb9
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~blake-rouse/maas:fix-1768575-uvloop-rack
Merge into: maas:master
Diff against target: 160 lines (+37/-22)
5 files modified
src/maasserver/server.py (+17/-0)
src/provisioningserver/plugin.py (+1/-5)
src/provisioningserver/server.py (+7/-7)
src/provisioningserver/tests/test_plugin.py (+11/-9)
utilities/check-imports (+1/-1)
Reviewer Review Type Date Requested Status
Newell Jensen (community) Approve
Andres Rodriguez (community) Approve
MAAS Lander unittests Pending
Review via email: mp+345320@code.launchpad.net

Commit message

LP: #1768575 - Re-enable the DHCP probing service, but don't use uvloop in the rackd. Only use uvloop in the regiond. Once authbind is removed then uvloop can be re-enabled in the rack.

To post a comment you must log in.
Revision history for this message
Andres Rodriguez (andreserl) wrote :

lgtm!

review: Approve
Revision history for this message
Newell Jensen (newell-jensen) wrote :

LGTM.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/server.py b/src/maasserver/server.py
2index a1e4eaf..205a9e1 100644
3--- a/src/maasserver/server.py
4+++ b/src/maasserver/server.py
5@@ -13,20 +13,37 @@ os.environ.setdefault(
6 "DJANGO_SETTINGS_MODULE", "maasserver.djangosettings.settings")
7
8
9+def installUvloop():
10+ """Install uvloop to asyncio to use."""
11+ # XXX blake_r: LP: #1768575 - This is only done for the regiond, the rackd
12+ # uses the standard asyncio reactor. Once rackd removes the need for
13+ # authbind then it can be moved back into the region and this can be
14+ # removed.
15+ import asyncio
16+ try:
17+ import uvloop
18+ asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
19+ except ImportError:
20+ pass
21+
22+
23 def runMasterServices():
24 """Run the maas-regiond master services."""
25+ installUvloop()
26 from provisioningserver.server import runService
27 runService("maas-regiond-master")
28
29
30 def runAllInOneServices():
31 """Run the maas-regiond all-in-one services."""
32+ installUvloop()
33 from provisioningserver.server import runService
34 runService("maas-regiond-all")
35
36
37 def runWorkerServices():
38 """Run the worker service."""
39+ installUvloop()
40 from provisioningserver.server import runService
41 runService("maas-regiond-worker")
42
43diff --git a/src/provisioningserver/plugin.py b/src/provisioningserver/plugin.py
44index 4f0a88a..98c7e31 100644
45--- a/src/provisioningserver/plugin.py
46+++ b/src/provisioningserver/plugin.py
47@@ -183,11 +183,7 @@ class ProvisioningServiceMaker:
48 # Other services that make up the MAAS Region Controller.
49 yield self._makeRPCPingService(rpc_service, clock=clock)
50 yield self._makeNetworksMonitoringService(rpc_service, clock=clock)
51- # XXX blake_r: #1768575 - DHCP probing service using `socket.bind`
52- # with authbind and uvloop causes `socket.bind` to block indefinitely.
53- # Disable the DHCP probing service until its moved to use its own
54- # subprocess.
55- # yield self._makeDHCPProbeService(rpc_service)
56+ yield self._makeDHCPProbeService(rpc_service)
57 yield self._makeLeaseSocketService(rpc_service)
58 yield self._makeNodePowerMonitorService()
59 yield self._makeServiceMonitorService(rpc_service)
60diff --git a/src/provisioningserver/server.py b/src/provisioningserver/server.py
61index e305a5f..aaf7b01 100644
62--- a/src/provisioningserver/server.py
63+++ b/src/provisioningserver/server.py
64@@ -5,17 +5,17 @@
65
66 # Install the asyncio reactor with uvloop. This must be done before any other
67 # twisted code is imported.
68-import asyncio
69 import sys
70
71 from twisted.internet import asyncioreactor
72
73-
74-try:
75- import uvloop
76- asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
77-except ImportError:
78- pass
79+# XXX blake_r: LP: #1768575 - Disable uvloop on the rackd process because
80+# forking with uvloop from authbind causes the rackd to lock up.
81+# try:
82+# import uvloop
83+# asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
84+# except ImportError:
85+# pass
86 asyncioreactor.install()
87
88
89diff --git a/src/provisioningserver/tests/test_plugin.py b/src/provisioningserver/tests/test_plugin.py
90index 130cdfc..a253ea8 100644
91--- a/src/provisioningserver/tests/test_plugin.py
92+++ b/src/provisioningserver/tests/test_plugin.py
93@@ -22,6 +22,9 @@ from provisioningserver.plugin import (
94 Options,
95 ProvisioningServiceMaker,
96 )
97+from provisioningserver.rackdservices.dhcp_probe_service import (
98+ DHCPProbeService,
99+)
100 from provisioningserver.rackdservices.image import BootImageEndpointService
101 from provisioningserver.rackdservices.image_download_service import (
102 ImageDownloadService,
103@@ -105,7 +108,7 @@ class TestProvisioningServiceMaker(MAASTestCase):
104 service = service_maker.makeService(options, clock=None)
105 self.assertIsInstance(service, MultiService)
106 expected_services = [
107- "networks_monitor", "image_download",
108+ "dhcp_probe", "networks_monitor", "image_download",
109 "lease_socket_service", "node_monitor", "ntp", "rpc", "rpc-ping",
110 "tftp", "image_service", "service_monitor",
111 ]
112@@ -129,7 +132,7 @@ class TestProvisioningServiceMaker(MAASTestCase):
113 service = service_maker.makeService(options, clock=None)
114 self.assertIsInstance(service, MultiService)
115 expected_services = [
116- "networks_monitor", "image_download",
117+ "dhcp_probe", "networks_monitor", "image_download",
118 "lease_socket_service", "node_monitor", "ntp", "rpc", "rpc-ping",
119 "tftp", "image_service", "service_monitor",
120 ]
121@@ -188,13 +191,12 @@ class TestProvisioningServiceMaker(MAASTestCase):
122 networks_monitor = service.getServiceNamed("networks_monitor")
123 self.assertIsInstance(networks_monitor, RackNetworksMonitoringService)
124
125- # XXX blake_r: #1768575 - Disabled DHCP probing service.
126- # def test_dhcp_probe_service(self):
127- # options = Options()
128- # service_maker = ProvisioningServiceMaker("Spike", "Milligan")
129- # service = service_maker.makeService(options, clock=None)
130- # dhcp_probe = service.getServiceNamed("dhcp_probe")
131- # self.assertIsInstance(dhcp_probe, DHCPProbeService)
132+ def test_dhcp_probe_service(self):
133+ options = Options()
134+ service_maker = ProvisioningServiceMaker("Spike", "Milligan")
135+ service = service_maker.makeService(options, clock=None)
136+ dhcp_probe = service.getServiceNamed("dhcp_probe")
137+ self.assertIsInstance(dhcp_probe, DHCPProbeService)
138
139 def test_service_monitor_service(self):
140 options = Options()
141diff --git a/utilities/check-imports b/utilities/check-imports
142index 853711a..1067977 100755
143--- a/utilities/check-imports
144+++ b/utilities/check-imports
145@@ -228,7 +228,6 @@ RackControllerRule = Rule(
146 Allow("tempita"),
147 Allow("tftp|tftp.**"),
148 Allow("twisted.**"),
149- Allow("uvloop"),
150 Allow("yaml"),
151 Allow("zope.interface|zope.interface.**"),
152 Allow(StandardLibraries),
153@@ -280,6 +279,7 @@ RegionControllerRule = Rule(
154 Allow("simplestreams.**"),
155 Allow("tempita"),
156 Allow("twisted.**"),
157+ Allow("uvloop"),
158 Allow("yaml"),
159 Allow("zope.interface|zope.interface.**"),
160 Allow("oauthlib.oauth1"),

Subscribers

People subscribed via source and target branches