Merge lp:~free.ekanayaka/landscape-client/dont-reuse-connectors into lp:~landscape/landscape-client/trunk

Proposed by Free Ekanayaka
Status: Merged
Approved by: Kevin McDermott
Approved revision: 284
Merge reported by: Free Ekanayaka
Merged at revision: not available
Proposed branch: lp:~free.ekanayaka/landscape-client/dont-reuse-connectors
Merge into: lp:~landscape/landscape-client/trunk
Diff against target: 138 lines (+50/-11)
3 files modified
landscape/manager/tests/test_usermanager.py (+35/-0)
landscape/manager/usermanager.py (+9/-6)
landscape/monitor/usermonitor.py (+6/-5)
To merge this branch: bzr merge lp:~free.ekanayaka/landscape-client/dont-reuse-connectors
Reviewer Review Type Date Requested Status
Kevin McDermott (community) Approve
Jamu Kakar (community) Approve
Review via email: mp+33366@code.launchpad.net

Description of the change

The problem was that the connector object was being reused, meaning multiple connect() calls at the same time. This branch makes the UserManager and UserMonitor use one connector object per connection.

To post a comment you must log in.
Revision history for this message
Jamu Kakar (jkakar) wrote :

[1]

     def _message_dispatch(self, message):

+ user_monitor_connector = RemoteUserMonitorConnector(
+ self.registry.reactor, self.registry.config)

The leading blank line here isn't necessary. Also, would you mind
adding a docstring to this message, please?

Looks good, +1!

review: Approve
Revision history for this message
Kevin McDermott (bigkevmcd) wrote :

Looks good to me, +1

Tested and works fine.

review: Approve
Revision history for this message
Free Ekanayaka (free.ekanayaka) wrote :

Thanks!

[1] fixed

285. By Free Ekanayaka

Add docstring (Jamu [1])

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'landscape/manager/tests/test_usermanager.py'
2--- landscape/manager/tests/test_usermanager.py 2010-04-26 15:19:55 +0000
3+++ landscape/manager/tests/test_usermanager.py 2010-08-23 11:50:51 +0000
4@@ -1,6 +1,7 @@
5 import os
6
7 from landscape.lib.persist import Persist
8+from landscape.lib.twisted_util import gather_results
9 from landscape.manager.plugin import SUCCEEDED, FAILED
10 from landscape.monitor.usermonitor import UserMonitor
11 from landscape.manager.usermanager import (
12@@ -332,6 +333,40 @@
13 result.addCallback(handle_callback)
14 return result
15
16+ def test_many_remove_user_events(self):
17+ """
18+ The L{UserManager} can handle multiple remove-user events at the same
19+ time.
20+ """
21+ users = [("foo", "x", 1000, 1000, "Foo,,,,", "/home/foo", "/bin/zsh"),
22+ ("bar", "x", 1001, 1001, "Bar,,,,", "/home/bar", "/bin/zsh")]
23+ self.setup_environment(users, [], None)
24+
25+ def handle_callback(ignored):
26+ messages = self.broker_service.message_store.get_pending_messages()
27+ # Ignore the message created by plugin.run.
28+ self.assertMessages([messages[2], messages[1]],
29+ [{"type": "operation-result",
30+ "status": SUCCEEDED,
31+ "operation-id": 40, "timestamp": 0,
32+ "result-text": "remove_user succeeded"},
33+ {"type": "operation-result",
34+ "status": SUCCEEDED,
35+ "operation-id": 39, "timestamp": 0,
36+ "result-text": "remove_user succeeded"}])
37+
38+
39+ results = []
40+ results.append(self.manager.dispatch_message({"username": "foo",
41+ "delete-home": True,
42+ "type": "remove-user",
43+ "operation-id": 39}))
44+ results.append(self.manager.dispatch_message({"username": "bar",
45+ "delete-home": True,
46+ "type": "remove-user",
47+ "operation-id": 40}))
48+ return gather_results(results).addCallback(handle_callback)
49+
50 def test_failing_remove_user_event(self):
51 """
52 When a C{remove-user} event is received, and the user doesn't exist, we
53
54=== modified file 'landscape/manager/usermanager.py'
55--- landscape/manager/usermanager.py 2010-05-03 13:08:02 +0000
56+++ landscape/manager/usermanager.py 2010-08-23 11:50:51 +0000
57@@ -42,8 +42,6 @@
58 socket = os.path.join(self.registry.config.sockets_path,
59 self.name + ".sock")
60 self._port = self.registry.reactor.listen_unix(socket, factory)
61- self._user_monitor_connector = RemoteUserMonitorConnector(
62- self.registry.reactor, self.registry.config)
63
64 for message_type in self._message_types:
65 self._registry.register_message(message_type,
66@@ -71,15 +69,22 @@
67 return locked_users
68
69 def _message_dispatch(self, message):
70+ """Dispatch the given user-change request to the correct handler.
71+
72+ @param message: The request we got from the server.
73+ """
74+ user_monitor_connector = RemoteUserMonitorConnector(
75+ self.registry.reactor, self.registry.config)
76
77 def detect_changes(user_monitor):
78 self._user_monitor = user_monitor
79 return user_monitor.detect_changes()
80
81- result = self._user_monitor_connector.connect()
82+ result = user_monitor_connector.connect()
83 result.addCallback(detect_changes)
84 result.addCallback(self._perform_operation, message)
85 result.addCallback(self._send_changes, message)
86+ result.addCallback(lambda x: user_monitor_connector.disconnect())
87 return result
88
89 def _perform_operation(self, result, message):
90@@ -89,9 +94,7 @@
91 message)
92
93 def _send_changes(self, result, message):
94- result = self._user_monitor.detect_changes(message["operation-id"])
95- result.addCallback(lambda x: self._user_monitor_connector.disconnect())
96- return result
97+ return self._user_monitor.detect_changes(message["operation-id"])
98
99 def _add_user(self, message):
100 """Run an C{add-user} operation."""
101
102=== modified file 'landscape/monitor/usermonitor.py'
103--- landscape/monitor/usermonitor.py 2010-05-03 13:08:02 +0000
104+++ landscape/monitor/usermonitor.py 2010-08-23 11:50:51 +0000
105@@ -37,9 +37,6 @@
106 socket = os.path.join(self.registry.config.sockets_path,
107 self.name + ".sock")
108 self._port = self.registry.reactor.listen_unix(socket, factory)
109- from landscape.manager.usermanager import RemoteUserManagerConnector
110- self._user_manager_connector = RemoteUserManagerConnector(
111- self.registry.reactor, self.registry.config)
112
113 def stop(self):
114 """Stop listening for incoming AMP connections."""
115@@ -67,6 +64,10 @@
116 @param operation_id: When present it will be included in the
117 C{operation-id} field.
118 """
119+ from landscape.manager.usermanager import RemoteUserManagerConnector
120+ user_manager_connector = RemoteUserManagerConnector(
121+ self.registry.reactor, self.registry.config)
122+
123 # We'll skip checking the locked users if we're in monitor-only mode.
124 if getattr(self.registry.config, "monitor_only", False):
125 result = maybeDeferred(self._detect_changes,
126@@ -77,10 +78,10 @@
127 return user_manager.get_locked_usernames()
128
129 def disconnect(locked_usernames):
130- self._user_manager_connector.disconnect()
131+ user_manager_connector.disconnect()
132 return locked_usernames
133
134- result = self._user_manager_connector.connect()
135+ result = user_manager_connector.connect()
136 result.addCallback(get_locked_usernames)
137 result.addCallback(disconnect)
138 result.addCallback(self._detect_changes, operation_id)

Subscribers

People subscribed via source and target branches

to all changes: