Merge lp:~patrick-crews/drizzle/dbqp_bug713802 into lp:drizzle/7.0

Proposed by Patrick Crews
Status: Merged
Approved by: Lee Bieber
Approved revision: 2149
Merged at revision: 2149
Proposed branch: lp:~patrick-crews/drizzle/dbqp_bug713802
Merge into: lp:drizzle/7.0
Diff against target: 150 lines (+49/-47)
2 files modified
tests/lib/sys_mgmt/port_management.py (+39/-46)
tests/lib/test_mgmt/test_execution.py (+10/-1)
To merge this branch: bzr merge lp:~patrick-crews/drizzle/dbqp_bug713802
Reviewer Review Type Date Requested Status
Drizzle Developers Pending
Review via email: mp+48807@code.launchpad.net

Description of the change

Fixed port management - we now write per-port files to /tmp that we clean up post-run.
This allows different access-having users to all use the system (we only see if a port file exists to know it is 'locked') We also clean up after ourselves to be a good citizen : )

To post a comment you must log in.
2150. By Patrick Crews

Minor tweak to start-and-exit (report server info prior to exit) and update of port_file_naming

2151. By Patrick Crews

Further port_management work. Blow away unused port files on --start-and-exit. Also removed previous references to port catalog (old method). Tweaked when we report server information on --start-and-exit

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'tests/lib/sys_mgmt/port_management.py'
2--- tests/lib/sys_mgmt/port_management.py 2011-02-04 20:41:08 +0000
3+++ tests/lib/sys_mgmt/port_management.py 2011-02-07 18:13:20 +0000
4@@ -37,7 +37,8 @@
5 self.skip_keys = [ 'port_file_delimiter'
6 , 'system_manager'
7 ]
8- self.port_catalog = "/tmp/drizzle_test_port_catalog.dat"
9+ self.working_dir = "/tmp"
10+ self.file_prefix = "dbqp_port"
11 self.port_file_delimiter = ':' # what we use to separate port:owner
12 self.debug = debug
13 self.logging = system_manager.logging
14@@ -96,7 +97,7 @@
15 sys.exit(1)
16
17 def check_port_status(self, port):
18- """ Check if a port is in use, via the catalog file
19+ """ Check if a port is in use, via the port files
20 which all copies of dbqp.py should use
21
22 Not *really* sure how well this works with multiple
23@@ -104,9 +105,9 @@
24 to work
25
26 """
27- # read the catalog file
28- port_catalog = self.process_port_catalog()
29- if port not in port_catalog and not self.is_port_used(port):
30+ # check existing ports dbqp has created
31+ dbqp_ports = self.check_dbqp_ports()
32+ if port not in dbqp_ports and not self.is_port_used(port):
33 return 1
34 else:
35 return 0
36@@ -143,59 +144,51 @@
37 return 1
38 return 0
39
40- def process_port_catalog(self):
41- """ Read in the catalog file so that we can see
42- if the port is in use or not
43+
44+
45+ def check_dbqp_ports(self):
46+ """ Scan the files in /tmp for those files named
47+ dbqp_port_NNNN. Existence indicates said port is 'locked'
48
49 """
50- port_catalog = {}
51- delimiter = ':'
52- if os.path.exists(self.port_catalog):
53- try:
54- port_file = open(self.port_catalog,'r')
55- for line in port_file:
56- line = line.strip()
57- port, owner = line.split(self.port_file_delimiter)
58- port_catalog[port] = owner
59- port_file.close()
60- except IOError, e:
61- self.logging.error("Problem opening port catalog file: %s" %(self.port_catalog))
62- self.logging.error("%s" %e)
63- sys.exit(1)
64- return port_catalog
65+ used_ports = []
66+ tmp_files = os.listdir('/tmp')
67+ for tmp_file in tmp_files:
68+ if tmp_file.startswith('dbqp_port'):
69+ used_ports.append(int(tmp_file.split('_')[-1]))
70+ return used_ports
71
72 def assign_port(self, owner, port):
73- """Assigns a port - logs it in the port_catalog file"""
74-
75- data_string = "%d:%s\n" %(port, owner)
76- try:
77- port_file = open(self.port_catalog,'a')
78- port_file.write(data_string)
79- port_file.close()
80- except IOError, e:
81- self.logging.error("Problem opening port catalog file: %s" %(self.port_catalog))
82- self.logging.error("%s" %e)
83- sys.exit(1)
84+ """Assigns a port - create a tmpfile
85+ with a name that 'logs' the port
86+ as being used
87+
88+ """
89+
90+ out_file = open(self.get_file_name(port),'w')
91+ out_file.write("%s:%d\n" %(owner, port))
92+ out_file.close()
93
94 def free_ports(self, portlist):
95- """ Clean up our port catalog """
96+ """ Clean up our ports """
97 for port in portlist:
98 self.free_port(port)
99
100 def free_port(self, port):
101- """ Free a single port from the catalog """
102+ """ Free a single port - we delete the file
103+ that 'locks' it
104+
105+ """
106+
107 if self.debug:
108 self.logging.debug("Freeing port %d" %(port))
109- port_catalog = self.process_port_catalog()
110- port_catalog.pop(str(port),None)
111- self.write_port_catalog(port_catalog)
112-
113- def write_port_catalog(self, port_catalog):
114- port_file = open(self.port_catalog, 'w')
115- for key, value in port_catalog.items():
116- port_file.write(("%s:%s\n" %(key, value)))
117- port_file.close()
118-
119+ os.remove(self.get_file_name(port))
120+
121+ def get_file_name(self, port):
122+ """ We generate a file name for the port """
123+
124+ port_file_name = "%s_%s_%d" %(self.file_prefix, self.system_manager.cur_user, port )
125+ return os.path.join(self.working_dir, port_file_name)
126
127
128
129
130=== modified file 'tests/lib/test_mgmt/test_execution.py'
131--- tests/lib/test_mgmt/test_execution.py 2011-02-04 20:41:08 +0000
132+++ tests/lib/test_mgmt/test_execution.py 2011-02-07 18:13:20 +0000
133@@ -111,7 +111,16 @@
134 else:
135 if start_and_exit:
136 # TODO: Report out all started servers via server_manager/server objects?
137- self.logging.info("User specified --start-and-exit. dbqp.py exiting and leaving servers running...")
138+ self.current_servers[0].report()
139+ self.logging.info("User specified --start-and-exit. dbqp.py exiting and leaving servers running...")
140+ # We blow away any port_management files for our ports
141+ # Technically this won't let us 'lock' any ports that
142+ # we aren't explicitly using (visible to netstat scan)
143+ # However one could argue that if we aren't using it,
144+ # We shouldn't hog it ; )
145+ # We might need to do this better later
146+ for server in current_servers:
147+ server.cleanup() # this only removes any port files
148 sys.exit(0)
149 if self.initial_run:
150 self.initial_run = 0

Subscribers

People subscribed via source and target branches