Merge lp:~bigkevmcd/landscape-client/218388-limit-free-space-messages into lp:~landscape/landscape-client/trunk

Proposed by Kevin McDermott
Status: Merged
Merge reported by: Kevin McDermott
Merged at revision: not available
Proposed branch: lp:~bigkevmcd/landscape-client/218388-limit-free-space-messages
Merge into: lp:~landscape/landscape-client/trunk
Diff against target: 115 lines (+74/-5)
2 files modified
landscape/monitor/mountinfo.py (+8/-3)
landscape/monitor/tests/test_mountinfo.py (+66/-2)
To merge this branch: bzr merge lp:~bigkevmcd/landscape-client/218388-limit-free-space-messages
Reviewer Review Type Date Requested Status
Thomas Herve (community) Approve
Free Ekanayaka (community) Approve
Review via email: mp+18251@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Kevin McDermott (bigkevmcd) wrote :

This provides a hard limit on the number of free space items...

I picked a fairly arbitrary number to limit it to...

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

Nice fix, +1!

[1]

+ MAX_FREE_SPACE_ITEMS_TO_EXCHANGE = 200
+

This is only about cosmetics, but in general I don't think we upper-case class attributes, even if meant to be constant (well, and that's a bit already implied by the fact that they are class attributes, or at least it should be a hint). So I'd suggest to lower-case it to max_free_space_items_to_exchange.

review: Approve
201. By Kevin McDermott

Change MAX_FREE_SPACE... to max_free_space... from Free's review.

Revision history for this message
Thomas Herve (therve) wrote :

Looks good, +1.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'landscape/monitor/mountinfo.py'
2--- landscape/monitor/mountinfo.py 2009-10-06 16:27:23 +0000
3+++ landscape/monitor/mountinfo.py 2010-01-29 12:20:31 +0000
4@@ -12,6 +12,8 @@
5
6 persist_name = "mount-info"
7
8+ max_free_space_items_to_exchange = 200
9+
10 def __init__(self, interval=300, monitor_interval=60*60,
11 mounts_file="/proc/mounts", create_time=time.time,
12 statvfs=None, hal_manager=None, mtab_file="/etc/mtab"):
13@@ -69,8 +71,12 @@
14
15 def create_free_space_message(self):
16 if self._free_space:
17- message = {"type": "free-space", "free-space": self._free_space}
18- self._free_space = []
19+ items_to_exchange = self._free_space[
20+ :self.max_free_space_items_to_exchange]
21+ message = {"type": "free-space",
22+ "free-space": items_to_exchange}
23+ self._free_space = self._free_space[
24+ self.max_free_space_items_to_exchange:]
25 return message
26 return None
27
28@@ -214,4 +220,3 @@
29 if "bind" in options.split(","):
30 bound_points.add(mount_point)
31 return bound_points
32-
33
34=== modified file 'landscape/monitor/tests/test_mountinfo.py'
35--- landscape/monitor/tests/test_mountinfo.py 2009-10-06 14:20:01 +0000
36+++ landscape/monitor/tests/test_mountinfo.py 2010-01-29 12:20:31 +0000
37@@ -240,8 +240,8 @@
38
39 message = [d for d in messages if d["type"] == "free-space"][0]
40 free_space = message["free-space"]
41- for i in range(1, 1):
42- self.assertEquals(free_space[i][0], i * step_size)
43+ for i in range(len(free_space)):
44+ self.assertEquals(free_space[i][0], (i + 1) * step_size)
45 self.assertEquals(free_space[i][1], "/")
46 self.assertEquals(free_space[i][2], 409600)
47
48@@ -728,3 +728,67 @@
49 plugin.run()
50 message3 = plugin.create_mount_info_message()
51 self.assertIdentical(message3, None)
52+
53+ def test_exchange_limits_exchanged_free_space_messages(self):
54+ """
55+ In order not to overload the server, the client should stagger the
56+ exchange of free-space messages.
57+ """
58+ def statvfs(path):
59+ return (4096, 0, mb(1000), mb(100), 0, 0, 0, 0, 0)
60+
61+ filename = self.makeFile("""\
62+/dev/hda1 / ext3 rw 0 0
63+""")
64+ plugin = self.get_mount_info(mounts_file=filename, statvfs=statvfs,
65+ create_time=self.reactor.time,
66+ mtab_file=filename)
67+ # Limit the test exchange to 5 items.
68+ plugin.max_free_space_items_to_exchange = 5
69+ step_size = self.monitor.step_size
70+ self.monitor.add(plugin)
71+
72+ # Exchange should trigger a flush of the persist database
73+ registry_mocker = self.mocker.replace(plugin.registry)
74+ registry_mocker.flush()
75+ self.mocker.result(None)
76+ self.mocker.replay()
77+
78+ # Generate 10 data points
79+ self.reactor.advance(step_size * 10)
80+ self.monitor.exchange()
81+
82+ messages = self.mstore.get_pending_messages()
83+ self.assertEquals(len(messages), 3)
84+
85+ message = [d for d in messages if d["type"] == "free-space"][0]
86+ free_space = message["free-space"]
87+ free_space_items = len(free_space)
88+ self.assertEquals(free_space_items, 5)
89+ for i in range(free_space_items):
90+ self.assertEquals(free_space[i][0], (i + 1) * step_size)
91+ self.assertEquals(free_space[i][1], "/")
92+ self.assertEquals(free_space[i][2], 409600)
93+
94+ # The second exchange should pick up the remaining items.
95+ self.mstore.delete_all_messages()
96+ self.monitor.exchange()
97+
98+ messages = self.mstore.get_pending_messages()
99+ self.assertEquals(len(messages), 1)
100+
101+ message = [d for d in messages if d["type"] == "free-space"][0]
102+ free_space = message["free-space"]
103+ free_space_items = len(free_space)
104+ self.assertEquals(free_space_items, 5)
105+ for i in range(free_space_items):
106+ # Note (i+6) we've already retrieved the first 5 items.
107+ self.assertEquals(free_space[i][0], (i + 6) * step_size)
108+ self.assertEquals(free_space[i][1], "/")
109+ self.assertEquals(free_space[i][2], 409600)
110+
111+ # Third exchange should not get any further free-space messages
112+ self.mstore.delete_all_messages()
113+ self.monitor.exchange()
114+ messages = self.mstore.get_pending_messages()
115+ self.assertEquals(len(messages), 0)

Subscribers

People subscribed via source and target branches

to all changes: