diff options
author | Ed Bartosh <ed.bartosh@linux.intel.com> | 2016-07-19 23:20:34 +0300 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-07-21 07:48:52 +0100 |
commit | 317708235bfe876e127fde4b07c4f53d908c835f (patch) | |
tree | 42ced6b478320d861aa8054277611305461c7202 /bitbake/lib/bb/server | |
parent | 4cba010529b558bfbcf546942197277f8ce1b63e (diff) | |
download | poky-317708235bfe876e127fde4b07c4f53d908c835f.tar.gz |
bitbake: bitbake: implement idle timeout for xmlrpc server
Idle timeout can be specified either by -T/--idle-timeout option or
by sessing BBTIMEOUT environment variable. Bitbake xmlrpc server
will unload itself when timeout exprired, i.e. when server is idle
for more than <idle timeout> seconds.
[YOCTO #5534]
(Bitbake rev: 5fa0b3a19e7d0f40790f737abeddf499d53f1f6a)
Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/server')
-rw-r--r-- | bitbake/lib/bb/server/xmlrpc.py | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/bitbake/lib/bb/server/xmlrpc.py b/bitbake/lib/bb/server/xmlrpc.py index 4131b52679..452f14bb32 100644 --- a/bitbake/lib/bb/server/xmlrpc.py +++ b/bitbake/lib/bb/server/xmlrpc.py | |||
@@ -205,7 +205,7 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer): | |||
205 | # remove this when you're done with debugging | 205 | # remove this when you're done with debugging |
206 | # allow_reuse_address = True | 206 | # allow_reuse_address = True |
207 | 207 | ||
208 | def __init__(self, interface, single_use=False): | 208 | def __init__(self, interface, single_use=False, idle_timeout=0): |
209 | """ | 209 | """ |
210 | Constructor | 210 | Constructor |
211 | """ | 211 | """ |
@@ -223,6 +223,10 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer): | |||
223 | self.commands = BitBakeServerCommands(self) | 223 | self.commands = BitBakeServerCommands(self) |
224 | self.autoregister_all_functions(self.commands, "") | 224 | self.autoregister_all_functions(self.commands, "") |
225 | self.interface = interface | 225 | self.interface = interface |
226 | self.time = time.time() | ||
227 | self.idle_timeout = idle_timeout | ||
228 | if idle_timeout: | ||
229 | self.register_idle_function(self.handle_idle_timeout, self) | ||
226 | 230 | ||
227 | def addcooker(self, cooker): | 231 | def addcooker(self, cooker): |
228 | BaseImplServer.addcooker(self, cooker) | 232 | BaseImplServer.addcooker(self, cooker) |
@@ -238,6 +242,12 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer): | |||
238 | if name.startswith(prefix): | 242 | if name.startswith(prefix): |
239 | self.register_function(method, name[len(prefix):]) | 243 | self.register_function(method, name[len(prefix):]) |
240 | 244 | ||
245 | def handle_idle_timeout(self, server, data, abort): | ||
246 | if not abort: | ||
247 | if time.time() - server.time > server.idle_timeout: | ||
248 | server.quit = True | ||
249 | print("Server idle timeout expired") | ||
250 | return [] | ||
241 | 251 | ||
242 | def serve_forever(self): | 252 | def serve_forever(self): |
243 | # Start the actual XMLRPC server | 253 | # Start the actual XMLRPC server |
@@ -280,6 +290,8 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer): | |||
280 | try: | 290 | try: |
281 | fd_sets = select.select(fds, [], [], socktimeout) | 291 | fd_sets = select.select(fds, [], [], socktimeout) |
282 | if fd_sets[0] and self in fd_sets[0]: | 292 | if fd_sets[0] and self in fd_sets[0]: |
293 | if self.idle_timeout: | ||
294 | self.time = time.time() | ||
283 | self._handle_request_noblock() | 295 | self._handle_request_noblock() |
284 | except IOError: | 296 | except IOError: |
285 | # we ignore interrupted calls | 297 | # we ignore interrupted calls |
@@ -351,9 +363,10 @@ class BitBakeXMLRPCServerConnection(BitBakeBaseServerConnection): | |||
351 | pass | 363 | pass |
352 | 364 | ||
353 | class BitBakeServer(BitBakeBaseServer): | 365 | class BitBakeServer(BitBakeBaseServer): |
354 | def initServer(self, interface = ("localhost", 0), single_use = False): | 366 | def initServer(self, interface = ("localhost", 0), |
367 | single_use = False, idle_timeout=0): | ||
355 | self.interface = interface | 368 | self.interface = interface |
356 | self.serverImpl = XMLRPCServer(interface, single_use) | 369 | self.serverImpl = XMLRPCServer(interface, single_use, idle_timeout) |
357 | 370 | ||
358 | def detach(self): | 371 | def detach(self): |
359 | daemonize.createDaemon(self.serverImpl.serve_forever, "bitbake-cookerdaemon.log") | 372 | daemonize.createDaemon(self.serverImpl.serve_forever, "bitbake-cookerdaemon.log") |