Merge ~cgrabowski/maas:handle_all_connections_busy_in_getRegionClient into maas:master

Proposed by Christian Grabowski
Status: Merged
Approved by: Christian Grabowski
Approved revision: e7653e53a746f2fd8b807e5a0096508840f33e9b
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~cgrabowski/maas:handle_all_connections_busy_in_getRegionClient
Merge into: maas:master
Diff against target: 70 lines (+28/-5)
3 files modified
src/provisioningserver/rpc/__init__.py (+2/-1)
src/provisioningserver/rpc/clusterservice.py (+8/-4)
src/provisioningserver/rpc/tests/test_clusterservice.py (+18/-0)
Reviewer Review Type Date Requested Status
MAAS Lander Approve
Alberto Donato (community) Approve
Adam Collard (community) Approve
Review via email: mp+428920@code.launchpad.net

Commit message

allow getRegionClient to use a busy connection

To post a comment you must log in.
Revision history for this message
Adam Collard (adam-collard) :
review: Approve
Revision history for this message
Alberto Donato (ack) wrote :

LGTM, +1

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b handle_all_connections_busy_in_getRegionClient lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: e7653e53a746f2fd8b807e5a0096508840f33e9b

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/provisioningserver/rpc/__init__.py b/src/provisioningserver/rpc/__init__.py
2index d5a36ed..0388356 100644
3--- a/src/provisioningserver/rpc/__init__.py
4+++ b/src/provisioningserver/rpc/__init__.py
5@@ -25,4 +25,5 @@ def getRegionClient():
6 "Cluster services are unavailable."
7 )
8 else:
9- return rpc_service.getClient()
10+ # won't scale connections if existing connections are busy, but will always return connection if one exists
11+ return rpc_service.getClient(busy_ok=True)
12diff --git a/src/provisioningserver/rpc/clusterservice.py b/src/provisioningserver/rpc/clusterservice.py
13index a7205db..d9baf8d 100644
14--- a/src/provisioningserver/rpc/clusterservice.py
15+++ b/src/provisioningserver/rpc/clusterservice.py
16@@ -1230,7 +1230,7 @@ class ClusterClientService(TimerService):
17 self.time_started = self.clock.seconds()
18 super().startService()
19
20- def getClient(self):
21+ def getClient(self, busy_ok=False):
22 """Returns a :class:`common.Client` connected to a region.
23
24 The client is chosen at random.
25@@ -1246,9 +1246,13 @@ class ClusterClientService(TimerService):
26 self.connections.get_random_free_connection()
27 )
28 except exceptions.AllConnectionsBusy as e:
29- for endpoint_conns in self.connections.values():
30- if len(endpoint_conns) < self.connections._max_connections:
31- raise e
32+ if not busy_ok:
33+ for endpoint_conns in self.connections.values():
34+ if (
35+ len(endpoint_conns)
36+ < self.connections._max_connections
37+ ):
38+ raise e
39 # return a busy connection, assume it will free up or timeout
40 return common.Client(self.connections.get_random_connection())
41
42diff --git a/src/provisioningserver/rpc/tests/test_clusterservice.py b/src/provisioningserver/rpc/tests/test_clusterservice.py
43index 6f3e4f9..04b7d66 100644
44--- a/src/provisioningserver/rpc/tests/test_clusterservice.py
45+++ b/src/provisioningserver/rpc/tests/test_clusterservice.py
46@@ -1300,6 +1300,24 @@ class TestClusterClientService(MAASTestCase):
47 service.connections.connections = {}
48 self.assertRaises(exceptions.NoConnectionsAvailable, service.getClient)
49
50+ def test_getClient_returns_a_busy_connection_when_busy_ok_is_True(self):
51+ service = ClusterClientService(Clock(), max_conns=1)
52+ service.connections.connections = {
53+ sentinel.eventloop01: [FakeBusyConnectionToRegion()],
54+ sentinel.eventloop02: [FakeBusyConnectionToRegion()],
55+ sentinel.eventloop03: [FakeBusyConnectionToRegion()],
56+ }
57+ client = service.getClient(busy_ok=True)
58+ self.assertTrue(client._conn.in_use)
59+ self.assertIn(
60+ client,
61+ {
62+ common.Client(conn)
63+ for conns in service.connections.values()
64+ for conn in conns
65+ },
66+ )
67+
68 @inlineCallbacks
69 def test_getClientNow_scales_connections_when_busy(self):
70 service = ClusterClientService(Clock(), max_conns=2)

Subscribers

People subscribed via source and target branches