mirror of
https://git.yoctoproject.org/poky
synced 2026-09-15 15:49:32 +02:00
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>
This commit is contained in:
committed by
Richard Purdie
parent
4cba010529
commit
317708235b
@@ -253,6 +253,10 @@ class BitBakeConfigParameters(cookerdata.ConfigParameters):
|
|||||||
parser.add_option("-B", "--bind", action="store", dest="bind", default=False,
|
parser.add_option("-B", "--bind", action="store", dest="bind", default=False,
|
||||||
help="The name/address for the bitbake server to bind to.")
|
help="The name/address for the bitbake server to bind to.")
|
||||||
|
|
||||||
|
parser.add_option("-T", "--idle-timeout", type=int,
|
||||||
|
default=int(os.environ.get("BBTIMEOUT", "0")),
|
||||||
|
help="Set timeout to unload bitbake server due to inactivity")
|
||||||
|
|
||||||
parser.add_option("", "--no-setscene", action="store_true",
|
parser.add_option("", "--no-setscene", action="store_true",
|
||||||
dest="nosetscene", default=False,
|
dest="nosetscene", default=False,
|
||||||
help="Do not run any setscene tasks. sstate will be ignored and "
|
help="Do not run any setscene tasks. sstate will be ignored and "
|
||||||
@@ -337,7 +341,8 @@ def start_server(servermodule, configParams, configuration, features):
|
|||||||
single_use = not configParams.server_only and os.getenv('BBSERVER') != 'autostart'
|
single_use = not configParams.server_only and os.getenv('BBSERVER') != 'autostart'
|
||||||
if configParams.bind:
|
if configParams.bind:
|
||||||
(host, port) = configParams.bind.split(':')
|
(host, port) = configParams.bind.split(':')
|
||||||
server.initServer((host, int(port)), single_use=single_use)
|
server.initServer((host, int(port)), single_use=single_use,
|
||||||
|
idle_timeout=configParams.idle_timeout)
|
||||||
configuration.interface = [server.serverImpl.host, server.serverImpl.port]
|
configuration.interface = [server.serverImpl.host, server.serverImpl.port]
|
||||||
else:
|
else:
|
||||||
server.initServer(single_use=single_use)
|
server.initServer(single_use=single_use)
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer):
|
|||||||
# remove this when you're done with debugging
|
# remove this when you're done with debugging
|
||||||
# allow_reuse_address = True
|
# allow_reuse_address = True
|
||||||
|
|
||||||
def __init__(self, interface, single_use=False):
|
def __init__(self, interface, single_use=False, idle_timeout=0):
|
||||||
"""
|
"""
|
||||||
Constructor
|
Constructor
|
||||||
"""
|
"""
|
||||||
@@ -223,6 +223,10 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer):
|
|||||||
self.commands = BitBakeServerCommands(self)
|
self.commands = BitBakeServerCommands(self)
|
||||||
self.autoregister_all_functions(self.commands, "")
|
self.autoregister_all_functions(self.commands, "")
|
||||||
self.interface = interface
|
self.interface = interface
|
||||||
|
self.time = time.time()
|
||||||
|
self.idle_timeout = idle_timeout
|
||||||
|
if idle_timeout:
|
||||||
|
self.register_idle_function(self.handle_idle_timeout, self)
|
||||||
|
|
||||||
def addcooker(self, cooker):
|
def addcooker(self, cooker):
|
||||||
BaseImplServer.addcooker(self, cooker)
|
BaseImplServer.addcooker(self, cooker)
|
||||||
@@ -238,6 +242,12 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer):
|
|||||||
if name.startswith(prefix):
|
if name.startswith(prefix):
|
||||||
self.register_function(method, name[len(prefix):])
|
self.register_function(method, name[len(prefix):])
|
||||||
|
|
||||||
|
def handle_idle_timeout(self, server, data, abort):
|
||||||
|
if not abort:
|
||||||
|
if time.time() - server.time > server.idle_timeout:
|
||||||
|
server.quit = True
|
||||||
|
print("Server idle timeout expired")
|
||||||
|
return []
|
||||||
|
|
||||||
def serve_forever(self):
|
def serve_forever(self):
|
||||||
# Start the actual XMLRPC server
|
# Start the actual XMLRPC server
|
||||||
@@ -280,6 +290,8 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer):
|
|||||||
try:
|
try:
|
||||||
fd_sets = select.select(fds, [], [], socktimeout)
|
fd_sets = select.select(fds, [], [], socktimeout)
|
||||||
if fd_sets[0] and self in fd_sets[0]:
|
if fd_sets[0] and self in fd_sets[0]:
|
||||||
|
if self.idle_timeout:
|
||||||
|
self.time = time.time()
|
||||||
self._handle_request_noblock()
|
self._handle_request_noblock()
|
||||||
except IOError:
|
except IOError:
|
||||||
# we ignore interrupted calls
|
# we ignore interrupted calls
|
||||||
@@ -351,9 +363,10 @@ class BitBakeXMLRPCServerConnection(BitBakeBaseServerConnection):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
class BitBakeServer(BitBakeBaseServer):
|
class BitBakeServer(BitBakeBaseServer):
|
||||||
def initServer(self, interface = ("localhost", 0), single_use = False):
|
def initServer(self, interface = ("localhost", 0),
|
||||||
|
single_use = False, idle_timeout=0):
|
||||||
self.interface = interface
|
self.interface = interface
|
||||||
self.serverImpl = XMLRPCServer(interface, single_use)
|
self.serverImpl = XMLRPCServer(interface, single_use, idle_timeout)
|
||||||
|
|
||||||
def detach(self):
|
def detach(self):
|
||||||
daemonize.createDaemon(self.serverImpl.serve_forever, "bitbake-cookerdaemon.log")
|
daemonize.createDaemon(self.serverImpl.serve_forever, "bitbake-cookerdaemon.log")
|
||||||
|
|||||||
Reference in New Issue
Block a user