diff options
-rw-r--r-- | bitbake/lib/bb/siggen.py | 9 | ||||
-rw-r--r-- | bitbake/lib/hashserv/__init__.py | 4 | ||||
-rw-r--r-- | bitbake/lib/hashserv/client.py | 10 | ||||
-rw-r--r-- | meta/conf/bitbake.conf | 2 | ||||
-rw-r--r-- | meta/lib/oe/sstatesig.py | 1 |
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') |