summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bitbake/lib/bb/siggen.py9
-rw-r--r--bitbake/lib/hashserv/__init__.py4
-rw-r--r--bitbake/lib/hashserv/client.py10
-rw-r--r--meta/conf/bitbake.conf2
-rw-r--r--meta/lib/oe/sstatesig.py1
5 files changed, 16 insertions, 10 deletions
diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py
index 67be1d6c795..b80c222f9a4 100644
--- a/bitbake/lib/bb/siggen.py
+++ b/bitbake/lib/bb/siggen.py
@@ -372,15 +372,15 @@ class SignatureGeneratorBasicHash(SignatureGeneratorBasic):
class SignatureGeneratorUniHashMixIn(object):
def get_taskdata(self):
- return (self.server, self.method) + super().get_taskdata()
+ return (self.server, self.server_timeout, self.method) + super().get_taskdata()
def set_taskdata(self, data):
- self.server, self.method = data[:2]
- super().set_taskdata(data[2:])
+ self.server, self.server_timeout, self.method = data[:3]
+ super().set_taskdata(data[3:])
def client(self):
if getattr(self, '_client', None) is None:
- self._client = hashserv.create_client(self.server)
+ self._client = hashserv.create_client(self.server, timeout=self.server_timeout)
return self._client
def __get_task_unihash_key(self, tid):
@@ -533,6 +533,7 @@ class SignatureGeneratorTestEquivHash(SignatureGeneratorUniHashMixIn, SignatureG
def init_rundepcheck(self, data):
super().init_rundepcheck(data)
self.server = data.getVar('BB_HASHSERVE')
+ self.server_timeout = int(data.getVar('BB_HASHSERVE_TIMEOUT') or 20)
self.method = "sstate_output_hash"
diff --git a/bitbake/lib/hashserv/__init__.py b/bitbake/lib/hashserv/__init__.py
index c3318620f54..8b7418d0a39 100644
--- a/bitbake/lib/hashserv/__init__.py
+++ b/bitbake/lib/hashserv/__init__.py
@@ -80,9 +80,9 @@ def create_server(addr, dbname, *, sync=True):
return s
-def create_client(addr):
+def create_client(addr, *, timeout=None):
from . import client
- c = client.Client()
+ c = client.Client(timeout=timeout)
(typ, a) = parse_address(addr)
if typ == ADDR_TYPE_UNIX:
diff --git a/bitbake/lib/hashserv/client.py b/bitbake/lib/hashserv/client.py
index f65956617b9..b2b3a8a8852 100644
--- a/bitbake/lib/hashserv/client.py
+++ b/bitbake/lib/hashserv/client.py
@@ -21,15 +21,16 @@ class Client(object):
MODE_NORMAL = 0
MODE_GET_STREAM = 1
- def __init__(self):
+ def __init__(self, timeout=None):
self._socket = None
self.reader = None
self.writer = None
self.mode = self.MODE_NORMAL
+ self.timeout = timeout
def connect_tcp(self, address, port):
def connect_sock():
- s = socket.create_connection((address, port))
+ s = socket.create_connection((address, port), timeout=self.timeout)
s.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)
s.setsockopt(socket.SOL_TCP, socket.TCP_QUICKACK, 1)
@@ -41,11 +42,14 @@ class Client(object):
def connect_unix(self, path):
def connect_sock():
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+ s.settimeout(self.timeout)
# AF_UNIX has path length issues so chdir here to workaround
cwd = os.getcwd()
try:
os.chdir(os.path.dirname(path))
s.connect(os.path.basename(path))
+ except socket.timeout as e:
+ raise HashConnectionError(str(e))
finally:
os.chdir(cwd)
return s
@@ -82,7 +86,7 @@ class Client(object):
try:
self.connect()
return proc()
- except (OSError, HashConnectionError, json.JSONDecodeError, UnicodeDecodeError) as e:
+ except (OSError, HashConnectionError, json.JSONDecodeError, UnicodeDecodeError, socket.timeout) as e:
logger.warning('Error talking to server: %s' % e)
if count >= 3:
if not isinstance(e, HashConnectionError):
diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf
index 263d8aea4fb..83d278af4b2 100644
--- a/meta/conf/bitbake.conf
+++ b/meta/conf/bitbake.conf
@@ -873,7 +873,7 @@ BB_HASHBASE_WHITELIST ?= "TMPDIR FILE PATH PWD BB_TASKHASH BBPATH BBSERVER DL_DI
WARN_QA ERROR_QA WORKDIR STAMPCLEAN PKGDATA_DIR BUILD_ARCH SSTATE_PKGARCH \
BB_WORKERCONTEXT BB_LIMITEDDEPS BB_UNIHASH extend_recipe_sysroot DEPLOY_DIR \
SSTATE_HASHEQUIV_METHOD SSTATE_HASHEQUIV_REPORT_TASKDATA \
- SSTATE_HASHEQUIV_OWNER CCACHE_TOP_DIR BB_HASHSERVE"
+ SSTATE_HASHEQUIV_OWNER CCACHE_TOP_DIR BB_HASHSERVE BB_HASHSERVE_TIMEOUT"
BB_HASHCONFIG_WHITELIST ?= "${BB_HASHBASE_WHITELIST} DATE TIME SSH_AGENT_PID \
SSH_AUTH_SOCK PSEUDO_BUILD BB_ENV_EXTRAWHITE DISABLE_SANITY_CHECKS \
PARALLEL_MAKE BB_NUMBER_THREADS BB_ORIGENV BB_INVALIDCONF BBINCLUDED \
diff --git a/meta/lib/oe/sstatesig.py b/meta/lib/oe/sstatesig.py
index c566ce5a0cb..93e4d1066d0 100644
--- a/meta/lib/oe/sstatesig.py
+++ b/meta/lib/oe/sstatesig.py
@@ -270,6 +270,7 @@ class SignatureGeneratorOEEquivHash(SignatureGeneratorOEBasicHashMixIn, bb.sigge
def init_rundepcheck(self, data):
super().init_rundepcheck(data)
self.server = data.getVar('BB_HASHSERVE')
+ self.server_timeout = int(data.getVar('BB_HASHSERVE_TIMEOUT') or 20)
if not self.server:
bb.fatal("OEEquivHash requires BB_HASHSERVE to be set")
self.method = data.getVar('SSTATE_HASHEQUIV_METHOD')