bitbake: server/xmlrpc/prserv: Add sane timeout to default xmlrpc server

The standard python socket connect has long timouts which make sense for remote
connections but not local things like the PR Service. This adds a timeout
parameter to the common xmlrpc server creation function and sets it to a more
reasonable 5 seconds.

Making the PR server instantly exit is a good way to test the effect of this
on bitbake.

We can remove the bodged timeout in the PRServer terminate function which
has the side effect of affecting global scope.

(Bitbake rev: 8c01cff94787abbb64fbdf0c16cd63f8f97a7e03)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Richard Purdie 2013-08-24 12:03:10 +00:00
parent a03a423c60
commit bfab986ccd
2 changed files with 18 additions and 7 deletions

View File

@ -47,15 +47,29 @@ except ImportError:
DEBUG = False DEBUG = False
from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
import inspect, select import inspect, select, httplib
from . import BitBakeBaseServer, BitBakeBaseServerConnection, BaseImplServer from . import BitBakeBaseServer, BitBakeBaseServerConnection, BaseImplServer
class BBTransport(xmlrpclib.Transport): class BBTransport(xmlrpclib.Transport):
def __init__(self): def __init__(self, timeout):
self.timeout = timeout
self.connection_token = None self.connection_token = None
xmlrpclib.Transport.__init__(self) xmlrpclib.Transport.__init__(self)
# Modified from default to pass timeout to HTTPConnection
def make_connection(self, host):
#return an existing connection if possible. This allows
#HTTP/1.1 keep-alive.
if self._connection and host == self._connection[0]:
return self._connection[1]
# create a HTTP connection object from a host descriptor
chost, self._extra_headers, x509 = self.get_host_info(host)
#store the host argument along with the connection object
self._connection = host, httplib.HTTPConnection(chost, timeout=self.timeout)
return self._connection[1]
def set_connection_token(self, token): def set_connection_token(self, token):
self.connection_token = token self.connection_token = token
@ -64,8 +78,8 @@ class BBTransport(xmlrpclib.Transport):
h.putheader("Bitbake-token", self.connection_token) h.putheader("Bitbake-token", self.connection_token)
xmlrpclib.Transport.send_content(self, h, body) xmlrpclib.Transport.send_content(self, h, body)
def _create_server(host, port): def _create_server(host, port, timeout = 5):
t = BBTransport() t = BBTransport(timeout)
s = xmlrpclib.Server("http://%s:%d/" % (host, port), transport=t, allow_none=True) s = xmlrpclib.Server("http://%s:%d/" % (host, port), transport=t, allow_none=True)
return s, t return s, t

View File

@ -186,9 +186,6 @@ class PRServerConnection():
self.connection, self.transport = bb.server.xmlrpc._create_server(self.host, self.port) self.connection, self.transport = bb.server.xmlrpc._create_server(self.host, self.port)
def terminate(self): def terminate(self):
# Don't wait for server indefinitely
import socket
socket.setdefaulttimeout(2)
try: try:
logger.info("Terminating PRServer...") logger.info("Terminating PRServer...")
self.connection.quit() self.connection.quit()