diff mbox series

[v3] cooker: limit the execution of the hashequiv client/server ping

Message ID 20260506123755.628267-3-corentin.guillevic@smile.fr
State New
Headers show
Series [v3] cooker: limit the execution of the hashequiv client/server ping | expand

Commit Message

Corentin GUILLEVIC May 6, 2026, 12:37 p.m. UTC
From: Corentin Guillevic <corentin.guillevic@smile.fr>

The ping method is used to test the connection to the hash equivalence server.
However, if the server is unavailable, the bitbake server has to wait several
minutes for the system to terminate.

While waiting for a response from the hash server, the bitbake server does not
provide any feedback to the bitbake client. The latter then closes the link and
fails with the error:

Timeout while waiting for a reply from the bitbake server (60s at 09:50:15.377337)

Adding a timeout to the ping step allows quicker action when a remote server is
unavailable, and prevents disconnection of the client due to timeout.
The default timeout is 10 seconds, but this can be set using the
BB_HASHSERVE_UPSTREAM_TIMEOUT variable.

Signed-off-by: Corentin Guillevic <corentin.guillevic@smile.fr>
---

Notes:
    Changes in v3:
    - Fix TypeError exception when BB_HASHSERVE_UPSTREAM_TIMEOUT is not defined

 .../bitbake-user-manual-ref-variables.rst             | 11 +++++++++++
 lib/bb/asyncrpc/client.py                             |  4 ++--
 lib/bb/cooker.py                                      |  4 ++--
 3 files changed, 15 insertions(+), 4 deletions(-)

Comments

Jose Quaresma May 6, 2026, 2:49 p.m. UTC | #1
Hi Corentin,

Corentin Guillevic via lists.openembedded.org <corentin.guillevic=
smile.fr@lists.openembedded.org> escreveu (quarta, 6/05/2026 à(s) 13:40):

> From: Corentin Guillevic <corentin.guillevic@smile.fr>
>
> The ping method is used to test the connection to the hash equivalence
> server.
> However, if the server is unavailable, the bitbake server has to wait
> several
> minutes for the system to terminate.
>
> While waiting for a response from the hash server, the bitbake server does
> not
> provide any feedback to the bitbake client. The latter then closes the
> link and
> fails with the error:
>
> Timeout while waiting for a reply from the bitbake server (60s at
> 09:50:15.377337)
>
> Adding a timeout to the ping step allows quicker action when a remote
> server is
> unavailable, and prevents disconnection of the client due to timeout.
> The default timeout is 10 seconds, but this can be set using the
> BB_HASHSERVE_UPSTREAM_TIMEOUT variable.
>
> Signed-off-by: Corentin Guillevic <corentin.guillevic@smile.fr>
> ---
>
> Notes:
>     Changes in v3:
>     - Fix TypeError exception when BB_HASHSERVE_UPSTREAM_TIMEOUT is not
> defined
>
>  .../bitbake-user-manual-ref-variables.rst             | 11 +++++++++++
>  lib/bb/asyncrpc/client.py                             |  4 ++--
>  lib/bb/cooker.py                                      |  4 ++--
>  3 files changed, 15 insertions(+), 4 deletions(-)
>
> diff --git a/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.rst
> b/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.rst
> index 9824b58ef..cce03bc0c 100644
> --- a/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.rst
> +++ b/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.rst
> @@ -511,6 +511,17 @@ overview of their function and contents.
>
>           BB_HASHSERVE_UPSTREAM = "hashserv.yoctoproject.org:8686"
>
> +   :term:`BB_HASHSERVE_UPSTREAM_TIMEOUT`
> +      Specifies the duration (in seconds) for which BitBake waits for the
> first
> +      response from the upstream Hash Equivalence server (specified by
> +      :term:`BB_HASHSERVE_UPSTREAM`).
> +
> +      This variable prevents BitBake from waiting too long for an
> unavailable server.
> +      If the time expires, the upstream Hash Equivalence server will be
> skipped for
> +      the build.
> +
> +      The default value is "10" (seconds).
> +
>     :term:`BB_INVALIDCONF`
>        Used in combination with the ``ConfigParsed`` event to trigger
>        re-parsing the base metadata (i.e. all the recipes). The
> diff --git a/lib/bb/asyncrpc/client.py b/lib/bb/asyncrpc/client.py
> index 17b72033b..5e2505494 100644
> --- a/lib/bb/asyncrpc/client.py
> +++ b/lib/bb/asyncrpc/client.py
> @@ -199,8 +199,8 @@ class AsyncClient(object):
>          self.check_invoke_error(result)
>          return result
>
> -    async def ping(self):
> -        return await self.invoke({"ping": {}})
> +    async def ping(self, timeout=None):
> +        return await asyncio.wait_for(self.invoke({"ping": {}}), timeout)
>
>      async def __aenter__(self):
>          return self
> diff --git a/lib/bb/cooker.py b/lib/bb/cooker.py
> index 4b6ba3196..128cbaee9 100644
> --- a/lib/bb/cooker.py
> +++ b/lib/bb/cooker.py
> @@ -342,7 +342,7 @@ according to
> https://docs.yoctoproject.org/dev-manual/hashequivserver.html""".fo
>                  if upstream:
>                      try:
>                          with hashserv.create_client(upstream) as client:
> -                            client.ping()
> +
> client.ping(int(self.data.getVar("BB_HASHSERVE_UPSTREAM_TIMEOUT") or 10))
>                      except ImportError as e:
>                          bb.fatal(""""Unable to use hash equivalence
> server at '%s' due to missing or incorrect python module:
>  %s
> @@ -352,7 +352,7 @@ Please install the needed module on the build host, or
> use an environment contai
>   - or set up pip venv
>  You can also remove the BB_HASHSERVE_UPSTREAM setting, but this may
> result in significantly longer build times as bitbake will be unable to
> reuse prebuilt sstate artefacts."""
>                                   % (upstream, repr(e)))
> -                    except ConnectionError as e:
> +                    except (ConnectionError, TimeoutError) as e:
>                          bb.warn("Unable to connect to hash equivalence
> server at '%s', please correct or remove BB_HASHSERVE_UPSTREAM:\n%s"
>

What about:

"Unable to connect to hash equivalence server at '%s' after '%s' seconds,
please correct or remove BB_HASHSERVE_UPSTREAM or increase the
BB_HASHSERVE_UPSTREAM_TIMEOUT:\n%s"

To raise awareness about the possible causes.

Jose

                                  % (upstream, repr(e)))
>                          upstream = None
> --
> 2.51.0
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#19445):
> https://lists.openembedded.org/g/bitbake-devel/message/19445
> Mute This Topic: https://lists.openembedded.org/mt/119177877/5052612
> Group Owner: bitbake-devel+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/bitbake-devel/unsub [
> quaresma.jose@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
>
diff mbox series

Patch

diff --git a/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.rst b/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.rst
index 9824b58ef..cce03bc0c 100644
--- a/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.rst
+++ b/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.rst
@@ -511,6 +511,17 @@  overview of their function and contents.
 
          BB_HASHSERVE_UPSTREAM = "hashserv.yoctoproject.org:8686"
 
+   :term:`BB_HASHSERVE_UPSTREAM_TIMEOUT`
+      Specifies the duration (in seconds) for which BitBake waits for the first
+      response from the upstream Hash Equivalence server (specified by
+      :term:`BB_HASHSERVE_UPSTREAM`).
+
+      This variable prevents BitBake from waiting too long for an unavailable server.
+      If the time expires, the upstream Hash Equivalence server will be skipped for
+      the build.
+
+      The default value is "10" (seconds).
+
    :term:`BB_INVALIDCONF`
       Used in combination with the ``ConfigParsed`` event to trigger
       re-parsing the base metadata (i.e. all the recipes). The
diff --git a/lib/bb/asyncrpc/client.py b/lib/bb/asyncrpc/client.py
index 17b72033b..5e2505494 100644
--- a/lib/bb/asyncrpc/client.py
+++ b/lib/bb/asyncrpc/client.py
@@ -199,8 +199,8 @@  class AsyncClient(object):
         self.check_invoke_error(result)
         return result
 
-    async def ping(self):
-        return await self.invoke({"ping": {}})
+    async def ping(self, timeout=None):
+        return await asyncio.wait_for(self.invoke({"ping": {}}), timeout)
 
     async def __aenter__(self):
         return self
diff --git a/lib/bb/cooker.py b/lib/bb/cooker.py
index 4b6ba3196..128cbaee9 100644
--- a/lib/bb/cooker.py
+++ b/lib/bb/cooker.py
@@ -342,7 +342,7 @@  according to https://docs.yoctoproject.org/dev-manual/hashequivserver.html""".fo
                 if upstream:
                     try:
                         with hashserv.create_client(upstream) as client:
-                            client.ping()
+                            client.ping(int(self.data.getVar("BB_HASHSERVE_UPSTREAM_TIMEOUT") or 10))
                     except ImportError as e:
                         bb.fatal(""""Unable to use hash equivalence server at '%s' due to missing or incorrect python module:
 %s
@@ -352,7 +352,7 @@  Please install the needed module on the build host, or use an environment contai
  - or set up pip venv
 You can also remove the BB_HASHSERVE_UPSTREAM setting, but this may result in significantly longer build times as bitbake will be unable to reuse prebuilt sstate artefacts."""
                                  % (upstream, repr(e)))
-                    except ConnectionError as e:
+                    except (ConnectionError, TimeoutError) as e:
                         bb.warn("Unable to connect to hash equivalence server at '%s', please correct or remove BB_HASHSERVE_UPSTREAM:\n%s"
                                  % (upstream, repr(e)))
                         upstream = None