2
# -*- mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
3
# vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
5
# Copyright (C) 2010 Patrick Crews
7
"""server_management.py
8
code for dealing with apportioning servers
9
to suit the needs of the tests and executors
16
""" code that handles the server objects
17
We use this to track, do mass actions, etc
18
Single point of contact for this business
22
def __init__(self, system_manager, variables):
23
self.skip_keys = [ 'ld_preload'
26
self.debug = variables['debug']
27
self.verbose = variables['verbose']
29
self.server_base_name = 'server'
30
self.no_secure_file_priv = variables['nosecurefilepriv']
31
self.system_manager = system_manager
32
self.logging = system_manager.logging
33
self.code_tree = system_manager.code_tree
36
self.ld_preload = system_manager.ld_preload
37
self.mutex = thread.allocate_lock()
40
self.logging.debug_class(self)
42
def request_servers( self, requester, workdir, master_count
43
, slave_count, server_options
45
""" We produce the server objects / start the server processes
46
as requested. We report errors and whatnot if we can't
47
That is, unless we expect the server to not start, then
48
we just return a value / message
52
# Make sure we have the proper number of servers for this requester
53
self.process_server_count( requester, master_count+slave_count
54
, workdir, server_options)
56
# Make sure we are running with the correct options
57
self.evaluate_existing_servers(requester, server_options)
60
self.start_servers(requester, expect_fail)
62
# Return them to the requester
63
return self.get_server_list(requester)
67
def allocate_server(self, requester, server_options, workdir):
68
""" Intialize an appropriate server object.
69
Start up occurs elsewhere
72
# Get a name for our server
73
server_name = self.get_server_name(requester)
75
# initialize a server_object
76
if self.code_tree.type == 'Drizzle':
77
from lib.server_mgmt.drizzled import drizzleServer as server_type
78
new_server = server_type( server_name, self, server_options
79
, requester, workdir )
80
self.log_server(new_server, requester)
82
def start_servers(self, requester, expect_fail):
83
""" Start all servers for the requester """
84
for server in self.get_server_list(requester):
85
if server.status == 0:
86
server.start(expect_fail)
88
def stop_server(self, server):
89
""" Stop an individual server if it is running """
90
if server.status == 1:
93
def stop_servers(self, requester):
94
""" Stop all servers running for the requester """
95
for server in self.get_server_list(requester):
96
self.stop_server(server)
98
def stop_server_list(self, server_list):
99
""" Stop the servers in an arbitrary list of them """
100
for server in server_list:
101
self.stop_server(server)
103
def stop_all_servers(self):
104
""" Stop all running servers """
106
self.logging.info("Stopping all running servers...")
107
for server_list in self.servers.values():
108
for server in server_list:
109
self.stop_server(server)
111
def cleanup_all_servers(self):
112
"""Mainly for freeing server ports for now """
113
for server_list in self.servers.values():
114
for server in server_list:
118
"""Stop all servers and free their ports and whatnot """
119
self.stop_all_servers()
120
self.cleanup_all_servers()
122
def get_server_name(self, requester):
123
""" We name our servers requester.server_basename.count
124
where count is on a per-requester basis
125
We see how many servers this requester has and name things
130
server_count = self.server_count(requester)
131
return "%s%d" %(self.server_base_name, server_count)
133
def has_servers(self, requester):
134
""" Check if the given requester has any servers """
135
if requester not in self.servers: # new requester
136
self.servers[requester] = []
137
return self.server_count(requester)
139
def log_server(self, new_server, requester):
140
self.servers[requester].append(new_server)
142
def evaluate_existing_servers( self, requester, server_options):
143
""" See if the requester has any servers and if they
144
are suitable for the current test
147
current_servers = self.servers[requester]
149
for server in current_servers:
150
if self.compare_options( server.server_options
154
# We need to reset what is running and change the server
156
self.reset_server(server)
157
self.update_server_options(server, server_options)
160
def compare_options(self, optlist1, optlist2):
161
""" Compare two sets of server options and see if they match """
162
return sorted(optlist1) == sorted(optlist2)
164
def reset_server(self, server):
165
self.stop_server(server)
166
server.restore_snapshot()
168
def reset_servers(self, requester):
169
for server in self.servers[requester]:
170
self.reset_server(server)
173
def process_server_count(self, requester, desired_count, workdir, server_options):
174
""" We see how many servers we have. We shrink / grow
175
the requesters set of servers as needed.
177
If we shrink, we shutdown / reset the discarded servers
182
current_count = self.has_servers(requester)
183
if desired_count > current_count:
184
for i in range(desired_count - current_count):
185
self.allocate_server(requester, server_options, workdir)
186
elif desired_count < current_count:
187
good_servers = self.get_server_list(requester)[:desired_count]
188
retired_servers = self.get_server_list(requester)[desired_count - current_count:]
189
self.stop_server_list(retired_servers)
190
self.set_server_list(requester, good_servers)
194
def server_count(self, requester):
195
""" Return how many servers the the requester has """
196
return len(self.servers[requester])
198
def get_server_list(self, requester):
199
""" Return the list of servers assigned to the requester """
200
return self.servers[requester]
202
def set_server_list(self, requester, server_list):
203
""" Set the requesters list of servers to server_list """
205
self.servers[requester] = server_list
207
def add_server(self, requester, new_server):
208
""" Add new_server to the requester's set of servers """
209
self.servers[requester].append(new_server)
211
def update_server_options(self, server, server_options):
212
""" Change the option_list a server has to use on startup """
214
self.logging.debug("Updating server: %s options" %(server.name))
215
self.logging.debug("FROM: %s" %(server.server_options))
216
self.logging.debug("TO: %s" %(server_options))
217
server.set_server_options(server_options)
219
def get_server_count(self):
220
""" Find out how many servers we have out """
222
for server_list in self.servers.values():
223
for server in server_list:
224
server_count = server_count + 1