From unknown Sun Jun 15 08:50:01 2025 X-Loop: help-debbugs@gnu.org Subject: bug#41625: Sporadic guix-offload crashes due to EOF errors Resent-From: Marius Bakke Original-Sender: "Debbugs-submit" Resent-CC: bug-guix@gnu.org Resent-Date: Sun, 31 May 2020 09:52:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 41625 X-GNU-PR-Package: guix X-GNU-PR-Keywords: To: 41625@debbugs.gnu.org X-Debbugs-Original-To: bug-guix@gnu.org Received: via spool by submit@debbugs.gnu.org id=B.159091872015045 (code B ref -1); Sun, 31 May 2020 09:52:01 +0000 Received: (at submit) by debbugs.gnu.org; 31 May 2020 09:52:00 +0000 Received: from localhost ([127.0.0.1]:59782 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jfKdL-0003ub-My for submit@debbugs.gnu.org; Sun, 31 May 2020 05:51:59 -0400 Received: from lists.gnu.org ([209.51.188.17]:42984) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jfKdK-0003uU-H4 for submit@debbugs.gnu.org; Sun, 31 May 2020 05:51:58 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46916) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jfKdK-00082P-8V for bug-guix@gnu.org; Sun, 31 May 2020 05:51:58 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:52884) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jfKdK-0006P9-0H for bug-guix@gnu.org; Sun, 31 May 2020 05:51:58 -0400 Received: from ti0006q161-2604.bb.online.no ([84.202.68.75]:47896 helo=localhost) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1jfKdJ-0005Ma-CQ for bug-guix@gnu.org; Sun, 31 May 2020 05:51:57 -0400 From: Marius Bakke Date: Sun, 31 May 2020 11:51:54 +0200 Message-ID: <87mu5owhxh.fsf@gnu.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -2.3 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello, During 'guix build -s aarch64-linux dolphin' on Berlin, I got this crash: =2D-8<---------------cut here---------------start------------->8--- building /gnu/store/87655bh9rqcr29qasl1c4yj3skmxkyiz-kfilemetadata-5.70.0.d= rv... process 12989 acquired build slot '/var/guix/offload/overdrive1.guixsd.org:= 52522/1' process 12989 acquired build slot '/var/guix/offload/dover.guix.info:9023/1' process 12989 acquired build slot '/var/guix/offload/141.80.167.167:22/0' process 12989 acquired build slot '/var/guix/offload/141.80.167.163:22/0' process 12989 acquired build slot '/var/guix/offload/localhost:2223/1' process 12989 acquired build slot '/var/guix/offload/141.80.167.168:22/0' process 12989 acquired build slot '/var/guix/offload/141.80.167.173:22/0' process 12989 acquired build slot '/var/guix/offload/141.80.167.176:22/0' process 12989 acquired build slot '/var/guix/offload/localhost:2222/0' process 12989 acquired build slot '/var/guix/offload/141.80.167.165:22/0' process 12989 acquired build slot '/var/guix/offload/141.80.167.169:22/0' process 12989 acquired build slot '/var/guix/offload/141.80.167.181:22/0' process 12989 acquired build slot '/var/guix/offload/141.80.167.170:22/0' process 12989 acquired build slot '/var/guix/offload/141.80.167.174:22/0' process 12989 acquired build slot '/var/guix/offload/141.80.167.180:22/0' process 12989 acquired build slot '/var/guix/offload/141.80.167.161:22/0' Backtrace: In ice-9/boot-9.scm: 1736:10 5 (with-exception-handler _ _ #:unwind? _ # _) In unknown file: 4 (apply-smob/0 #) In ice-9/boot-9.scm: 718:2 3 (call-with-prompt _ _ #) In ice-9/eval.scm: 619:8 2 (_ #(#(#))) In guix/ui.scm: 1936:12 1 (run-guix-command _ . _) In guix/scripts/offload.scm: 742:22 0 (guix-offload . _) guix/scripts/offload.scm:742:22: In procedure guix-offload: Throw to key `match-error' with args `("match" "no matching pattern" #= )'. guix build: error: unexpected EOF reading a line =2D-8<---------------cut here---------------end--------------->8--- Which is strange because guix/scripts/offload.scm:742 is wrapped in a (unless (eof-object? ...)) block. When this happens, the build command terminates, along with any other builds that it had started concurrently. Builds from other clients were unaffected, of course. I have also seen this occur on my personal offloading setup once every blue moon, but don't know what could have caused it. --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCgAdFiEEu7At3yzq9qgNHeZDoqBt8qM6VPoFAl7TfjoACgkQoqBt8qM6 VPokIQf+Lt6//6tAzD0+oGyAhc15p4LAqqkW5/lxQb/6nluNcifbjN/SSCgeFTzu k/Lti/6HEbjOqrUORtw9Yl50B3/5Is/qzuqFtmf7i++47r6QN2+dlwwK4vfePylc qy8caALlHDvC7rqrpVFq3MxStuW7QXBe/+jSjSORAh1KVh8TKHnhkdkRaazyZOP8 oIl879u7txA9a1wqtkmgjX49QqkXrTZV8QK4PBCW+hiqobgIcxqDr9l21GMEWRYw ssIxH0RphQlMrvhg2TPQhY2guNeLVy2eKwtr3VYe51RKWZTkoQ+ntQfOylltoypP QRJFs59QUW85DzbybcV+9I5Monr6Og== =iT+K -----END PGP SIGNATURE----- --=-=-=-- From unknown Sun Jun 15 08:50:01 2025 X-Loop: help-debbugs@gnu.org Subject: bug#41625: Sporadic guix-offload crashes due to EOF errors Resent-From: Marius Bakke Original-Sender: "Debbugs-submit" Resent-CC: bug-guix@gnu.org Resent-Date: Sun, 31 May 2020 10:13:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 41625 X-GNU-PR-Package: guix X-GNU-PR-Keywords: To: 41625@debbugs.gnu.org Received: via spool by 41625-submit@debbugs.gnu.org id=B41625.159091996717120 (code B ref 41625); Sun, 31 May 2020 10:13:01 +0000 Received: (at 41625) by debbugs.gnu.org; 31 May 2020 10:12:47 +0000 Received: from localhost ([127.0.0.1]:59811 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jfKxT-0004S4-D9 for submit@debbugs.gnu.org; Sun, 31 May 2020 06:12:47 -0400 Received: from eggs.gnu.org ([209.51.188.92]:41306) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jfKxR-0004Rq-Po for 41625@debbugs.gnu.org; Sun, 31 May 2020 06:12:46 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:53083) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jfKxM-0002iz-Jp for 41625@debbugs.gnu.org; Sun, 31 May 2020 06:12:40 -0400 Received: from ti0006q161-2604.bb.online.no ([84.202.68.75]:57912 helo=localhost) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1jfKxL-0000n0-Uf for 41625@debbugs.gnu.org; Sun, 31 May 2020 06:12:40 -0400 From: Marius Bakke In-Reply-To: <87mu5owhxh.fsf@gnu.org> References: <87mu5owhxh.fsf@gnu.org> Date: Sun, 31 May 2020 12:12:37 +0200 Message-ID: <87k10swgyy.fsf@gnu.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -2.3 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Marius Bakke writes: > During 'guix build -s aarch64-linux dolphin' on Berlin, I got this crash: Funny, I just got it _again_ building the same derivation. It seems to happen while checking load on the selected offload machine, which is 'overdrive1.guixsd.org' in this and the previous case: =2D-8<---------------cut here---------------start------------->8--- successfully built /gnu/store/qwscp6h2zsxr0knaizn1fn0saw1pfimi-kidletime-5.= 70.0.drv process 51308 acquired build slot '/var/guix/offload/141.80.167.174:22/0' process 51308 acquired build slot '/var/guix/offload/141.80.167.181:22/0' process 51308 acquired build slot '/var/guix/offload/overdrive1.guixsd.org:= 52522/1' process 51308 acquired build slot '/var/guix/offload/localhost:2223/1' process 51308 acquired build slot '/var/guix/offload/141.80.167.162:22/0' process 51308 acquired build slot '/var/guix/offload/141.80.167.180:22/0' process 51308 acquired build slot '/var/guix/offload/141.80.167.161:22/0' process 51308 acquired build slot '/var/guix/offload/141.80.167.170:22/0' process 51308 acquired build slot '/var/guix/offload/141.80.167.163:22/0' process 51308 acquired build slot '/var/guix/offload/141.80.167.166:22/0' process 51308 acquired build slot '/var/guix/offload/141.80.167.177:22/0' process 51308 acquired build slot '/var/guix/offload/localhost:2222/0' process 51308 acquired build slot '/var/guix/offload/141.80.167.173:22/0' process 51308 acquired build slot '/var/guix/offload/141.80.167.168:22/0' process 51308 acquired build slot '/var/guix/offload/141.80.167.169:22/0' process 51308 acquired build slot '/var/guix/offload/141.80.167.176:22/0' Backtrace: In ice-9/boot-9.scm: 1736:10 5 (with-exception-handler _ _ #:unwind? _ # _) In unknown file: 4 (apply-smob/0 #) In ice-9/boot-9.scm: 718:2 3 (call-with-prompt _ _ #) In ice-9/eval.scm: 619:8 2 (_ #(#(#))) In guix/ui.scm: 1936:12 1 (run-guix-command _ . _) In guix/scripts/offload.scm: 742:22 0 (guix-offload . _) guix/scripts/offload.scm:742:22: In procedure guix-offload: Throw to key `match-error' with args `("match" "no matching pattern" #= )'. guix build: error: unexpected EOF reading a line =2D-8<---------------cut here---------------end--------------->8--- 'guix offload test' passes without problems. --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCgAdFiEEu7At3yzq9qgNHeZDoqBt8qM6VPoFAl7TgxUACgkQoqBt8qM6 VPrt3ggAt+nNax+K3pWTlItX1uy7Dv3Gehhb6BNpJA1PiDA1TTmlh4GG+TmXsp4v aPGheo0jnk2thwJ/AuaqYRu+Ec3mpMR1F/XaO/9ULWC0eeerlRhhnZJtnxopKnoB 2BQmzS5loGWL8jmNL7bQ0+uESLZDsl5gbbWgTh0vAjneE97oaewTgYcBLF6dD7Mg 9lDsuWTY9B5D+uoUGrpH0TRjydoNNCu0hjXisQ2mDKSh0KnohKuPHAkJ+0zMAJaG Wrv8a9VqXbODDJrr/m3hdZt6PUA1iOh0HnYz7U8o6in84taHdhU3mlrlap7UlSmR 5VcnbwolJfU9pzEYl2BfEBsagnE2AQ== =W9oA -----END PGP SIGNATURE----- --=-=-=-- From unknown Sun Jun 15 08:50:01 2025 X-Loop: help-debbugs@gnu.org Subject: bug#41625: Sporadic guix-offload crashes due to EOF errors Resent-From: Marius Bakke Original-Sender: "Debbugs-submit" Resent-CC: bug-guix@gnu.org Resent-Date: Sun, 31 May 2020 11:22:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 41625 X-GNU-PR-Package: guix X-GNU-PR-Keywords: To: 41625@debbugs.gnu.org Received: via spool by 41625-submit@debbugs.gnu.org id=B41625.159092411324000 (code B ref 41625); Sun, 31 May 2020 11:22:01 +0000 Received: (at 41625) by debbugs.gnu.org; 31 May 2020 11:21:53 +0000 Received: from localhost ([127.0.0.1]:59863 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jfM2K-0006F2-Qs for submit@debbugs.gnu.org; Sun, 31 May 2020 07:21:52 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47846) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jfM2J-0006Ep-89 for 41625@debbugs.gnu.org; Sun, 31 May 2020 07:21:51 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:53535) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jfM2E-0000z7-1P for 41625@debbugs.gnu.org; Sun, 31 May 2020 07:21:46 -0400 Received: from ti0006q161-2604.bb.online.no ([84.202.68.75]:37014 helo=localhost) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1jfM2D-0002xJ-Hh for 41625@debbugs.gnu.org; Sun, 31 May 2020 07:21:45 -0400 From: Marius Bakke In-Reply-To: <87k10swgyy.fsf@gnu.org> References: <87mu5owhxh.fsf@gnu.org> <87k10swgyy.fsf@gnu.org> Date: Sun, 31 May 2020 13:21:43 +0200 Message-ID: <87h7vwwdrs.fsf@gnu.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -1.4 (-) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.4 (--) --=-=-= Content-Type: text/plain Marius Bakke writes: > 'guix offload test' passes without problems. Not so fast, running it in a loop reveals the crash. There is a trace file in /root/offloadtest.trace on Berlin with such an occurence. It looks like a timeout is reached shortly before the EOF error: 10139 poll([{fd=14, events=POLLIN|POLLOUT}], 1, 0) = 1 ([{fd=14, revents=POLLOUT}]) 10139 poll([{fd=14, events=POLLIN}], 1, 15000) = 0 (Timeout) 10139 write(2, "Backtrace:\n", 11) = 11 This seems to be from a different node than the one reported previously, as the preceding connect() was to this machine: 10139 connect(44, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("141.80.167.186")}, 16) = -1 EINPROGRESS (Operation now in progress) --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCgAdFiEEu7At3yzq9qgNHeZDoqBt8qM6VPoFAl7Tk0cACgkQoqBt8qM6 VPpkSwgAuUZtpdzkttyqECe0BebW8+V/xeKAa06wXCk8rdVZhbAfmJ57MM4p6L/Q BVn3Qy3LBrZJ3IskgIUZXIByOoIPK15L5hyMUMVV5GDQrU+UDIBJNKH8H0o9XsJY 2DequT4SsQ7aF8njhA21xZ8XLvMk6pu7SPNZPLszvapDEM9kgA39DTx6lfxBLw0V D9v+pVQtuZqg37ge6jYBZrH1uoZm7vFbO1QXESVBUT4xmY5hjnsBpLUFcUOnuW1m C39lpgtBPwC1umLVgVoyCAB5XCb6i1LMyFQ1ysLLbkBXyCfDs0ZhHSZeZm/3hbAx n2POIAqxUseebhbqDjKHnYm57HckXA== =z0CC -----END PGP SIGNATURE----- --=-=-=-- From unknown Sun Jun 15 08:50:01 2025 X-Loop: help-debbugs@gnu.org Subject: bug#41625: Sporadic guix-offload crashes due to EOF errors Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= Original-Sender: "Debbugs-submit" Resent-CC: bug-guix@gnu.org Resent-Date: Thu, 04 Jun 2020 12:06:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 41625 X-GNU-PR-Package: guix X-GNU-PR-Keywords: To: Marius Bakke Cc: 41625@debbugs.gnu.org Received: via spool by 41625-submit@debbugs.gnu.org id=B41625.15912723534484 (code B ref 41625); Thu, 04 Jun 2020 12:06:01 +0000 Received: (at 41625) by debbugs.gnu.org; 4 Jun 2020 12:05:53 +0000 Received: from localhost ([127.0.0.1]:45260 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jgod6-0001AG-R2 for submit@debbugs.gnu.org; Thu, 04 Jun 2020 08:05:53 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35254) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jgod5-00019x-01 for 41625@debbugs.gnu.org; Thu, 04 Jun 2020 08:05:51 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:59050) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jgocz-00021B-QZ for 41625@debbugs.gnu.org; Thu, 04 Jun 2020 08:05:45 -0400 Received: from [2a01:e0a:1d:7270:af76:b9b:ca24:c465] (port=45524 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1jgocx-0001fS-UP; Thu, 04 Jun 2020 08:05:44 -0400 From: Ludovic =?UTF-8?Q?Court=C3=A8s?= References: <87mu5owhxh.fsf@gnu.org> <87k10swgyy.fsf@gnu.org> <87h7vwwdrs.fsf@gnu.org> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 17 Prairial an 228 de la =?UTF-8?Q?R=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Thu, 04 Jun 2020 14:05:41 +0200 In-Reply-To: <87h7vwwdrs.fsf@gnu.org> (Marius Bakke's message of "Sun, 31 May 2020 13:21:43 +0200") Message-ID: <87a71jc9yi.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -2.3 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) Hi, Marius Bakke skribis: > Marius Bakke writes: > >> 'guix offload test' passes without problems. > > Not so fast, running it in a loop reveals the crash. > > There is a trace file in /root/offloadtest.trace on Berlin with such an > occurence. It looks like a timeout is reached shortly before the EOF > error: > > 10139 poll([{fd=3D14, events=3DPOLLIN|POLLOUT}], 1, 0) =3D 1 ([{fd=3D14, = revents=3DPOLLOUT}]) > 10139 poll([{fd=3D14, events=3DPOLLIN}], 1, 15000) =3D 0 (Timeout) > 10139 write(2, "Backtrace:\n", 11) =3D 11 > > This seems to be from a different node than the one reported previously, > as the preceding connect() was to this machine: > > 10139 connect(44, {sa_family=3DAF_INET, sin_port=3Dhtons(22), sin_addr=3D= inet_addr("141.80.167.186")}, 16) =3D -1 EINPROGRESS (Operation now in prog= ress) So it looks like =E2=80=98connect=E2=80=99 fails and eventually we get an E= OF object. However, I don=E2=80=99t see where that EOF comes from because the return v= alue of =E2=80=98connect!=E2=80=99 (the Guile-SSH procedure) is properly checked. Ludo=E2=80=99. From unknown Sun Jun 15 08:50:01 2025 X-Loop: help-debbugs@gnu.org Subject: bug#41625: Sporadic guix-offload crashes due to EOF errors Resent-From: Maxim Cournoyer Original-Sender: "Debbugs-submit" Resent-CC: bug-guix@gnu.org Resent-Date: Mon, 24 May 2021 05:34:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 41625 X-GNU-PR-Package: guix X-GNU-PR-Keywords: To: Ludovic =?UTF-8?Q?Court=C3=A8s?= Cc: 41625@debbugs.gnu.org, Marius Bakke Received: via spool by 41625-submit@debbugs.gnu.org id=B41625.162183441121150 (code B ref 41625); Mon, 24 May 2021 05:34:02 +0000 Received: (at 41625) by debbugs.gnu.org; 24 May 2021 05:33:31 +0000 Received: from localhost ([127.0.0.1]:42125 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ll3DX-0005V4-8o for submit@debbugs.gnu.org; Mon, 24 May 2021 01:33:31 -0400 Received: from mail-qt1-f182.google.com ([209.85.160.182]:38692) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ll3DV-0005Up-2A for 41625@debbugs.gnu.org; Mon, 24 May 2021 01:33:30 -0400 Received: by mail-qt1-f182.google.com with SMTP id h21so19869714qtu.5 for <41625@debbugs.gnu.org>; Sun, 23 May 2021 22:33:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version:content-transfer-encoding; bh=U1ly1TeQ+zCZBZUa9RRdnf+1wzye9sSYEQ4BTzp8kDc=; b=IrEs2/lQZbLokftQ9G4cL1324LhqMu3dsvvtdGnthcswaaq4CUEA0JxuOew3fN0D7Z iV/HUlEZPGfsZTJh73dGz0wpx0Iu4ibvgrsS1Pgqt6Tlj8tzRS4HYZ61QU9MWahMWAAY dLlElC28DmrjCAWj8eqHtERcfHFvip8FEmbH+L10k1V0ssmx8vy/eGgw34qopYnjWByw +J7s3zWUFx8jXXzjCJuTkOLV52dwvGZURmGVDCL31rBOgcwiMpJJHVWmP/sBl4+cfjzE 5uRrDFxvkQETwfBE7VMXfKzHXQFsvB3OD3khQ3MMm41zr+KiIm06QL4cS5I25TZlV1+T QSmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version:content-transfer-encoding; bh=U1ly1TeQ+zCZBZUa9RRdnf+1wzye9sSYEQ4BTzp8kDc=; b=MhMtfaWEsfZ0sf1LNR6qd2HW0BXue/RZNC3S0Y1E0OGoTsgSGC0CbjPkM6uD9M4cnE 8PoEh/iTqjnE2MGV8+irEL69DBYPOqTZuo8oquR6o0LfdxEdZE/oGquhLsV/OaiceZV8 ow0CUKZKzdEQr0qag5Xn8YvhiDJncGxa/2tmx1VCyIj2kcyKOTfIlFpAnGdy+Q9HBsTR RNi93ShY3OYxa2lRUJjSKhEcE3G8xrhgic5/xPbeFJNnRL4WNE8gp8x2kgYnRP6aCHwt Vx+FkkaTVOJnIzn7UVKDB0gn57MvGuJ5aQhH557HM7uNwHFL60NTf8Lr7d0kkc0a7pB5 VC1g== X-Gm-Message-State: AOAM5317Bmt7Cn26XKRwKU9o3m0ManG1vaEleMJpeF1AuTxuVpqESr0B LLqNFcrxxatrVsZR5UxKjfisWk7PITo= X-Google-Smtp-Source: ABdhPJxau+Ey+11H0jMnTq72pfpYoVO4V7pg3F+Qt81Z8uF/sTHQuwGS7LsQLWp7zMuCpOFOLE8Qww== X-Received: by 2002:ac8:5314:: with SMTP id t20mr25195999qtn.68.1621834403355; Sun, 23 May 2021 22:33:23 -0700 (PDT) Received: from hurd (dsl-205-236-230-178.b2b2c.ca. [205.236.230.178]) by smtp.gmail.com with ESMTPSA id 145sm10559005qko.89.2021.05.23.22.33.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 23 May 2021 22:33:22 -0700 (PDT) From: Maxim Cournoyer References: <87mu5owhxh.fsf@gnu.org> <87k10swgyy.fsf@gnu.org> <87h7vwwdrs.fsf@gnu.org> <87a71jc9yi.fsf@gnu.org> Date: Mon, 24 May 2021 01:33:21 -0400 In-Reply-To: <87a71jc9yi.fsf@gnu.org> ("Ludovic =?UTF-8?Q?Court=C3=A8s?="'s message of "Thu, 04 Jun 2020 14:05:41 +0200") Message-ID: <87mtsky9um.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Hi, Ludovic Court=C3=A8s writes: > Hi, > > Marius Bakke skribis: > >> Marius Bakke writes: >> >>> 'guix offload test' passes without problems. >> >> Not so fast, running it in a loop reveals the crash. >> >> There is a trace file in /root/offloadtest.trace on Berlin with such an >> occurence. It looks like a timeout is reached shortly before the EOF >> error: >> >> 10139 poll([{fd=3D14, events=3DPOLLIN|POLLOUT}], 1, 0) =3D 1 ([{fd=3D14,= revents=3DPOLLOUT}]) >> 10139 poll([{fd=3D14, events=3DPOLLIN}], 1, 15000) =3D 0 (Timeout) >> 10139 write(2, "Backtrace:\n", 11) =3D 11 >> >> This seems to be from a different node than the one reported previously, >> as the preceding connect() was to this machine: >> >> 10139 connect(44, {sa_family=3DAF_INET, sin_port=3Dhtons(22), >> sin_addr=3Dinet_addr("141.80.167.186")}, 16) =3D -1 EINPROGRESS >> (Operation now in progress) > > So it looks like =E2=80=98connect=E2=80=99 fails and eventually we get an= EOF object. > However, I don=E2=80=99t see where that EOF comes from because the return= value > of =E2=80=98connect!=E2=80=99 (the Guile-SSH procedure) is properly check= ed. > > Ludo=E2=80=99. I got a slightly different backtrace that suggests making the connection is not at fault, rather it occurs during the read-repl-response call: --8<---------------cut here---------------start------------->8--- guix offload: testing 1 build machines defined in '/etc/guix/machines.scm'.= .. Backtrace: 8 (primitive-load "/home/maxim/.config/guix/current/bin/guix") In guix/ui.scm: 2165:12 7 (run-guix-command _ . _) In ice-9/boot-9.scm: 1752:10 6 (with-exception-handler _ _ #:unwind? _ #:unwind-for-type _) 1747:15 5 (with-exception-handler # _ # _ # =E2=80=A6) In guix/scripts/offload.scm: 704:21 4 (check-machine-availability _ _) In srfi/srfi-1.scm: 586:17 3 (map1 (#)) In guix/inferior.scm: 258:2 2 (port->inferior _ _) 240:2 1 (read-repl-response _ _) In ice-9/boot-9.scm: 1685:16 0 (raise-exception _ #:continuable? _) ice-9/boot-9.scm:1685:16: In procedure raise-exception: Throw to key `match-error' with args `("match" "no matching pattern" #= )'. --8<---------------cut here---------------end--------------->8--- I seem to get this more often than not with the overdrive1 offload machine. Maxim From unknown Sun Jun 15 08:50:01 2025 X-Loop: help-debbugs@gnu.org Subject: bug#41625: [PATCH] offload: Handle a possible EOF response from read-repl-response. Resent-From: Maxim Cournoyer Original-Sender: "Debbugs-submit" Resent-CC: bug-guix@gnu.org Resent-Date: Tue, 25 May 2021 15:51:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 41625 X-GNU-PR-Package: guix X-GNU-PR-Keywords: To: 41625@debbugs.gnu.org Cc: ludo@gnu.org, Maxim Cournoyer , marius@gnu.org Received: via spool by 41625-submit@debbugs.gnu.org id=B41625.16219578288246 (code B ref 41625); Tue, 25 May 2021 15:51:02 +0000 Received: (at 41625) by debbugs.gnu.org; 25 May 2021 15:50:28 +0000 Received: from localhost ([127.0.0.1]:46595 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1llZK8-00028v-6t for submit@debbugs.gnu.org; Tue, 25 May 2021 11:50:28 -0400 Received: from mail-qk1-f179.google.com ([209.85.222.179]:34662) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1llZK6-00028f-Jg for 41625@debbugs.gnu.org; Tue, 25 May 2021 11:50:27 -0400 Received: by mail-qk1-f179.google.com with SMTP id v8so30904655qkv.1 for <41625@debbugs.gnu.org>; Tue, 25 May 2021 08:50:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=TJ/ibxEYb0JUuf7a4sZtB6Hjq0Fp+E4X/jxSdDxQ3xo=; b=K4WX+rUSjjKdkJ0Cz8YcVwvOrMM6a2tVd1xcqZmZ5xWoaTRUqQEcdHzHK/chTyx351 W0dFsOfw1Uq1Na4EFv4PXH6tq8bdHjrPMkNLu2FyC8kEeXIVT5JUc8FV5d3XBGyKu25m ePwhSFCyBE8fwahjeXwz4OhniJgKf/G56my+Uw3Ql/18K5YWscNoxyWM2leszBMLa+e4 b40ObyxKprDKkUgEdL81EHwfJG9qxtCav0fTu0wyzNPJpNqQRpHirsMs4av95AqoYnwx kD60ZZ52hntFbKkVaxaetpqmCFnTulg/QEvK0Q9M5M2slgLR14FRuEkKNHlDlhcSCu7Z 59NQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=TJ/ibxEYb0JUuf7a4sZtB6Hjq0Fp+E4X/jxSdDxQ3xo=; b=kLGO5h5XEk6BgsIzzZyFU4gdBNxCy8x21YkBag638c0QJ6j+U0MUL10kuL2lX4RYNH bELiWXLS8g2aBLo8EOmv2i/SwkEXSZQP5pmy/m1sv/1O+Ir73EOPfIad0si5F81k61FD vD1u8WCvoj5BfCONh4kmRz8f3KFcvdnqwmKsYp19dnBpQaoS56xXGQzFEKg8RIU+zFWd YTYiwbS5RZ3y57QQODn4XlCVFtqt3zd2qvp7XBL4o8y7GXZPCuwTDgAPVMAh4g5leQCd UKBzjGNgVixEMOJLv0CT1rl/ClQkTVzHLgfKszpaCmebuojLlf9HAWtBqMbGeJRF/LUr 3hQA== X-Gm-Message-State: AOAM533WlfxNO6jVXG8me5mCkKXkDTLmzD1QB/4kvJg+mVlfk8ukuqjV tNh+yzDVJDuTdN3Taa8bj6v8gSPjngs= X-Google-Smtp-Source: ABdhPJwTWx1Kg+kSMVsMuMwPP02ptK5yezG88iDN5RnXOMQtWDNJkLCT211cUR30+sOEWv63KzwW1g== X-Received: by 2002:a05:620a:955:: with SMTP id w21mr35927513qkw.124.1621957820493; Tue, 25 May 2021 08:50:20 -0700 (PDT) Received: from localhost.localdomain (dsl-10-130-162.b2b2c.ca. [72.10.130.162]) by smtp.gmail.com with ESMTPSA id j3sm13202245qka.98.2021.05.25.08.50.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 May 2021 08:50:19 -0700 (PDT) From: Maxim Cournoyer Date: Tue, 25 May 2021 11:50:03 -0400 Message-Id: <20210525155003.27590-1-maxim.cournoyer@gmail.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <87mtsky9um.fsf@gmail.com> References: <87mtsky9um.fsf@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Fixes . * guix/scripts/offload.scm (check-machine-availability): Refactor so that it takes a single machine object, to allow for retrying a single machine. Handle the case where the checks raised an exception due to the connection to the build machine having been lost, and retry up to 3 times. Ensure the cleanup code is run in all situations. (check-machines-availability): New procedure. Call CHECK-MACHINES-AVAILABILITY in parallel, which improves performance (about twice as fast with 4 build machines, from ~30 s to ~15 s). * guix/inferior.scm (&inferior-connection-lost): New condition type. (read-repl-response): Raise a condition of the above type when reading EOF from the build machine's port. --- guix/inferior.scm | 9 ++++++++ guix/scripts/offload.scm | 50 +++++++++++++++++++++++++++++----------- 2 files changed, 45 insertions(+), 14 deletions(-) diff --git a/guix/inferior.scm b/guix/inferior.scm index 7c8e478f2a..4ac1ea3484 100644 --- a/guix/inferior.scm +++ b/guix/inferior.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2018, 2019, 2020, 2021 Ludovic Courtès +;;; Copyright © 2021 Maxim Cournoyer ;;; ;;; This file is part of GNU Guix. ;;; @@ -70,6 +71,7 @@ inferior-exception-arguments inferior-exception-inferior inferior-exception-stack + inferior-connection-lost? read-repl-response inferior-packages @@ -228,6 +230,9 @@ equivalent. Return #f if the inferior could not be launched." (inferior inferior-exception-inferior) ; | #f (stack inferior-exception-stack)) ;list of (FILE COLUMN LINE) +(define-condition-type &inferior-connection-lost &error + inferior-connection-lost?) + (define* (read-repl-response port #:optional inferior) "Read a (guix repl) response from PORT and return it as a Scheme object. Raise '&inferior-exception' when an exception is read from PORT." @@ -241,6 +246,10 @@ Raise '&inferior-exception' when an exception is read from PORT." (match (read port) (('values objects ...) (apply values (map sexp->object objects))) + ;; Unexpectedly read EOF from the port. This can happen for example when + ;; the underlying connection for PORT was lost with Guile-SSH. + (? eof-object? + (raise (condition (&inferior-connection-lost)))) (('exception ('arguments key objects ...) ('stack frames ...)) ;; Protocol (0 1 1) and later. diff --git a/guix/scripts/offload.scm b/guix/scripts/offload.scm index 835078cb97..7c6d38b218 100644 --- a/guix/scripts/offload.scm +++ b/guix/scripts/offload.scm @@ -1,7 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014, 2015, 2016, 2017, 2018, 2019, 2020 Ludovic Courtès ;;; Copyright © 2017 Ricardo Wurmus -;;; Copyright © 2020 Maxim Cournoyer +;;; Copyright © 2020, 2021 Maxim Cournoyer ;;; Copyright © 2020 Julien Lepiller ;;; ;;; This file is part of GNU Guix. @@ -53,6 +53,7 @@ #:use-module (ice-9 regex) #:use-module (ice-9 format) #:use-module (ice-9 binary-ports) + #:use-module (ice-9 threads) #:export (build-machine build-machine? build-machine-name @@ -684,7 +685,7 @@ daemon is not running." (leave (G_ "failed to import '~a' from '~a'~%") item name))))) -(define (check-machine-availability machine-file pred) +(define (check-machines-availability machine-file pred) "Check that each machine matching PRED in MACHINE-FILE is usable as a build machine." (define (build-machine=? m1 m2) @@ -696,18 +697,39 @@ machine." (let ((machines (filter pred (delete-duplicates (build-machines machine-file) build-machine=?)))) - (info (G_ "testing ~a build machines defined in '~a'...~%") + (info (G_ "Testing ~a build machines defined in '~a'...~%") (length machines) machine-file) - (let* ((names (map build-machine-name machines)) - (sockets (map build-machine-daemon-socket machines)) - (sessions (map (cut open-ssh-session <> %short-timeout) machines)) - (nodes (map remote-inferior sessions))) - (for-each assert-node-has-guix nodes names) - (for-each assert-node-repl nodes names) - (for-each assert-node-can-import sessions nodes names sockets) - (for-each assert-node-can-export sessions nodes names sockets) - (for-each close-inferior nodes) - (for-each disconnect! sessions)))) + (par-for-each check-machine-availability machines))) + +(define (check-machine-availability machine) + "Check whether MACHINE is available. Exit with an error upon failure." + ;; Sometimes, the machine remote port may return EOF, presumably because the + ;; connection was lost. Retry up to 3 times. + (let loop ((retries 3)) + (guard (c ((inferior-connection-lost? c) + (let ((retries-left (1- retries))) + (if (> retries-left 0) + (begin + (format (current-error-port) + (G_ "connection to machine ~s lost; retrying~%") + (build-machine-name machine)) + (loop (retries-left))) + (leave (G_ "connection repeatedly lost with machine '~a'~%") + (build-machine-name machine)))))) + (let* ((name (build-machine-name machine)) + (socket (build-machine-daemon-socket machine)) + (session (open-ssh-session machine %short-timeout)) + (node (remote-inferior session))) + (dynamic-wind + (lambda () #t) + (lambda () + (assert-node-has-guix node name) + (assert-node-repl node name) + (assert-node-can-import session node name socket) + (assert-node-can-export session node name socket)) + (lambda () + (close-inferior node) + (disconnect! session))))))) (define (check-machine-status machine-file pred) "Print the load of each machine matching PRED in MACHINE-FILE." @@ -824,7 +846,7 @@ machine." ((file) (values file (const #t))) (() (values %machine-file (const #t))) (x (leave (G_ "wrong number of arguments~%")))))) - (check-machine-availability (or file %machine-file) pred)))) + (check-machines-availability (or file %machine-file) pred)))) (("status" rest ...) (with-error-handling (let-values (((file pred) -- 2.31.1 From unknown Sun Jun 15 08:50:01 2025 X-Loop: help-debbugs@gnu.org Subject: bug#41625: [PATCH] offload: Handle a possible EOF response from read-repl-response. Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= Original-Sender: "Debbugs-submit" Resent-CC: bug-guix@gnu.org Resent-Date: Tue, 25 May 2021 20:28:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 41625 X-GNU-PR-Package: guix X-GNU-PR-Keywords: To: Maxim Cournoyer Cc: 41625@debbugs.gnu.org, marius@gnu.org Received: via spool by 41625-submit@debbugs.gnu.org id=B41625.162197443921922 (code B ref 41625); Tue, 25 May 2021 20:28:02 +0000 Received: (at 41625) by debbugs.gnu.org; 25 May 2021 20:27:19 +0000 Received: from localhost ([127.0.0.1]:47075 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1llde2-0005hV-Nf for submit@debbugs.gnu.org; Tue, 25 May 2021 16:27:19 -0400 Received: from eggs.gnu.org ([209.51.188.92]:54758) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1llde0-0005hC-IG for 41625@debbugs.gnu.org; Tue, 25 May 2021 16:27:16 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:34636) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1llddv-0006Vb-CG; Tue, 25 May 2021 16:27:11 -0400 Received: from [2a01:e0a:1d:7270:af76:b9b:ca24:c465] (port=42546 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1llddo-0000kI-ED; Tue, 25 May 2021 16:27:05 -0400 From: Ludovic =?UTF-8?Q?Court=C3=A8s?= References: <87mtsky9um.fsf@gmail.com> <20210525155003.27590-1-maxim.cournoyer@gmail.com> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 6 Prairial an 229 de la =?UTF-8?Q?R=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Tue, 25 May 2021 22:27:02 +0200 In-Reply-To: <20210525155003.27590-1-maxim.cournoyer@gmail.com> (Maxim Cournoyer's message of "Tue, 25 May 2021 11:50:03 -0400") Message-ID: <875yz61rvt.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -2.3 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) Hi! Maxim Cournoyer skribis: > Fixes . > > * guix/scripts/offload.scm (check-machine-availability): Refactor so that= it > takes a single machine object, to allow for retrying a single machine. H= andle > the case where the checks raised an exception due to the connection to the > build machine having been lost, and retry up to 3 times. Ensure the clea= nup > code is run in all situations. > (check-machines-availability): New procedure. Call > CHECK-MACHINES-AVAILABILITY in parallel, which improves performance (about > twice as fast with 4 build machines, from ~30 s to ~15 s). > * guix/inferior.scm (&inferior-connection-lost): New condition type. > (read-repl-response): Raise a condition of the above type when reading EOF > from the build machine's port. [...] > +(define-condition-type &inferior-connection-lost &error > + inferior-connection-lost?) > + > (define* (read-repl-response port #:optional inferior) > "Read a (guix repl) response from PORT and return it as a Scheme objec= t. > Raise '&inferior-exception' when an exception is read from PORT." > @@ -241,6 +246,10 @@ Raise '&inferior-exception' when an exception is rea= d from PORT." > (match (read port) > (('values objects ...) > (apply values (map sexp->object objects))) > + ;; Unexpectedly read EOF from the port. This can happen for example= when > + ;; the underlying connection for PORT was lost with Guile-SSH. > + (? eof-object? > + (raise (condition (&inferior-connection-lost)))) The match clause syntax is incorrect; should be: ((? eof-object?) (raise =E2=80=A6)) > + (info (G_ "Testing ~a build machines defined in '~a'...~%") > (length machines) machine-file) > - (let* ((names (map build-machine-name machines)) > - (sockets (map build-machine-daemon-socket machines)) > - (sessions (map (cut open-ssh-session <> %short-timeout) machi= nes)) > - (nodes (map remote-inferior sessions))) > - (for-each assert-node-has-guix nodes names) > - (for-each assert-node-repl nodes names) > - (for-each assert-node-can-import sessions nodes names sockets) > - (for-each assert-node-can-export sessions nodes names sockets) > - (for-each close-inferior nodes) > - (for-each disconnect! sessions)))) > + (par-for-each check-machine-availability machines))) Why not! IMO this should go in a separate patch, though, since it=E2=80=99= s not related. > +(define (check-machine-availability machine) > + "Check whether MACHINE is available. Exit with an error upon failure." > + ;; Sometimes, the machine remote port may return EOF, presumably becau= se the > + ;; connection was lost. Retry up to 3 times. > + (let loop ((retries 3)) > + (guard (c ((inferior-connection-lost? c) > + (let ((retries-left (1- retries))) > + (if (> retries-left 0) > + (begin > + (format (current-error-port) > + (G_ "connection to machine ~s lost; retry= ing~%") > + (build-machine-name machine)) > + (loop (retries-left))) > + (leave (G_ "connection repeatedly lost with machine= '~a'~%") > + (build-machine-name machine)))))) I=E2=80=99m afraid we=E2=80=99re papering over problems here. Is running =E2=80=98guix offload test /etc/guix/machines.scm overdrive1=E2= =80=99 on berlin enough to reproduce the issue? If so, we could monitor/strace sshd on overdrive1 to get a better understanding of what=E2=80=99s going on. WDYT? Thanks, Ludo=E2=80=99. From unknown Sun Jun 15 08:50:01 2025 X-Loop: help-debbugs@gnu.org Subject: bug#41625: [PATCH v2] offload: Handle a possible EOF response from read-repl-response. Resent-From: Maxim Cournoyer Original-Sender: "Debbugs-submit" Resent-CC: bug-guix@gnu.org Resent-Date: Wed, 26 May 2021 03:19:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 41625 X-GNU-PR-Package: guix X-GNU-PR-Keywords: To: Ludovic =?UTF-8?Q?Court=C3=A8s?= Cc: 41625@debbugs.gnu.org, marius@gnu.org Received: via spool by 41625-submit@debbugs.gnu.org id=B41625.162199911112318 (code B ref 41625); Wed, 26 May 2021 03:19:02 +0000 Received: (at 41625) by debbugs.gnu.org; 26 May 2021 03:18:31 +0000 Received: from localhost ([127.0.0.1]:47401 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1llk3y-0003Cc-QR for submit@debbugs.gnu.org; Tue, 25 May 2021 23:18:31 -0400 Received: from mail-qk1-f173.google.com ([209.85.222.173]:44702) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1llk3t-0003CL-Do for 41625@debbugs.gnu.org; Tue, 25 May 2021 23:18:28 -0400 Received: by mail-qk1-f173.google.com with SMTP id h20so17171995qko.11 for <41625@debbugs.gnu.org>; Tue, 25 May 2021 20:18:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=Bnp5qTbv1Ey6Nw+09iMMtxQO4ZjxTGise4hMO7B/N5A=; b=bUfANkc/MZ/5pFfyUxM17o6GofvIhMxUgMx9wFwgxdYx5WqKhD2TEC3Du+yfXD8P7t pOzurispLpRxnwbXlsq+mU1b28WsCqV96a0fSi3+HkSKSK746Dlc5dM4riBKMV9a+Y+X Zau/zk7+nXZWLAAU/3l4CJHW0wlfmHpxDtsSX9IzfwZ64sAgvw3cuq8OwhsSoRGSP7Be VQz9SyHVXoUFmW3pKNFcroLQvmrmq+aQPuj5edpl11VZ+RanSIKyO86xt7xjbGbZVoX8 uNip44Sn03s1bNCkY5RLxayOa5XEBd8unsgAPN6AydJfZn3Lb3cHOg4lkbGVWCbBp37R pCDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=Bnp5qTbv1Ey6Nw+09iMMtxQO4ZjxTGise4hMO7B/N5A=; b=eyXpE3fEl3ebULFV2zSS6nch0jUUoJcopa35bHQ415iF9GGWZ/VIiXyakoiNqYAcj5 sV/MG4Cp53N4cbpVEGSxgeyOT3IT39DNVz1FCbK5NAFUXIml64D5M9GvT73TLb6zTzuL gPI9TmaHNGt/8lKg1z8b6DUWU5GIcDC0Z30dxEUlYZbel+zE2a7a/P0vPYt9/xyBFZ0R YroOO1qBGrAhtmbHRydYtSiZBawEgpoq31mUdtgN4l+jF+W0Zc5K7iU0z1wlfsh+jt1u 5mR8jaTK1CZi3ozojG19zwQvfZ1qrkwb4KG+irEhFpdSIaSfYb8Wx4onBFxa4SGr1c3Y YkHQ== X-Gm-Message-State: AOAM530PRdXq39XtH6dI2JXDeMabmH1IbvlhK9OSfwH3rGf4AuSFoRM1 SJcvVnRXrY99247VNTN2SWg= X-Google-Smtp-Source: ABdhPJwKao9MFUfpbnufe27L574H51KoJeqoHcoWqrLjhgJpkCUZ0TANU4BbsmOnwnHwnNbY6PvV1Q== X-Received: by 2002:a37:d4b:: with SMTP id 72mr34199567qkn.443.1621999099685; Tue, 25 May 2021 20:18:19 -0700 (PDT) Received: from hurd (dsl-10-130-162.b2b2c.ca. [72.10.130.162]) by smtp.gmail.com with ESMTPSA id v8sm757906qkg.102.2021.05.25.20.18.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 May 2021 20:18:19 -0700 (PDT) From: Maxim Cournoyer References: <87mtsky9um.fsf@gmail.com> <20210525155003.27590-1-maxim.cournoyer@gmail.com> <875yz61rvt.fsf@gnu.org> Date: Tue, 25 May 2021 23:18:17 -0400 In-Reply-To: <875yz61rvt.fsf@gnu.org> ("Ludovic =?UTF-8?Q?Court=C3=A8s?="'s message of "Tue, 25 May 2021 22:27:02 +0200") Message-ID: <87mtsikwsm.fsf_-_@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Ludovic, Ludovic Court=C3=A8s writes: [...] >> (define* (read-repl-response port #:optional inferior) >> "Read a (guix repl) response from PORT and return it as a Scheme obje= ct. >> Raise '&inferior-exception' when an exception is read from PORT." >> @@ -241,6 +246,10 @@ Raise '&inferior-exception' when an exception is re= ad from PORT." >> (match (read port) >> (('values objects ...) >> (apply values (map sexp->object objects))) >> + ;; Unexpectedly read EOF from the port. This can happen for exampl= e when >> + ;; the underlying connection for PORT was lost with Guile-SSH. >> + (? eof-object? >> + (raise (condition (&inferior-connection-lost)))) > > The match clause syntax is incorrect; should be: > > ((? eof-object?) > (raise =E2=80=A6)) Good catch, fixed. >> + (info (G_ "Testing ~a build machines defined in '~a'...~%") >> (length machines) machine-file) >> - (let* ((names (map build-machine-name machines)) >> - (sockets (map build-machine-daemon-socket machines)) >> - (sessions (map (cut open-ssh-session <> %short-timeout) mach= ines)) >> - (nodes (map remote-inferior sessions))) >> - (for-each assert-node-has-guix nodes names) >> - (for-each assert-node-repl nodes names) >> - (for-each assert-node-can-import sessions nodes names sockets) >> - (for-each assert-node-can-export sessions nodes names sockets) >> - (for-each close-inferior nodes) >> - (for-each disconnect! sessions)))) >> + (par-for-each check-machine-availability machines))) > > Why not! IMO this should go in a separate patch, though, since it=E2=80= =99s not > related. For me, it is related in that retrying all the checks of *every* build offload machine would be too expensive; it already takes 32 s for my 4 offload machines; retrying this for up to 3 times would mean waiting for a minute and half, which I don't find reasonable (imagine on berlin!). >> +(define (check-machine-availability machine) >> + "Check whether MACHINE is available. Exit with an error upon failure= ." >> + ;; Sometimes, the machine remote port may return EOF, presumably beca= use the >> + ;; connection was lost. Retry up to 3 times. >> + (let loop ((retries 3)) >> + (guard (c ((inferior-connection-lost? c) >> + (let ((retries-left (1- retries))) >> + (if (> retries-left 0) >> + (begin >> + (format (current-error-port) >> + (G_ "connection to machine ~s lost; retr= ying~%") >> + (build-machine-name machine)) >> + (loop (retries-left))) >> + (leave (G_ "connection repeatedly lost with machin= e '~a'~%") >> + (build-machine-name machine)))))) > > I=E2=80=99m afraid we=E2=80=99re papering over problems here. I had that thought too, but then also realized that even if this was papering over a problem, it'd be a good one to paper over as this problem can legitimately happen in practice, due to the network's inherently shaky nature. It seems better to be ready for it. Also, my hopes in being able to troubleshoot such a difficult to reproduce networking issue are rather low. > Is running =E2=80=98guix offload test /etc/guix/machines.scm overdrive1= =E2=80=99 on > berlin enough to reproduce the issue? If so, we could monitor/strace > sshd on overdrive1 to get a better understanding of what=E2=80=99s going = on. It's actually difficult to trigger it; it seems to happen mostly on the first try after a long time without connecting to the machine; on the 2nd and later tries, everything is smooth. Waiting a few minutes is not enough to re-trigger the problem. I've managed to see the problem a few lucky times with: --8<---------------cut here---------------start------------->8--- while true; do guix offload test /etc/guix/machines.scm overdrive1; done --8<---------------cut here---------------end--------------->8--- I don't have a password set for my user on overdrive1, so can't attach strace to sshd, but yeah, we could try to capture it and see if we can understand what's going on. Attached is v2 of the patch, with the match clause fixed. --=-=-= Content-Type: text/x-patch; charset=utf-8 Content-Disposition: attachment; filename=0001-offload-Handle-a-possible-EOF-response-from-read-rep.patch Content-Transfer-Encoding: quoted-printable >From c52172502749a4d194dc51db9d2c394cb15e8d07 Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer Date: Tue, 25 May 2021 08:42:06 -0400 Subject: [PATCH] offload: Handle a possible EOF response from read-repl-response. Fixes . * guix/scripts/offload.scm (check-machine-availability): Refactor so that it takes a single machine object, to allow for retrying a single machine. Han= dle the case where the checks raised an exception due to the connection to the build machine having been lost, and retry up to 3 times. Ensure the cleanup code is run in all situations. (check-machines-availability): New procedure. Call CHECK-MACHINES-AVAILABILITY in parallel, which improves performance (about twice as fast with 4 build machines, from ~30 s to ~15 s). * guix/inferior.scm (&inferior-connection-lost): New condition type. (read-repl-response): Raise a condition of the above type when reading EOF from the build machine's port. --- guix/inferior.scm | 9 ++++++++ guix/scripts/offload.scm | 50 +++++++++++++++++++++++++++++----------- 2 files changed, 45 insertions(+), 14 deletions(-) diff --git a/guix/inferior.scm b/guix/inferior.scm index 7c8e478f2a..45d9d843e3 100644 --- a/guix/inferior.scm +++ b/guix/inferior.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2018, 2019, 2020, 2021 Ludovic Court=C3=A8s +;;; Copyright =C2=A9 2021 Maxim Cournoyer ;;; ;;; This file is part of GNU Guix. ;;; @@ -70,6 +71,7 @@ inferior-exception-arguments inferior-exception-inferior inferior-exception-stack + inferior-connection-lost? read-repl-response =20 inferior-packages @@ -228,6 +230,9 @@ equivalent. Return #f if the inferior could not be lau= nched." (inferior inferior-exception-inferior) ; | #f (stack inferior-exception-stack)) ;list of (FILE COLUMN LI= NE) =20 +(define-condition-type &inferior-connection-lost &error + inferior-connection-lost?) + (define* (read-repl-response port #:optional inferior) "Read a (guix repl) response from PORT and return it as a Scheme object. Raise '&inferior-exception' when an exception is read from PORT." @@ -241,6 +246,10 @@ Raise '&inferior-exception' when an exception is read = from PORT." (match (read port) (('values objects ...) (apply values (map sexp->object objects))) + ;; Unexpectedly read EOF from the port. This can happen for example w= hen + ;; the underlying connection for PORT was lost with Guile-SSH. + ((? eof-object?) + (raise (condition (&inferior-connection-lost)))) (('exception ('arguments key objects ...) ('stack frames ...)) ;; Protocol (0 1 1) and later. diff --git a/guix/scripts/offload.scm b/guix/scripts/offload.scm index 835078cb97..0271874f6a 100644 --- a/guix/scripts/offload.scm +++ b/guix/scripts/offload.scm @@ -1,7 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2014, 2015, 2016, 2017, 2018, 2019, 2020 Ludovic Cour= t=C3=A8s ;;; Copyright =C2=A9 2017 Ricardo Wurmus -;;; Copyright =C2=A9 2020 Maxim Cournoyer +;;; Copyright =C2=A9 2020, 2021 Maxim Cournoyer ;;; Copyright =C2=A9 2020 Julien Lepiller ;;; ;;; This file is part of GNU Guix. @@ -53,6 +53,7 @@ #:use-module (ice-9 regex) #:use-module (ice-9 format) #:use-module (ice-9 binary-ports) + #:use-module (ice-9 threads) #:export (build-machine build-machine? build-machine-name @@ -684,7 +685,7 @@ daemon is not running." (leave (G_ "failed to import '~a' from '~a'~%") item name))))) =20 -(define (check-machine-availability machine-file pred) +(define (check-machines-availability machine-file pred) "Check that each machine matching PRED in MACHINE-FILE is usable as a bu= ild machine." (define (build-machine=3D? m1 m2) @@ -696,18 +697,39 @@ machine." (let ((machines (filter pred (delete-duplicates (build-machines machine-file) build-machine=3D?)))) - (info (G_ "testing ~a build machines defined in '~a'...~%") + (info (G_ "Testing ~a build machines defined in '~a'...~%") (length machines) machine-file) - (let* ((names (map build-machine-name machines)) - (sockets (map build-machine-daemon-socket machines)) - (sessions (map (cut open-ssh-session <> %short-timeout) machine= s)) - (nodes (map remote-inferior sessions))) - (for-each assert-node-has-guix nodes names) - (for-each assert-node-repl nodes names) - (for-each assert-node-can-import sessions nodes names sockets) - (for-each assert-node-can-export sessions nodes names sockets) - (for-each close-inferior nodes) - (for-each disconnect! sessions)))) + (par-for-each check-machine-availability machines))) + +(define (check-machine-availability machine) + "Check whether MACHINE is available. Exit with an error upon failure." + ;; Sometimes, the machine remote port may return EOF, presumably because= the + ;; connection was lost. Retry up to 3 times. + (let loop ((retries 3)) + (guard (c ((inferior-connection-lost? c) + (let ((retries-left (1- retries))) + (if (> retries-left 0) + (begin + (format (current-error-port) + (G_ "connection to machine '~a' lost; retry= ing~%") + (build-machine-name machine)) + (loop (retries-left))) + (leave (G_ "connection repeatedly lost with machine '= ~a'~%") + (build-machine-name machine)))))) + (let* ((name (build-machine-name machine)) + (socket (build-machine-daemon-socket machine)) + (session (open-ssh-session machine %short-timeout)) + (node (remote-inferior session))) + (dynamic-wind + (lambda () #t) + (lambda () + (assert-node-has-guix node name) + (assert-node-repl node name) + (assert-node-can-import session node name socket) + (assert-node-can-export session node name socket)) + (lambda () + (close-inferior node) + (disconnect! session))))))) =20 (define (check-machine-status machine-file pred) "Print the load of each machine matching PRED in MACHINE-FILE." @@ -824,7 +846,7 @@ machine." ((file) (values file (const #t))) (() (values %machine-file (const #t))) (x (leave (G_ "wrong number of arguments~%")))= ))) - (check-machine-availability (or file %machine-file) pred)))) + (check-machines-availability (or file %machine-file) pred)))) (("status" rest ...) (with-error-handling (let-values (((file pred) --=20 2.31.1 --=-=-= Content-Type: text/plain Thanks! Maxim --=-=-=-- From unknown Sun Jun 15 08:50:01 2025 X-Loop: help-debbugs@gnu.org Subject: bug#41625: [PATCH v2] offload: Handle a possible EOF response from read-repl-response. Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= Original-Sender: "Debbugs-submit" Resent-CC: bug-guix@gnu.org Resent-Date: Wed, 26 May 2021 09:15:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 41625 X-GNU-PR-Package: guix X-GNU-PR-Keywords: To: Maxim Cournoyer Cc: 41625@debbugs.gnu.org, marius@gnu.org Received: via spool by 41625-submit@debbugs.gnu.org id=B41625.162202048413397 (code B ref 41625); Wed, 26 May 2021 09:15:02 +0000 Received: (at 41625) by debbugs.gnu.org; 26 May 2021 09:14:44 +0000 Received: from localhost ([127.0.0.1]:47617 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1llpch-0003U1-Pu for submit@debbugs.gnu.org; Wed, 26 May 2021 05:14:44 -0400 Received: from eggs.gnu.org ([209.51.188.92]:33888) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1llpcf-0003Tn-0s for 41625@debbugs.gnu.org; Wed, 26 May 2021 05:14:42 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:56784) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1llpcY-0002BT-Hx; Wed, 26 May 2021 05:14:35 -0400 Received: from [2a01:e0a:1d:7270:af76:b9b:ca24:c465] (port=53510 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1llpcY-0007Fb-8i; Wed, 26 May 2021 05:14:34 -0400 From: Ludovic =?UTF-8?Q?Court=C3=A8s?= References: <87mtsky9um.fsf@gmail.com> <20210525155003.27590-1-maxim.cournoyer@gmail.com> <875yz61rvt.fsf@gnu.org> <87mtsikwsm.fsf_-_@gmail.com> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 7 Prairial an 229 de la =?UTF-8?Q?R=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Wed, 26 May 2021 11:14:32 +0200 In-Reply-To: <87mtsikwsm.fsf_-_@gmail.com> (Maxim Cournoyer's message of "Tue, 25 May 2021 23:18:17 -0400") Message-ID: <87fsy9x3ev.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -2.3 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) Hi, Maxim Cournoyer skribis: >>> + (info (G_ "Testing ~a build machines defined in '~a'...~%") >>> (length machines) machine-file) >>> - (let* ((names (map build-machine-name machines)) >>> - (sockets (map build-machine-daemon-socket machines)) >>> - (sessions (map (cut open-ssh-session <> %short-timeout) mac= hines)) >>> - (nodes (map remote-inferior sessions))) >>> - (for-each assert-node-has-guix nodes names) >>> - (for-each assert-node-repl nodes names) >>> - (for-each assert-node-can-import sessions nodes names sockets) >>> - (for-each assert-node-can-export sessions nodes names sockets) >>> - (for-each close-inferior nodes) >>> - (for-each disconnect! sessions)))) >>> + (par-for-each check-machine-availability machines))) >> >> Why not! IMO this should go in a separate patch, though, since it=E2=80= =99s not >> related. > > For me, it is related in that retrying all the checks of *every* build > offload machine would be too expensive; it already takes 32 s for my 4 > offload machines; retrying this for up to 3 times would mean waiting for > a minute and half, which I don't find reasonable (imagine on berlin!). I see. So I=E2=80=99d say it=E2=80=99s a prerequisite (a patch that must c= ome before) but not entirely the same thing. I=E2=80=99m nitpicking! We should make sure it doesn=E2=80=99t trigger thread-safety issues in libs= sh or anything like that (running it repeatedly on a large machines.scm should give us some confidence). >>> +(define (check-machine-availability machine) >>> + "Check whether MACHINE is available. Exit with an error upon failur= e." >>> + ;; Sometimes, the machine remote port may return EOF, presumably bec= ause the >>> + ;; connection was lost. Retry up to 3 times. >>> + (let loop ((retries 3)) >>> + (guard (c ((inferior-connection-lost? c) >>> + (let ((retries-left (1- retries))) >>> + (if (> retries-left 0) >>> + (begin >>> + (format (current-error-port) >>> + (G_ "connection to machine ~s lost; ret= rying~%") >>> + (build-machine-name machine)) >>> + (loop (retries-left))) >>> + (leave (G_ "connection repeatedly lost with machi= ne '~a'~%") >>> + (build-machine-name machine)))))) >> >> I=E2=80=99m afraid we=E2=80=99re papering over problems here. > > I had that thought too, but then also realized that even if this was > papering over a problem, it'd be a good one to paper over as this > problem can legitimately happen in practice, due to the network's > inherently shaky nature. It seems better to be ready for it. Also, my > hopes in being able to troubleshoot such a difficult to reproduce > networking issue are rather low. Yes, but note that this is just for =E2=80=98guix offload test=E2=80=99. T= he actual code run while offloading will still fail badly. >> Is running =E2=80=98guix offload test /etc/guix/machines.scm overdrive1= =E2=80=99 on >> berlin enough to reproduce the issue? If so, we could monitor/strace >> sshd on overdrive1 to get a better understanding of what=E2=80=99s going= on. > > It's actually difficult to trigger it; it seems to happen mostly on the > first try after a long time without connecting to the machine; on the > 2nd and later tries, everything is smooth. Waiting a few minutes is not > enough to re-trigger the problem. > > I've managed to see the problem a few lucky times with: > > while true; do guix offload test /etc/guix/machines.scm overdrive1; done > > I don't have a password set for my user on overdrive1, so can't attach > strace to sshd, but yeah, we could try to capture it and see if we can > understand what's going on. OK. > From c52172502749a4d194dc51db9d2c394cb15e8d07 Mon Sep 17 00:00:00 2001 > From: Maxim Cournoyer > Date: Tue, 25 May 2021 08:42:06 -0400 > Subject: [PATCH] offload: Handle a possible EOF response from > read-repl-response. > > Fixes . > > * guix/scripts/offload.scm (check-machine-availability): Refactor so that= it > takes a single machine object, to allow for retrying a single machine. H= andle > the case where the checks raised an exception due to the connection to the > build machine having been lost, and retry up to 3 times. Ensure the clea= nup > code is run in all situations. > (check-machines-availability): New procedure. Call > CHECK-MACHINES-AVAILABILITY in parallel, which improves performance (about > twice as fast with 4 build machines, from ~30 s to ~15 s). > * guix/inferior.scm (&inferior-connection-lost): New condition type. > (read-repl-response): Raise a condition of the above type when reading EOF > from the build machine's port. [...] > +(define-condition-type &inferior-connection-lost &error > + inferior-connection-lost?) Perhaps worth adding an =E2=80=98inferior=E2=80=99 and/or =E2=80=98port=E2= =80=99 field. That would allow the handler to present more information as to which inferior is failing. Maybe =E2=80=98premature-eof=E2=80=99 would be more accurate than =E2=80=98= connection-lost=E2=80=99. > + (format (current-error-port) > + (G_ "connection to machine '~a' lost; ret= rying~%") > + (build-machine-name machine)) You can use =E2=80=98info=E2=80=99 instead of =E2=80=98format=E2=80=99. Otherwise LGTM, thanks! Ludo=E2=80=99. From unknown Sun Jun 15 08:50:01 2025 X-Loop: help-debbugs@gnu.org Subject: bug#41625: [PATCH v2] offload: Handle a possible EOF response from read-repl-response. Resent-From: Marius Bakke Original-Sender: "Debbugs-submit" Resent-CC: bug-guix@gnu.org Resent-Date: Wed, 26 May 2021 15:49:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 41625 X-GNU-PR-Package: guix X-GNU-PR-Keywords: To: Maxim Cournoyer , Ludovic =?UTF-8?Q?Court=C3=A8s?= Cc: 41625@debbugs.gnu.org Received: via spool by 41625-submit@debbugs.gnu.org id=B41625.16220441237188 (code B ref 41625); Wed, 26 May 2021 15:49:01 +0000 Received: (at 41625) by debbugs.gnu.org; 26 May 2021 15:48:43 +0000 Received: from localhost ([127.0.0.1]:49757 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1llvlz-0001rr-HQ for submit@debbugs.gnu.org; Wed, 26 May 2021 11:48:43 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35964) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1llvly-0001rf-3w for 41625@debbugs.gnu.org; Wed, 26 May 2021 11:48:42 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:37940) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1llvls-0001qI-5s; Wed, 26 May 2021 11:48:36 -0400 Received: from host-37-191-231-185.lynet.no ([37.191.231.185]:48442 helo=localhost) by fencepost.gnu.org with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1llvlr-00075C-K5; Wed, 26 May 2021 11:48:35 -0400 From: Marius Bakke In-Reply-To: <87mtsikwsm.fsf_-_@gmail.com> References: <87mtsky9um.fsf@gmail.com> <20210525155003.27590-1-maxim.cournoyer@gmail.com> <875yz61rvt.fsf@gnu.org> <87mtsikwsm.fsf_-_@gmail.com> Date: Wed, 26 May 2021 17:48:32 +0200 Message-ID: <87h7ipa433.fsf@gnu.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -2.3 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Maxim Cournoyer skriver: >> Is running =E2=80=98guix offload test /etc/guix/machines.scm overdrive1= =E2=80=99 on >> berlin enough to reproduce the issue? If so, we could monitor/strace >> sshd on overdrive1 to get a better understanding of what=E2=80=99s going= on. > > It's actually difficult to trigger it; it seems to happen mostly on the > first try after a long time without connecting to the machine; on the > 2nd and later tries, everything is smooth. Waiting a few minutes is not > enough to re-trigger the problem. > > I've managed to see the problem a few lucky times with: > > --8<---------------cut here---------------start------------->8--- > while true; do guix offload test /etc/guix/machines.scm overdrive1; done > --8<---------------cut here---------------end--------------->8--- I used to be able to reproduce it by inducing a high load on the target machine and just let Guix keep trying to connect. But now I did that, and set overload threshold to 0.0 for good measure, and Guix has been waiting patiently for two hours without failure. So AFAICT this bug has been fixed. Perhaps Berlin or the Overdrive simply needs to be updated? --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iIUEARYKAC0WIQRNTknu3zbaMQ2ddzTocYulkRQQdwUCYK5t0A8cbWFyaXVzQGdu dS5vcmcACgkQ6HGLpZEUEHcy7QEAlX2skErbZBDILToutLkOSP6mLf3xK2tdqBcO ttgbpX0BANb7F5k14C9HhyQBYoexMCS9Mydjfx43TLIeAuKw2gkL =41ZX -----END PGP SIGNATURE----- --=-=-=-- From unknown Sun Jun 15 08:50:01 2025 X-Loop: help-debbugs@gnu.org Subject: bug#41625: [PATCH v2] offload: Handle a possible EOF response from read-repl-response. Resent-From: Maxim Cournoyer Original-Sender: "Debbugs-submit" Resent-CC: bug-guix@gnu.org Resent-Date: Thu, 27 May 2021 11:50:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 41625 X-GNU-PR-Package: guix X-GNU-PR-Keywords: To: Ludovic =?UTF-8?Q?Court=C3=A8s?= Cc: 41625@debbugs.gnu.org, marius@gnu.org Received: via spool by 41625-submit@debbugs.gnu.org id=B41625.162211617119272 (code B ref 41625); Thu, 27 May 2021 11:50:01 +0000 Received: (at 41625) by debbugs.gnu.org; 27 May 2021 11:49:31 +0000 Received: from localhost ([127.0.0.1]:50757 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lmEW2-00050m-Jz for submit@debbugs.gnu.org; Thu, 27 May 2021 07:49:30 -0400 Received: from mail-qk1-f178.google.com ([209.85.222.178]:44898) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lmEW1-00050a-95 for 41625@debbugs.gnu.org; Thu, 27 May 2021 07:49:29 -0400 Received: by mail-qk1-f178.google.com with SMTP id h20so253835qko.11 for <41625@debbugs.gnu.org>; Thu, 27 May 2021 04:49:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version:content-transfer-encoding; bh=/DWBr4/8Nt2F2IKaJzjp6D5dZnx1xjLmdnLpT+HR2P0=; b=r6+221jnZNKiAjefaRgRU/fxsjOe2KmZMoBBPQeiGkJ/GH1ARFoWoMjroDtiAIaFJX ZKaJGrKG2LQjdA9GziMmSqf5aLKKbh7Fnw1o01xLSFxumk94z9KjmvMjqV3I60qxfw9o YI4dpxEqgn7qHOaaeS2qAmctBWGMr/UaQ/v2b6hoZbV8EJsMBr1wiCP7nsuG0N8qN0Gm VEfD0xQRIe6D0mlGY/SRim9a71qNK2xKIrp0DxUifHUJDhxXkUS+WGmL4G23CPgdUSID ebDSATifkdNrYGAuSuar4TmNC/UMXAM1hS65SR2f1I1nD+R+lhm32YeUcZbGWlq20VbO RFzA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version:content-transfer-encoding; bh=/DWBr4/8Nt2F2IKaJzjp6D5dZnx1xjLmdnLpT+HR2P0=; b=Pj5Fozkx+OnIFw+USvVNlH7hDP5NJvGLOHro/sncw8hjIEeGhj4FxMJJFn2WcpUG2V M6NCUnzNiHqFNUEX1hpgx4caf5umbnz9nPt+lJ3x/Sq6h7lbsMKECqof0Fk/mCEkYuoB 6YHN+QuEPxIRpy9R5wUtyEb4xC0ZubSXqhkXGPZO79KOgA9QwLirfoLkaWv+MxvofuA3 Jx0e1D9hkvzrrSxuXZ/aVyqsGhzfg+mnvhIPm5PzBpwxRWOqgBLJseFhkLinQwXk7j9/ UhjKpOdPNfJR8gmsKwNxlPVNGPU0mCOBae2HyTNc1Q3noCm8hQ3E4eWMsO0HgPk6hxME J5FA== X-Gm-Message-State: AOAM531/vqgw+heDk664qo6fJPLr7AhTkg5WQibRpLlHSXN3DcPTKmsN SSk5VNrlobeT2ygg2IrcKyE= X-Google-Smtp-Source: ABdhPJwoW2qVr3nMpoLSOICW/WMBfS5qDracpQkzr8nYfZnMAFbQwSrha8rdIr/UuSQga5VJAP+xcw== X-Received: by 2002:a37:b143:: with SMTP id a64mr3056144qkf.492.1622116163676; Thu, 27 May 2021 04:49:23 -0700 (PDT) Received: from hurd (dsl-152-121.b2b2c.ca. [66.158.152.121]) by smtp.gmail.com with ESMTPSA id v25sm1183427qtf.68.2021.05.27.04.49.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 May 2021 04:49:23 -0700 (PDT) From: Maxim Cournoyer References: <87mtsky9um.fsf@gmail.com> <20210525155003.27590-1-maxim.cournoyer@gmail.com> <875yz61rvt.fsf@gnu.org> <87mtsikwsm.fsf_-_@gmail.com> <87fsy9x3ev.fsf@gnu.org> Date: Thu, 27 May 2021 07:49:22 -0400 In-Reply-To: <87fsy9x3ev.fsf@gnu.org> ("Ludovic =?UTF-8?Q?Court=C3=A8s?="'s message of "Wed, 26 May 2021 11:14:32 +0200") Message-ID: <877djkl7lp.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Hi Ludovic, Ludovic Court=C3=A8s writes: [...] > I see. So I=E2=80=99d say it=E2=80=99s a prerequisite (a patch that must= come before) > but not entirely the same thing. I=E2=80=99m nitpicking! Eh, it's okay :-). Splitting changes into the right unit is a problem that is akin to naming things; it's hard! I welcome your suggestion. > We should make sure it doesn=E2=80=99t trigger thread-safety issues in li= bssh or > anything like that (running it repeatedly on a large machines.scm should > give us some confidence). It seems fine so far, but I've only tested in a loop with 4 build machines. When it nears completion I'll give it a shot on berlin. [...] > Yes, but note that this is just for =E2=80=98guix offload test=E2=80=99. = The actual > code run while offloading will still fail badly. Ah, thanks for pointing that; I somehow thought that this machine status checking code was a prelude to every offloaded build. [...] >> I don't have a password set for my user on overdrive1, so can't attach >> strace to sshd, but yeah, we could try to capture it and see if we can >> understand what's going on. > > OK. I'd be happy to try strace when your are available. You can ping me on the chat. It's been more than 8 hours since I tried, so I should be able to trigger the problem :-). [...] > Perhaps worth adding an =E2=80=98inferior=E2=80=99 and/or =E2=80=98port= =E2=80=99 field. That would > allow the handler to present more information as to which inferior is > failing. > > Maybe =E2=80=98premature-eof=E2=80=99 would be more accurate than =E2=80= =98connection-lost=E2=80=99. Good suggestions. I'll implement them. >> + (format (current-error-port) >> + (G_ "connection to machine '~a' lost; re= trying~%") >> + (build-machine-name machine)) > > You can use =E2=80=98info=E2=80=99 instead of =E2=80=98format=E2=80=99. That also. Thanks! On another note, I was able to 'exercise' the fix, and the exception is raised but something fails with the following backtrace instead of being retried: --8<---------------cut here---------------start------------->8--- guix offload: Testing 1 build machines defined in '/etc/guix/machines.scm'.= .. connection to machine 'overdrive1.guix.gnu.org' lost; retrying Backtrace: In ice-9/boot-9.scm: 1752:10 10 (with-exception-handler _ _ #:unwind? _ #:unwind-for-type _) In unknown file: 9 (apply-smob/0 #) In ice-9/boot-9.scm: 724:2 8 (call-with-prompt _ _ #) In ice-9/eval.scm: 619:8 7 (_ #(#(#))) In guix/ui.scm: 2161:12 6 (run-guix-command _ . _) In ice-9/boot-9.scm: 1752:10 5 (with-exception-handler _ _ #:unwind? _ #:unwind-for-type _) 1747:15 4 (with-exception-handler # _ # _ # =E2=80=A6) In srfi/srfi-1.scm: 634:9 3 (for-each # (#< name: "overdriv=E2=80=A6>)) In ice-9/eval.scm: 191:35 2 (_ #(#(#(# 3 #<= na=E2=80=A6> =E2=80=A6) =E2=80=A6) =E2=80=A6)) Exception thrown while printing backtrace: In procedure frame-local-ref: Argument 2 out of range: 1 ice-9/boot-9.scm:1685:16: In procedure raise-exception: Wrong type to apply: 2 --8<---------------cut here---------------end--------------->8--- I haven't been able to pinpoint what yet. Notice that in the above code I've changed par-for-each by just for-each, doubting it might have something to do with it, but it appears unrelated. Thanks, Maxim From unknown Sun Jun 15 08:50:01 2025 X-Loop: help-debbugs@gnu.org Subject: bug#41625: [PATCH v2] offload: Handle a possible EOF response from read-repl-response. Resent-From: Maxim Cournoyer Original-Sender: "Debbugs-submit" Resent-CC: bug-guix@gnu.org Resent-Date: Thu, 27 May 2021 11:52:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 41625 X-GNU-PR-Package: guix X-GNU-PR-Keywords: To: Marius Bakke Cc: 41625@debbugs.gnu.org, Ludovic =?UTF-8?Q?Court=C3=A8s?= Received: via spool by 41625-submit@debbugs.gnu.org id=B41625.162211627119443 (code B ref 41625); Thu, 27 May 2021 11:52:01 +0000 Received: (at 41625) by debbugs.gnu.org; 27 May 2021 11:51:11 +0000 Received: from localhost ([127.0.0.1]:50761 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lmEXf-00053X-38 for submit@debbugs.gnu.org; Thu, 27 May 2021 07:51:11 -0400 Received: from mail-qk1-f179.google.com ([209.85.222.179]:43801) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lmEXd-00053J-Jj for 41625@debbugs.gnu.org; Thu, 27 May 2021 07:51:09 -0400 Received: by mail-qk1-f179.google.com with SMTP id 124so258116qkh.10 for <41625@debbugs.gnu.org>; Thu, 27 May 2021 04:51:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version:content-transfer-encoding; bh=85I684wp2+MN0718mnOBQgsKSFIZrYJTHhNGDJhejE8=; b=PKmNiWdtM4pbSxNzj3BgxIHbrV4zrcsCVJMFaHYXBVdf+mrkCAqDI5LNPnt+lzQoYb PyAuEfnTTlaLsjq3h8PsTRL1i0ho3v1vJAXOCdMF+SegDTXIoi25hS5tA3Pgi3a6EmaQ cK/sh4ucD9ybliuYZqWGXqOUiJJVVU2WFsObaVxa8i77O/B5Al1aNH6EB2QepNpE0WzM uiHmUB2uL/Z2+ou3e39bnj09z2+k/L1x1RZCwD7kQoFCBkCSlGxtqmu+l834W2acyGFh PE2l0F/lIG/cTjlzZCiTRf4glTponhNKxz09SY27bbhc94/TywBsHG9T8wFSeZQWlHaB PozA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version:content-transfer-encoding; bh=85I684wp2+MN0718mnOBQgsKSFIZrYJTHhNGDJhejE8=; b=bXytHUDN9K7WNy17zXYQsBhKk9VSiXB5P8K2XiraIiH1DuaamygIBbbeact2m4odgd WM8q0Dnh7cVsyN6VtukhcRWIqmOnuuLFJfFMByr3G0Q0g5PNYakzfQC/fwqscKpxps/z 5YrqvyOBxATovG1JyUqgTMcV1xg/5YEzFPE0Zps3ASpEW3ICQFF1m7BI2miPVx+JZ4Xe 4HW7QR4nqVcCumYLMGvIWNPEdHEJWV2yQvzIHcvrkgAmUhqJtzbpUF3yzMXXei4MRFn0 4szsM8UdYADmMqfGVRP5IHCW/e04s+UiAM73pXbQLQopCqEkkx/ji8/NNgBoFzfliAcd ufdQ== X-Gm-Message-State: AOAM5322F+yE6WNPF3f/pjvxuSwDCD50k48XuG6JI3tGs8TiTGQEjPBC P6kFO5q12+zjd5hh6tYwYE6FQ6kJzhI= X-Google-Smtp-Source: ABdhPJx99Dsw6H/+WEHzBHLTbo7mmFYClqxauBRB4nyl6grdQdYapJVqAefMH0lNwSq5L+ibDPqZ/A== X-Received: by 2002:a05:620a:210e:: with SMTP id l14mr3024074qkl.1.1622116263988; Thu, 27 May 2021 04:51:03 -0700 (PDT) Received: from hurd (dsl-152-121.b2b2c.ca. [66.158.152.121]) by smtp.gmail.com with ESMTPSA id s11sm1176406qti.6.2021.05.27.04.51.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 May 2021 04:51:02 -0700 (PDT) From: Maxim Cournoyer References: <87mtsky9um.fsf@gmail.com> <20210525155003.27590-1-maxim.cournoyer@gmail.com> <875yz61rvt.fsf@gnu.org> <87mtsikwsm.fsf_-_@gmail.com> <87h7ipa433.fsf@gnu.org> Date: Thu, 27 May 2021 07:51:01 -0400 In-Reply-To: <87h7ipa433.fsf@gnu.org> (Marius Bakke's message of "Wed, 26 May 2021 17:48:32 +0200") Message-ID: <8735u8l7iy.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Hi Marius, Marius Bakke writes: > Maxim Cournoyer skriver: > >>> Is running =E2=80=98guix offload test /etc/guix/machines.scm overdrive1= =E2=80=99 on >>> berlin enough to reproduce the issue? If so, we could monitor/strace >>> sshd on overdrive1 to get a better understanding of what=E2=80=99s goin= g on. >> >> It's actually difficult to trigger it; it seems to happen mostly on the >> first try after a long time without connecting to the machine; on the >> 2nd and later tries, everything is smooth. Waiting a few minutes is not >> enough to re-trigger the problem. >> >> I've managed to see the problem a few lucky times with: >> >> --8<---------------cut here---------------start------------->8--- >> while true; do guix offload test /etc/guix/machines.scm overdrive1; done >> --8<---------------cut here---------------end--------------->8--- > > I used to be able to reproduce it by inducing a high load on the target > machine and just let Guix keep trying to connect. But now I did that, > and set overload threshold to 0.0 for good measure, and Guix has been > waiting patiently for two hours without failure. > > So AFAICT this bug has been fixed. Perhaps Berlin or the Overdrive > simply needs to be updated? Ah! Do you have root access to overdrive1? It'd be interesting to reconfigure it to update the guix-daemon and see if the problem vanishes. Thanks for the information! Maxim From unknown Sun Jun 15 08:50:01 2025 X-Loop: help-debbugs@gnu.org Subject: bug#41625: [PATCH v3] offload: Handle a possible EOF response from read-repl-response. Resent-From: Maxim Cournoyer Original-Sender: "Debbugs-submit" Resent-CC: bug-guix@gnu.org Resent-Date: Thu, 27 May 2021 14:58:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 41625 X-GNU-PR-Package: guix X-GNU-PR-Keywords: To: Ludovic =?UTF-8?Q?Court=C3=A8s?= Cc: 41625@debbugs.gnu.org, marius@gnu.org Received: via spool by 41625-submit@debbugs.gnu.org id=B41625.162212745431745 (code B ref 41625); Thu, 27 May 2021 14:58:01 +0000 Received: (at 41625) by debbugs.gnu.org; 27 May 2021 14:57:34 +0000 Received: from localhost ([127.0.0.1]:52590 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lmHS1-0008Fx-SF for submit@debbugs.gnu.org; Thu, 27 May 2021 10:57:34 -0400 Received: from mail-qt1-f175.google.com ([209.85.160.175]:41803) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lmHRz-0008Fj-Kk for 41625@debbugs.gnu.org; Thu, 27 May 2021 10:57:32 -0400 Received: by mail-qt1-f175.google.com with SMTP id t20so392484qtx.8 for <41625@debbugs.gnu.org>; Thu, 27 May 2021 07:57:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=NF2/6IiKIKkD1LjYKSgElhHFqxQLFAFG00alQDtOR08=; b=PFhmaPvj/5xzQbRuPs8aALq3VNkFyDFuh+2lYYecrQzW+4hL3cLnzbegxxcBEkgyrb z8qZ+Bd2QAk51eBipv3rbH1cvE2sc4UeKYVLa8Q7u2SMImSn0+lnsOePsnz+q8HsG5Wy VHCVWP834f2SsNTk1wVVvjsZ9SotUAVnv5H7rIMAQjVHodyFI3V5XJqhiAs13jnZ9LtJ e6mRlzEbGmfPMPaLRi+k0k4Ln2OIyvYmbdcLdhQWGZVry26oYIOzLCI/XJTkHV5uwM3G MMFeXjM4DSQd4CSiNAOq8B0wNa6XbgVgaMs1k8Et8HVCwXAqkvfcyU1AqC9PRbIFLQeb HOCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=NF2/6IiKIKkD1LjYKSgElhHFqxQLFAFG00alQDtOR08=; b=Dh1F7TC8aNvH9y2dojUFsPe97L6ocer7PGxJ2xz8oyaFm9A0B2emAJdLEIYrQFK+YC LwuNERR9pVcYJLbiXwTgxd4sjqygD/ZJZQyaR7TyIE6qihBV8DVZcJsXj0p0PiyVIrqn Y+68XQb9jBBVXcXcGj/vZbJxPFxKmoXUkLIuYFf/RzBWXQ7AEGsE7pPI8Rws9yzdT7lq PigCObJqx3nc+FpcJMyH38PF2vhWVgstCv8upM51GptsLx11rzOOCYTb7MMZS6nz2NPz aczwEJlZFjuxPt068lfh/U1w5R47ndowZFQNrv/JI+18dqZYfH+MXQerNzSBYm9cMMqH EqkQ== X-Gm-Message-State: AOAM533q3RC2fFMdtAHrwgBVIX6k/kz8yjKQBucbZYnbX9ixaOJqVsgN nEVDQYjZygv/gHQypOzhgIo= X-Google-Smtp-Source: ABdhPJyIOCcEZjKmybApnSH4Tr7kWskMyHn8dr+PL5uShLRHQ+1kqDf2bWzSWArAL20wWl26ukkLOg== X-Received: by 2002:ac8:6a0f:: with SMTP id t15mr3472078qtr.104.1622127446007; Thu, 27 May 2021 07:57:26 -0700 (PDT) Received: from hurd (dsl-152-121.b2b2c.ca. [66.158.152.121]) by smtp.gmail.com with ESMTPSA id o10sm1541862qki.72.2021.05.27.07.57.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 May 2021 07:57:25 -0700 (PDT) From: Maxim Cournoyer References: <87mtsky9um.fsf@gmail.com> <20210525155003.27590-1-maxim.cournoyer@gmail.com> <875yz61rvt.fsf@gnu.org> <87mtsikwsm.fsf_-_@gmail.com> <87fsy9x3ev.fsf@gnu.org> Date: Thu, 27 May 2021 10:57:24 -0400 In-Reply-To: <87fsy9x3ev.fsf@gnu.org> ("Ludovic =?UTF-8?Q?Court=C3=A8s?="'s message of "Wed, 26 May 2021 11:14:32 +0200") Message-ID: <87r1hsjkbv.fsf_-_@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Ludo, Now that I have root access to overdrive1, I could strace the sshd process (I just did 'strace -p340', noting the process of sshd displayed with 'herd status sshd'): --8<---------------cut here---------------start------------->8--- pselect6(87, [3 4], NULL, NULL, NULL, NULL) =3D 1 (in [3]) accept(3, {sa_family=3DAF_INET, sin_port=3Dhtons(33262), sin_addr=3Dinet_ad= dr("66.158.152.121")}, [128->16]) =3D 5 fcntl(5, F_GETFL) =3D 0x2 (flags O_RDWR) pipe2([6, 7], 0) =3D 0 socketpair(AF_UNIX, SOCK_STREAM, 0, [8, 9]) =3D 0 clone(child_stack=3DNULL, flags=3DCLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|S= IGCHLD, child_tidptr=3D0xffff8e0ef0e0) =3D 644 close(7) =3D 0 close(9) =3D 0 write(8, "\0\0\1\245\0", 5) =3D 5 write(8, "\0\0\1\234\nPort 22\nPermitRootLogin no\n"..., 420) =3D 420 close(8) =3D 0 close(5) =3D 0 getpid() =3D 340 getpid() =3D 340 getpid() =3D 340 getpid() =3D 340 getpid() =3D 340 getpid() =3D 340 getpid() =3D 340 pselect6(87, [3 4 6], NULL, NULL, NULL, NULL) =3D 1 (in [6]) read(6, "\0", 1) =3D 1 pselect6(87, [3 4 6], NULL, NULL, NULL, NULL) =3D 1 (in [6]) read(6, "", 1) =3D 0 close(6) =3D 0 pselect6(87, [3 4], NULL, NULL, NULL, NULL) =3D ? ERESTARTNOHAND (To be res= tarted if no handler) --- SIGCHLD {si_signo=3DSIGCHLD, si_code=3DCLD_EXITED, si_pid=3D644, si_uid= =3D0, si_status=3D255, si_utime=3D1, si_stime=3D0} --- wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) =3D=3D 255}], WNOHANG, NULL) =3D= 644 wait4(-1, 0xfffffa4d90e4, WNOHANG, NULL) =3D 0 rt_sigreturn({mask=3D[]}) =3D -1 EINTR (Interrupted system = call) pselect6(87, [3 4], NULL, NULL, NULL, NULL --8<---------------cut here---------------end--------------->8--- With the attached v3 patch, the corresponding output (still problematic) was: --8<---------------cut here---------------start------------->8--- $ ./pre-inst-env guix offload test /etc/guix/machines.scm overdrive1 guix offload: Testing 1 build machines defined in '/etc/guix/machines.scm'.= .. guix offload: got premature EOF from machine 'overdrive1.guix.gnu.org' from= inferior '#' on port '#'; retrying connection Backtrace: In ice-9/boot-9.scm: 1752:10 10 (with-exception-handler _ _ #:unwind? _ #:unwind-for-type _) In unknown file: 9 (apply-smob/0 #) In ice-9/boot-9.scm: 724:2 8 (call-with-prompt _ _ #) In ice-9/eval.scm: 619:8 7 (_ #(#(#))) In guix/ui.scm: 2161:12 6 (run-guix-command _ . _) In ice-9/boot-9.scm: 1752:10 5 (with-exception-handler _ _ #:unwind? _ #:unwind-for-type _) 1747:15 4 (with-exception-handler # _ # _ # =E2=80=A6) In ice-9/threads.scm: 288:21 3 (loop _) In guix/scripts/offload.scm: 719:29 2 (_ _) 719:29 1 (_ _) In ice-9/boot-9.scm: 1685:16 0 (raise-exception _ #:continuable? _) ice-9/boot-9.scm:1685:16: In procedure raise-exception: Wrong type to apply: 2 --8<---------------cut here---------------end--------------->8--- I haven't tried analyzing the strace output yet. Maxim --=-=-= Content-Type: text/x-patch; charset=utf-8 Content-Disposition: attachment; filename=0001-offload-Parallelize-machine-check-in-offload-test.patch Content-Transfer-Encoding: quoted-printable >From c7b2ec1c58adf8c795df0a6aaf075dbc331f41e8 Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer Date: Thu, 27 May 2021 08:44:44 -0400 Subject: [PATCH 1/2] offload: Parallelize machine check in offload test. * guix/scripts/offload.scm (check-machine-availability): Refactor so that it takes a single machine object. Ensure the cleanup code is always run. (check-machines-availability): New procedure. Call CHECK-MACHINES-AVAILABILITY in parallel, which improves performance (about twice as fast with 4 build machines, from ~30 s to ~15 s). --- guix/scripts/offload.scm | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/guix/scripts/offload.scm b/guix/scripts/offload.scm index 835078cb97..b0fd20e158 100644 --- a/guix/scripts/offload.scm +++ b/guix/scripts/offload.scm @@ -1,7 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2014, 2015, 2016, 2017, 2018, 2019, 2020 Ludovic Cour= t=C3=A8s ;;; Copyright =C2=A9 2017 Ricardo Wurmus -;;; Copyright =C2=A9 2020 Maxim Cournoyer +;;; Copyright =C2=A9 2020, 2021 Maxim Cournoyer ;;; Copyright =C2=A9 2020 Julien Lepiller ;;; ;;; This file is part of GNU Guix. @@ -53,6 +53,7 @@ #:use-module (ice-9 regex) #:use-module (ice-9 format) #:use-module (ice-9 binary-ports) + #:use-module (ice-9 threads) #:export (build-machine build-machine? build-machine-name @@ -684,7 +685,7 @@ daemon is not running." (leave (G_ "failed to import '~a' from '~a'~%") item name))))) =20 -(define (check-machine-availability machine-file pred) +(define (check-machines-availability machine-file pred) "Check that each machine matching PRED in MACHINE-FILE is usable as a bu= ild machine." (define (build-machine=3D? m1 m2) @@ -696,18 +697,28 @@ machine." (let ((machines (filter pred (delete-duplicates (build-machines machine-file) build-machine=3D?)))) - (info (G_ "testing ~a build machines defined in '~a'...~%") + (info (G_ "Testing ~a build machines defined in '~a'...~%") (length machines) machine-file) - (let* ((names (map build-machine-name machines)) - (sockets (map build-machine-daemon-socket machines)) - (sessions (map (cut open-ssh-session <> %short-timeout) machine= s)) - (nodes (map remote-inferior sessions))) - (for-each assert-node-has-guix nodes names) - (for-each assert-node-repl nodes names) - (for-each assert-node-can-import sessions nodes names sockets) - (for-each assert-node-can-export sessions nodes names sockets) - (for-each close-inferior nodes) - (for-each disconnect! sessions)))) + (par-for-each check-machine-availability machines))) + +(define (check-machine-availability machine) + "Check whether MACHINE is available. Exit with an error upon failure." + ;; Sometimes, the machine remote port may return EOF, presumably because= the + ;; connection was lost. Retry up to 3 times. + (let* ((name (build-machine-name machine)) + (socket (build-machine-daemon-socket machine)) + (session (open-ssh-session machine %short-timeout)) + (node (remote-inferior session))) + (dynamic-wind + (lambda () #t) + (lambda () + (assert-node-has-guix node name) + (assert-node-repl node name) + (assert-node-can-import session node name socket) + (assert-node-can-export session node name socket)) + (lambda () + (close-inferior node) + (disconnect! session))))) =20 (define (check-machine-status machine-file pred) "Print the load of each machine matching PRED in MACHINE-FILE." @@ -824,7 +835,7 @@ machine." ((file) (values file (const #t))) (() (values %machine-file (const #t))) (x (leave (G_ "wrong number of arguments~%")))= ))) - (check-machine-availability (or file %machine-file) pred)))) + (check-machines-availability (or file %machine-file) pred)))) (("status" rest ...) (with-error-handling (let-values (((file pred) --=20 2.31.1 --=-=-= Content-Type: text/x-patch; charset=utf-8 Content-Disposition: attachment; filename=0002-offload-Handle-a-possible-EOF-response-from-read-rep.patch Content-Transfer-Encoding: quoted-printable >From b5558777617e4674a150895458d57d202de56120 Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer Date: Tue, 25 May 2021 08:42:06 -0400 Subject: [PATCH 2/2] offload: Handle a possible EOF response from read-repl-response. Partially fixes . * guix/scripts/offload.scm (check-machine-availability): Handle the case wh= ere the checks raised an exception due to receiving EOF prematurely, and retry = up to 3 times. * guix/inferior.scm (&inferior-premature-eof): New condition type. (read-repl-response): Raise a condition of the above type when reading EOF from the build machine's port. --- guix/inferior.scm | 15 ++++++++++++++ guix/scripts/offload.scm | 42 ++++++++++++++++++++++++++-------------- 2 files changed, 43 insertions(+), 14 deletions(-) diff --git a/guix/inferior.scm b/guix/inferior.scm index 7c8e478f2a..e63b37a7dd 100644 --- a/guix/inferior.scm +++ b/guix/inferior.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2018, 2019, 2020, 2021 Ludovic Court=C3=A8s +;;; Copyright =C2=A9 2021 Maxim Cournoyer ;;; ;;; This file is part of GNU Guix. ;;; @@ -70,6 +71,9 @@ inferior-exception-arguments inferior-exception-inferior inferior-exception-stack + inferior-premature-eof? + inferior-premature-eof-port + inferior-premature-eof-inferior read-repl-response =20 inferior-packages @@ -228,6 +232,11 @@ equivalent. Return #f if the inferior could not be la= unched." (inferior inferior-exception-inferior) ; | #f (stack inferior-exception-stack)) ;list of (FILE COLUMN LI= NE) =20 +(define-condition-type &inferior-premature-eof &error + inferior-premature-eof? + (port inferior-premature-eof-port) + (inferior inferior-premature-eof-inferior)) + (define* (read-repl-response port #:optional inferior) "Read a (guix repl) response from PORT and return it as a Scheme object. Raise '&inferior-exception' when an exception is read from PORT." @@ -241,6 +250,12 @@ Raise '&inferior-exception' when an exception is read = from PORT." (match (read port) (('values objects ...) (apply values (map sexp->object objects))) + ((? eof-object?) + ;; Unexpectedly read EOF from the port. This can happen for example = when + ;; the underlying connection for PORT was lost with Guile-SSH. + (raise (condition (&inferior-premature-eof + (inferior inferior) + (port port))))) (('exception ('arguments key objects ...) ('stack frames ...)) ;; Protocol (0 1 1) and later. diff --git a/guix/scripts/offload.scm b/guix/scripts/offload.scm index b0fd20e158..4312eb4e22 100644 --- a/guix/scripts/offload.scm +++ b/guix/scripts/offload.scm @@ -705,20 +705,34 @@ machine." "Check whether MACHINE is available. Exit with an error upon failure." ;; Sometimes, the machine remote port may return EOF, presumably because= the ;; connection was lost. Retry up to 3 times. - (let* ((name (build-machine-name machine)) - (socket (build-machine-daemon-socket machine)) - (session (open-ssh-session machine %short-timeout)) - (node (remote-inferior session))) - (dynamic-wind - (lambda () #t) - (lambda () - (assert-node-has-guix node name) - (assert-node-repl node name) - (assert-node-can-import session node name socket) - (assert-node-can-export session node name socket)) - (lambda () - (close-inferior node) - (disconnect! session))))) + (let loop ((retries 3)) + (guard (c ((inferior-premature-eof? c) + (let ((retries-left (1- retries)) + (inferior (inferior-premature-eof-inferior c))) + (if (> retries-left 0) + (begin + (info (G_ "got premature EOF from machine '~a' from= \ +inferior '~a' on port '~a'; retrying connection~%") + (build-machine-name machine) + inferior + (inferior-premature-eof-port c)) + (loop (retries-left))) + (leave (G_ "connection repeatedly lost with machine '= ~a'~%") + (build-machine-name machine)))))) + (let* ((name (build-machine-name machine)) + (socket (build-machine-daemon-socket machine)) + (session (open-ssh-session machine %short-timeout)) + (node (remote-inferior session))) + (dynamic-wind + (lambda () #t) + (lambda () + (assert-node-has-guix node name) + (assert-node-repl node name) + (assert-node-can-import session node name socket) + (assert-node-can-export session node name socket)) + (lambda () + (close-inferior node) + (disconnect! session))))))) =20 (define (check-machine-status machine-file pred) "Print the load of each machine matching PRED in MACHINE-FILE." --=20 2.31.1 --=-=-=-- From unknown Sun Jun 15 08:50:01 2025 X-Loop: help-debbugs@gnu.org Subject: bug#41625: [PATCH v2] offload: Handle a possible EOF response from read-repl-response. Resent-From: Maxim Cournoyer Original-Sender: "Debbugs-submit" Resent-CC: bug-guix@gnu.org Resent-Date: Thu, 27 May 2021 17:21:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 41625 X-GNU-PR-Package: guix X-GNU-PR-Keywords: To: Ludovic =?UTF-8?Q?Court=C3=A8s?= Cc: 41625@debbugs.gnu.org, marius@gnu.org Received: via spool by 41625-submit@debbugs.gnu.org id=B41625.162213605322576 (code B ref 41625); Thu, 27 May 2021 17:21:01 +0000 Received: (at 41625) by debbugs.gnu.org; 27 May 2021 17:20:53 +0000 Received: from localhost ([127.0.0.1]:52714 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lmJgj-0005s4-FK for submit@debbugs.gnu.org; Thu, 27 May 2021 13:20:53 -0400 Received: from mail-qt1-f182.google.com ([209.85.160.182]:33583) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lmJgi-0005ro-5B for 41625@debbugs.gnu.org; Thu, 27 May 2021 13:20:52 -0400 Received: by mail-qt1-f182.google.com with SMTP id a15so807350qta.0 for <41625@debbugs.gnu.org>; Thu, 27 May 2021 10:20:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=CiImRcTe9FPSNZHoTgCiw8UvuUui7lvSuZi4QBiq9q0=; b=sVSeeJWpq+qcpDEI+IiW4TeD4IAn3MpaZFaS8hyPGgc7J+w30RHlqmEK5CaTHSdqFM RC/cxQfPQGN/PTbL/4Lb1F8GcfykdSAMAaKzkbK60gQ3AEdGGih1M3xhwK1O2dVovX3o GvdDVLKa8/mmf+TMK+gtemvV1G1kq9V00McdaJD3FjdDdye6ME6WepYxgld4B6bzBRIP yxSN39JpoM6rX+q4x23vOj5pgN+i3MqSNDyyNAW28YfgckRiFeSe28b+3MQ33SlGekbR aerCP/K80Uyis+caSVnkO0oxMIm72jBGLg4uQnDBr5II6Wk9uM6FuBrKH3QXrcqYObV3 QhvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=CiImRcTe9FPSNZHoTgCiw8UvuUui7lvSuZi4QBiq9q0=; b=KX1sHGKDfbn4hg5tBACUJ4stvT8U2to7+6pCvZ2pVzjfieYxcTNNfMQwWqt/xvgA2j FdE7NAQJCAUFgbySAmOSdh00/ZrRqlDlx0XHfCojwyMShQE2nc3ZEtomejbjdORH0XPU ku6n1O+XcX5JRAs/uvUfWyyweK3ua3Bl9M0b2WndDm6zpUUaEKPrQEqYgDFiIoeYMods cHprz9Mvb8HSvBXLUv7HxeMsyzcfwtiRg20Tov0ZNxO4qbW9fpqtwMPTywGu/VnC986u 4ThMZsdkOfwoEpSyCD6OertDr8xngTUDYIG9zib0C2VyLb+D5+sEBQaFpnxB4lorTLe0 vKnA== X-Gm-Message-State: AOAM533W+YKLsqUcyOUCgtU5RP58y6d39lDed5CjnSQL1qUJzjta0Hh0 mod0pGiO6k9YQjK8RnQvEuyBPmDBmVg= X-Google-Smtp-Source: ABdhPJysS3A9vfv0Bto7i/9loKlbmzPO9io9UKjf5pGXXed128rOG9qW9vG7udz8n0qCINAgogX6CQ== X-Received: by 2002:ac8:7104:: with SMTP id z4mr4077767qto.379.1622136046656; Thu, 27 May 2021 10:20:46 -0700 (PDT) Received: from hurd (dsl-152-121.b2b2c.ca. [66.158.152.121]) by smtp.gmail.com with ESMTPSA id 7sm1797757qkd.20.2021.05.27.10.20.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 May 2021 10:20:46 -0700 (PDT) From: Maxim Cournoyer References: <87mtsky9um.fsf@gmail.com> <20210525155003.27590-1-maxim.cournoyer@gmail.com> <875yz61rvt.fsf@gnu.org> <87mtsikwsm.fsf_-_@gmail.com> <87fsy9x3ev.fsf@gnu.org> Date: Thu, 27 May 2021 13:20:44 -0400 In-Reply-To: <87fsy9x3ev.fsf@gnu.org> ("Ludovic =?UTF-8?Q?Court=C3=A8s?="'s message of "Wed, 26 May 2021 11:14:32 +0200") Message-ID: <87mtsgjdoz.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain Hello again, My previous strace output didn't follow the 'clone' syscall; the one attached does. It's compressed with lzip. --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=sshd-strace.out.lz Content-Transfer-Encoding: base64 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 //1uK4mBY1jJQOkMAAAAAADxBQEAAAAAAA== --=-=-= Content-Type: text/plain Thanks! Maxim --=-=-=-- From unknown Sun Jun 15 08:50:01 2025 X-Loop: help-debbugs@gnu.org Subject: bug#41625: [PATCH v2] offload: Handle a possible EOF response from read-repl-response. Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= Original-Sender: "Debbugs-submit" Resent-CC: bug-guix@gnu.org Resent-Date: Sat, 29 May 2021 19:25:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 41625 X-GNU-PR-Package: guix X-GNU-PR-Keywords: To: Maxim Cournoyer Cc: 41625@debbugs.gnu.org, marius@gnu.org Received: via spool by 41625-submit@debbugs.gnu.org id=B41625.162231628627773 (code B ref 41625); Sat, 29 May 2021 19:25:02 +0000 Received: (at 41625) by debbugs.gnu.org; 29 May 2021 19:24:46 +0000 Received: from localhost ([127.0.0.1]:57733 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ln4Zh-0007Dt-Oh for submit@debbugs.gnu.org; Sat, 29 May 2021 15:24:46 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50304) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ln4Zf-0007De-Dq for 41625@debbugs.gnu.org; Sat, 29 May 2021 15:24:43 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:51454) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ln4Za-0006zq-8C; Sat, 29 May 2021 15:24:38 -0400 Received: from [2a01:e0a:1d:7270:af76:b9b:ca24:c465] (port=41074 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ln4ZZ-0000Xs-UR; Sat, 29 May 2021 15:24:38 -0400 From: Ludovic =?UTF-8?Q?Court=C3=A8s?= References: <87mtsky9um.fsf@gmail.com> <20210525155003.27590-1-maxim.cournoyer@gmail.com> <875yz61rvt.fsf@gnu.org> <87mtsikwsm.fsf_-_@gmail.com> <87fsy9x3ev.fsf@gnu.org> <87mtsgjdoz.fsf@gmail.com> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 10 Prairial an 229 de la =?UTF-8?Q?R=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Sat, 29 May 2021 21:24:36 +0200 In-Reply-To: <87mtsgjdoz.fsf@gmail.com> (Maxim Cournoyer's message of "Thu, 27 May 2021 13:20:44 -0400") Message-ID: <87tuml5onf.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -2.3 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) Hi Maxim, Maxim Cournoyer skribis: > My previous strace output didn't follow the 'clone' syscall; the one > attached does. It's compressed with lzip. --8<---------------cut here---------------start------------->8--- 11457 sendto(3, "<86>May 27 19:03:45 sshd[11457]: pam_unix(sshd:session): s= ession opened for user maxim by (uid=3D0)", 97, MSG_NOSIGNAL, NULL, 0) =3D = 97 11457 socketpair(AF_UNIX, SOCK_STREAM, 0, [5, 7]) =3D 0 11457 fcntl(5, F_SETFD, FD_CLOEXEC) =3D 0 11457 fcntl(7, F_SETFD, FD_CLOEXEC) =3D 0 11457 clone(child_stack=3DNULL, flags=3DCLONE_CHILD_CLEARTID|CLONE_CHILD_SE= TTID|SIGCHLD 11459 set_robust_list(0xffff9d2e10f0, 24 11457 <... clone resumed>, child_tidptr=3D0xffff9d2e10e0) =3D 11459 [=E2=80=A6] 11459 clone(child_stack=3DNULL, flags=3DCLONE_CHILD_CLEARTID|CLONE_CHILD_SE= TTID|SIGCHLD 11460 set_robust_list(0xffff9d2e10f0, 24 11459 <... clone resumed>, child_tidptr=3D0xffff9d2e10e0) =3D 11460 [=E2=80=A6] 11460 execve("/gnu/store/6b5gnpnbi73l0pasan0fip4w3f1afizi-bash-5.0.16/bin/b= ash", ["bash", "-c", "guix repl -t machine"], 0xaaaacfb78470 /* 16 vars */)= =3D 0 [=E2=80=A6] 11460 <... read resumed>"(use-modules (gnu))\n", 4096) =3D 20 [=E2=80=A6] 11459 read(4, "", 16384) =3D 0 11459 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) =3D 0 11459 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) =3D 0 11459 close(11) =3D 0 11459 close(10) =3D 0 11459 close(13) =3D 0 11459 close(4) =3D 0 11459 brk(0xaaaacfba7000) =3D 0xaaaacfba7000 11459 write(5, "\0\0\0\0012", 5) =3D 5 11457 <... ppoll resumed>) =3D 1 ([{fd=3D7, revents=3DPOLLIN}]) 11459 exit_group(0 [=E2=80=A6] 11457 sendto(3, "<86>May 27 19:04:08 sshd[11457]: pam_unix(sshd:session): s= ession closed for user maxim", 86, MSG_NOSIGNAL, NULL, 0) =3D 86 [=E2=80=A6] 11460 openat(AT_FDCWD, "/gnu/store/83vzpl9pl5v86ncb8jy2gbfgsac0amjv-guix-mo= dule-union/lib/guile/3.0/site-ccache/gnu/packages/mtools.go", O_RDONLY|O_CL= OEXEC) =3D 14 11460 lseek(14, 0, SEEK_END) =3D 72707 11460 mmap(NULL, 72707, PROT_READ, MAP_PRIVATE, 14, 0) =3D 0xffff90194000 11460 close(14) =3D 0 11460 mprotect(0xffff901a4000, 3432, PROT_READ|PROT_WRITE) =3D 0 11460 newfstatat(AT_FDCWD, "/gnu/store/83vzpl9pl5v86ncb8jy2gbfgsac0amjv-gui= x-module-union/share/guile/site/3.0/gnu/packages/patches/u-boot-rockchip-in= no-usb.patch", {st_mode=3DS_IFREG|0444, st_size=3D10450, ...}, 0) =3D 0 11460 write(1, "(values (non-self-quoting 2052 \"#\"))\n", 50)= =3D -1 EPIPE (Broken pipe) 11460 --- SIGPIPE {si_signo=3DSIGPIPE, si_code=3DSI_USER, si_pid=3D11460, s= i_uid=3D30013} --- --8<---------------cut here---------------end--------------->8--- (=E2=80=98guix repl=E2=80=99 is PID 11460.) It looks like the SSH session gets closed while =E2=80=98guix repl=E2=80=99= is still running, and thus the client never sees the reply from =E2=80=98guix repl= =E2=80=99 (=E2=80=98guix repl=E2=80=99 itself eventually gets EPIPE because its paren= t process terminated and there=E2=80=99s no one listening to it.) So the bug may be on the client side, in =E2=80=98guix offload=E2=80=99, wh= ich for some reason drops the session too early. Can you enable libssh debugging there, reproduce the problem, and share the libssh debug info from that run? Do enable libssh debugging, you can drop something like this in (guix scripts offload) for instance: (use-modules (ssh log)) (set-log-verbosity! 'protocol) The available logging levels, from Guile-SSH=E2=80=99s log.c, are: --8<---------------cut here---------------start------------->8--- struct symbol_mapping log_verbosity[] =3D { /* 0, No logging at all */ { "nolog", SSH_LOG_NOLOG }, /* 1, Only rare and noteworthy events */ { "rare", SSH_LOG_RARE }, /* 2, High level protocol information */ { "protocol", SSH_LOG_PROTOCOL }, /* 3, Lower level protocol infomations, packet level */ { "packet", SSH_LOG_PACKET }, /* 4, Every function path */ { "functions", SSH_LOG_FUNCTIONS }, { NULL, -1 } }; --8<---------------cut here---------------end--------------->8--- HTH! Ludo=E2=80=99. From unknown Sun Jun 15 08:50:01 2025 X-Loop: help-debbugs@gnu.org Subject: bug#41625: Sporadic guix-offload crashes due to EOF errors Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= Original-Sender: "Debbugs-submit" Resent-CC: bug-guix@gnu.org Resent-Date: Mon, 05 Jul 2021 08:58:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 41625 X-GNU-PR-Package: guix X-GNU-PR-Keywords: To: Maxim Cournoyer Cc: 41625@debbugs.gnu.org, marius@gnu.org Received: via spool by 41625-submit@debbugs.gnu.org id=B41625.162547544624856 (code B ref 41625); Mon, 05 Jul 2021 08:58:01 +0000 Received: (at 41625) by debbugs.gnu.org; 5 Jul 2021 08:57:26 +0000 Received: from localhost ([127.0.0.1]:43907 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1m0KPu-0006Sq-44 for submit@debbugs.gnu.org; Mon, 05 Jul 2021 04:57:26 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52916) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1m0KPt-0006Sf-4V for 41625@debbugs.gnu.org; Mon, 05 Jul 2021 04:57:25 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:58810) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1m0KPn-0001lN-Q5; Mon, 05 Jul 2021 04:57:19 -0400 Received: from [2a01:e0a:1d:7270:af76:b9b:ca24:c465] (port=42646 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1m0KPm-0006UI-EA; Mon, 05 Jul 2021 04:57:19 -0400 From: Ludovic =?UTF-8?Q?Court=C3=A8s?= References: <87mtsky9um.fsf@gmail.com> <20210525155003.27590-1-maxim.cournoyer@gmail.com> <875yz61rvt.fsf@gnu.org> <87mtsikwsm.fsf_-_@gmail.com> <87fsy9x3ev.fsf@gnu.org> <87r1hsjkbv.fsf_-_@gmail.com> Date: Mon, 05 Jul 2021 10:57:07 +0200 In-Reply-To: <87r1hsjkbv.fsf_-_@gmail.com> (Maxim Cournoyer's message of "Thu, 27 May 2021 10:57:24 -0400") Message-ID: <878s2lw330.fsf_-_@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -2.3 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) Hi, Maxim Cournoyer skribis: > Now that I have root access to overdrive1, I could strace the sshd > process (I just did 'strace -p340', noting the process of sshd displayed > with 'herd status sshd'): > > pselect6(87, [3 4], NULL, NULL, NULL, NULL) =3D 1 (in [3]) > accept(3, {sa_family=3DAF_INET, sin_port=3Dhtons(33262), sin_addr=3Dinet_= addr("66.158.152.121")}, [128->16]) =3D 5 > fcntl(5, F_GETFL) =3D 0x2 (flags O_RDWR) > pipe2([6, 7], 0) =3D 0 > socketpair(AF_UNIX, SOCK_STREAM, 0, [8, 9]) =3D 0 > clone(child_stack=3DNULL, flags=3DCLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID= |SIGCHLD, child_tidptr=3D0xffff8e0ef0e0) =3D 644 > close(7) =3D 0 > close(9) =3D 0 > write(8, "\0\0\1\245\0", 5) =3D 5 > write(8, "\0\0\1\234\nPort 22\nPermitRootLogin no\n"..., 420) =3D 420 > close(8) =3D 0 > close(5) =3D 0 > getpid() =3D 340 > getpid() =3D 340 > getpid() =3D 340 > getpid() =3D 340 > getpid() =3D 340 > getpid() =3D 340 > getpid() =3D 340 > pselect6(87, [3 4 6], NULL, NULL, NULL, NULL) =3D 1 (in [6]) > read(6, "\0", 1) =3D 1 > pselect6(87, [3 4 6], NULL, NULL, NULL, NULL) =3D 1 (in [6]) > read(6, "", 1) =3D 0 OK, so it looks as if the client disconnected right away. Hard to tell exactly what that happened. :-/ Perhaps turning libssh debugging on on the client side could help (by uncommenting =E2=80=9C#:log-verbosity 'proto= col=E2=80=9D in (guix ssh)). >>>From c7b2ec1c58adf8c795df0a6aaf075dbc331f41e8 Mon Sep 17 00:00:00 2001 > From: Maxim Cournoyer > Date: Thu, 27 May 2021 08:44:44 -0400 > Subject: [PATCH 1/2] offload: Parallelize machine check in offload test. > > * guix/scripts/offload.scm (check-machine-availability): Refactor so that= it > takes a single machine object. Ensure the cleanup code is always run. > (check-machines-availability): New procedure. Call > CHECK-MACHINES-AVAILABILITY in parallel, which improves performance (about > twice as fast with 4 build machines, from ~30 s to ~15 s). I remain wary of this change, because that could lead to subtle non-deterministic bugs (of the kind that keeps you busy for weeks) and because I personally don=E2=80=99t mind if =E2=80=98guix offload test=E2=80= =99 takes 30s on berlin, and because the intermingled output may make diagnostics less clear. >>>From b5558777617e4674a150895458d57d202de56120 Mon Sep 17 00:00:00 2001 > From: Maxim Cournoyer > Date: Tue, 25 May 2021 08:42:06 -0400 > Subject: [PATCH 2/2] offload: Handle a possible EOF response from > read-repl-response. > > Partially fixes . > > * guix/scripts/offload.scm (check-machine-availability): Handle the case = where > the checks raised an exception due to receiving EOF prematurely, and retr= y up > to 3 times. > * guix/inferior.scm (&inferior-premature-eof): New condition type. > (read-repl-response): Raise a condition of the above type when reading EOF > from the build machine's port. LGTM! Thanks, Ludo=E2=80=99. From unknown Sun Jun 15 08:50:01 2025 X-Loop: help-debbugs@gnu.org Subject: bug#41625: Sporadic guix-offload crashes due to EOF errors Resent-From: Maxim Cournoyer Original-Sender: "Debbugs-submit" Resent-CC: bug-guix@gnu.org Resent-Date: Fri, 24 Sep 2021 04:54:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 41625 X-GNU-PR-Package: guix X-GNU-PR-Keywords: To: Ludovic =?UTF-8?Q?Court=C3=A8s?= Cc: 41625@debbugs.gnu.org, marius@gnu.org Received: via spool by 41625-submit@debbugs.gnu.org id=B41625.163245922424361 (code B ref 41625); Fri, 24 Sep 2021 04:54:02 +0000 Received: (at 41625) by debbugs.gnu.org; 24 Sep 2021 04:53:44 +0000 Received: from localhost ([127.0.0.1]:56433 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mTdDT-0006Kr-Rk for submit@debbugs.gnu.org; Fri, 24 Sep 2021 00:53:44 -0400 Received: from mail-qt1-f171.google.com ([209.85.160.171]:40600) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mTdDS-0006Kd-1M for 41625@debbugs.gnu.org; Fri, 24 Sep 2021 00:53:43 -0400 Received: by mail-qt1-f171.google.com with SMTP id t13so2524108qtc.7 for <41625@debbugs.gnu.org>; Thu, 23 Sep 2021 21:53:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version:content-transfer-encoding; bh=rAXIGNNLVkyF2wSEqFECNIbURW2lEr/2pPb09+CicnM=; b=LSpsXiS1Ty5v3Lm0KayuFS2OkCKp8rVS2rNwU+cKaczxZ8372RYWhfcAHHC15ydDya E9xhp4iHGKRi819MbfT6V2IWG5I6yj03BAgQEiF9Wte7UTStqmXtrziAR0jRdh7l8g9k Ynv4/c1dhJP0i52bDOW2N1PeB/hMeWkiWD7zXfJ7qFPWq2F28By/GDJe+51UeOSpUbHw GwJeOr8quzemlQ52UUD6lshYkrjePKeAS/3UaDXkpFj5Ik+IvaxypXO6Pb62YCoktyZ1 8v/Vg4HGX8ptkOR23rWCyVc+chzTINwrxStoh8c4rML4qq2zRTJifWZlGgv47u65X1Yf QGuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version:content-transfer-encoding; bh=rAXIGNNLVkyF2wSEqFECNIbURW2lEr/2pPb09+CicnM=; b=Tp3mIUpjQ/IVy0kVItV8irjQlhkXp2AWFGMT3FusPiAaTcWR2a+TbhGy0t6nFwPqlm wMFn+N5EWemjxY0C7uoAHEBh1PrryjeNZY/iddp4hxVaY4ibCBWm1NNMg59q5yLQCK+h oRBz240Wpt1Nw/GplShj5kuMv1K/G2poYMRkpZ3ci7bt7F2AMsgBFuUHFwR3q3VE9f6B jIC5Q7D7Ohf6bro11Tk6CX9yH2yl5Koz0KM9TNhJIBcdsaQTgLRV/h0k2c0B/f65qwAJ z1j8eC6dAb44i4WzrZGpECAN5Y0NKgnvO8hfRnSvmG64HIM0+ZcgC7quxUMGQ6GpVHuD 0EvA== X-Gm-Message-State: AOAM5313m0FUR1UZb3cxHs4fi6L2ez+LzxsxQx1YXX0MOfD2dsu+BsIz 2XimQQYBxvd0zP/lOTWxqmK43sKt6CA= X-Google-Smtp-Source: ABdhPJxRm+wZv/qja6Hnud4E+vIrspRA6odw4V/k4mjl6xz3pXJgfnYBp6OqcJMU7U9pfo8jHUaKPg== X-Received: by 2002:a05:622a:178b:: with SMTP id s11mr2409208qtk.13.1632459216365; Thu, 23 Sep 2021 21:53:36 -0700 (PDT) Received: from hurd (dsl-10-149-91.b2b2c.ca. [72.10.149.91]) by smtp.gmail.com with ESMTPSA id f13sm4808886qto.63.2021.09.23.21.53.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Sep 2021 21:53:27 -0700 (PDT) From: Maxim Cournoyer References: <87mtsky9um.fsf@gmail.com> <20210525155003.27590-1-maxim.cournoyer@gmail.com> <875yz61rvt.fsf@gnu.org> <87mtsikwsm.fsf_-_@gmail.com> <87fsy9x3ev.fsf@gnu.org> <87r1hsjkbv.fsf_-_@gmail.com> <878s2lw330.fsf_-_@gnu.org> Date: Fri, 24 Sep 2021 00:53:22 -0400 In-Reply-To: <878s2lw330.fsf_-_@gnu.org> ("Ludovic =?UTF-8?Q?Court=C3=A8s?="'s message of "Mon, 05 Jul 2021 10:57:07 +0200") Message-ID: <87czoyk20t.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Hello! Ludovic Court=C3=A8s writes: > Hi, > > Maxim Cournoyer skribis: > >> Now that I have root access to overdrive1, I could strace the sshd >> process (I just did 'strace -p340', noting the process of sshd displayed >> with 'herd status sshd'): >> >> pselect6(87, [3 4], NULL, NULL, NULL, NULL) =3D 1 (in [3]) >> accept(3, {sa_family=3DAF_INET, sin_port=3Dhtons(33262), sin_addr=3Dinet= _addr("66.158.152.121")}, [128->16]) =3D 5 >> fcntl(5, F_GETFL) =3D 0x2 (flags O_RDWR) >> pipe2([6, 7], 0) =3D 0 >> socketpair(AF_UNIX, SOCK_STREAM, 0, [8, 9]) =3D 0 >> clone(child_stack=3DNULL, flags=3DCLONE_CHILD_CLEARTID|CLONE_CHILD_SETTI= D|SIGCHLD, child_tidptr=3D0xffff8e0ef0e0) =3D 644 >> close(7) =3D 0 >> close(9) =3D 0 >> write(8, "\0\0\1\245\0", 5) =3D 5 >> write(8, "\0\0\1\234\nPort 22\nPermitRootLogin no\n"..., 420) =3D 420 >> close(8) =3D 0 >> close(5) =3D 0 >> getpid() =3D 340 >> getpid() =3D 340 >> getpid() =3D 340 >> getpid() =3D 340 >> getpid() =3D 340 >> getpid() =3D 340 >> getpid() =3D 340 >> pselect6(87, [3 4 6], NULL, NULL, NULL, NULL) =3D 1 (in [6]) >> read(6, "\0", 1) =3D 1 >> pselect6(87, [3 4 6], NULL, NULL, NULL, NULL) =3D 1 (in [6]) >> read(6, "", 1) =3D 0 > > OK, so it looks as if the client disconnected right away. Hard to tell > exactly what that happened. :-/ Perhaps turning libssh debugging on on > the client side could help (by uncommenting =E2=80=9C#:log-verbosity 'pro= tocol=E2=80=9D > in (guix ssh)). I was able to better understand the problem after encountering it on another low power ARM board. It's about the guile-ssh/libssh timeout causing a channel read to return EOF. I have one example here where it hangs at the (inferior-eval '(use-modules (gnu)) result)' step; Guix runs for about 1m30s, apparently loading all the package modules. Perhaps my GUILE_COMPILED_PATH is not set correctly and things are slower than expected. Not sure. But what happens is that there's no output in the 15 s timeout that we set for the SSH session elapses, and libssh's ssh_channel_read returns 0, which is the same value it returns when it encounters EOF. Guile's peek_byte_or_eof turn that zero into an EOF. I've shared my analysis on the guile-ssh bug tracker [0] So information is lost at libssh's level, which is not so nice. Knowing exactly how that EOF come into the picture, we can handle it and produce better diagnostic though. I'll try reworking my original patch in that direction. Thanks, Maxim [0] https://github.com/artyom-poptsov/guile-ssh/issues/29 From unknown Sun Jun 15 08:50:01 2025 X-Loop: help-debbugs@gnu.org Subject: bug#41625: Sporadic guix-offload crashes due to EOF errors Resent-From: Maxim Cournoyer Original-Sender: "Debbugs-submit" Resent-CC: bug-guix@gnu.org Resent-Date: Fri, 24 Sep 2021 04:56:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 41625 X-GNU-PR-Package: guix X-GNU-PR-Keywords: To: Ludovic =?UTF-8?Q?Court=C3=A8s?= Cc: 41625@debbugs.gnu.org, marius@gnu.org Received: via spool by 41625-submit@debbugs.gnu.org id=B41625.163245933924574 (code B ref 41625); Fri, 24 Sep 2021 04:56:01 +0000 Received: (at 41625) by debbugs.gnu.org; 24 Sep 2021 04:55:39 +0000 Received: from localhost ([127.0.0.1]:56437 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mTdFL-0006OH-9x for submit@debbugs.gnu.org; Fri, 24 Sep 2021 00:55:39 -0400 Received: from mail-qt1-f181.google.com ([209.85.160.181]:47009) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mTdFJ-0006O0-Ct for 41625@debbugs.gnu.org; Fri, 24 Sep 2021 00:55:37 -0400 Received: by mail-qt1-f181.google.com with SMTP id e16so8320732qte.13 for <41625@debbugs.gnu.org>; Thu, 23 Sep 2021 21:55:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=oBtVOpCgR3ohhXcPmqxErEsP2nstBie2IJHykElJg0Q=; b=pRxYodCiJveMC7h9gHjJNCanad1Y0NCqmfSS5LUh4y8mpG9d266lp0kNi86RxHOKTE yerru+uD03UUZeOOFA1WuVRvNcyuA9QUmN7dmFaGD4f56eCNyoDU8IikwAir3hFvWWJH NPqFDIY2SsY3i9WhWnI7cI2/4VlRiY6t4pqOkIUzP5bx5PmK6NxQvX/nndc7OiJimJAn YEmGGRooulEoIcwt9+XZLZ+OcYwFXkVIQ23f8vq9dWn0KCrF+mrWLWS3F/YI6/8LuYiZ QbKl1P/TrLR4i47Kw9mKZxWUMOvP0ZyJ3Sl9+XCrul6yvmxOaad5EEHOeTZE6Y3Q6Gf4 6j7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=oBtVOpCgR3ohhXcPmqxErEsP2nstBie2IJHykElJg0Q=; b=NQCTumt3oy1JvxWsKLA7XPEoDvzivFAAQvxN8Z2wAVHkE32WXJi5JAwLOBkqR+Reb3 GJ2rEI6+6apmdSwcRD8KdCasC1YbTPKND8zWfjAYG7mNDoMvHEuXnJ/Olp/xIqfW+fYn cuqSwo8lygr1ZDPzj5ejf8DpS6B24Q3xnXJOcUJLJ25ylGfgJ/K6XMhLjFePka00POyS DK9xf+g79T3AH28KOpGcLrI+xv/8hB04ml6K/nm4qVlEE7H8IZRLSBlgIF09cu2BsuN1 VFX6MiOK3617M69MAF1uYVmKX//XpGXiN3qsFdIPgFGJ/bmESRCDyi4ffTIu7qL73weE iQ1g== X-Gm-Message-State: AOAM533EmFCg5H1WwM3SIwgf9ra6QOa9C6DCOejsCjV9uY9FMBxYPohD J8IEzmdAfQno9jdKGyXyklA= X-Google-Smtp-Source: ABdhPJzTibbXOZls+Jhdd6vnS0H6i5CLcwvrPgmVVU81p8iI4zXtbHWstwQrFGeMQ9VIJypi70gxGQ== X-Received: by 2002:ac8:4243:: with SMTP id r3mr2335196qtm.187.1632459331916; Thu, 23 Sep 2021 21:55:31 -0700 (PDT) Received: from hurd (dsl-10-149-91.b2b2c.ca. [72.10.149.91]) by smtp.gmail.com with ESMTPSA id l13sm5806942qkj.130.2021.09.23.21.55.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Sep 2021 21:55:31 -0700 (PDT) From: Maxim Cournoyer References: <87mtsky9um.fsf@gmail.com> <20210525155003.27590-1-maxim.cournoyer@gmail.com> <875yz61rvt.fsf@gnu.org> <87mtsikwsm.fsf_-_@gmail.com> <87fsy9x3ev.fsf@gnu.org> <87r1hsjkbv.fsf_-_@gmail.com> <878s2lw330.fsf_-_@gnu.org> Date: Fri, 24 Sep 2021 00:55:30 -0400 In-Reply-To: <878s2lw330.fsf_-_@gnu.org> ("Ludovic =?UTF-8?Q?Court=C3=A8s?="'s message of "Mon, 05 Jul 2021 10:57:07 +0200") Message-ID: <878rzmk1x9.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Oh, and for completion, here's a reproducer I used here to debug with my low power offload machine: --8<---------------cut here---------------start------------->8--- x(use-modules (guix scripts offload) (guix inferior) ((guix ssh) #:hide (open-ssh-session)) (ice-9 match) (ssh popen)) (define machine (build-machine (name "tm") (port 22) (user "root") (systems (list "armhf-linux")) ;; ecdsa-sha2-nistp256 (host-key "ssh-ecdsa-p256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBIx32IqtlUr2VMypLItGSnmKzd0eJkgnzPkVbOZbn4HFQD5KvWB98t4IkT0PESjs+DDQfI/PwRENo3yqd5GjukA=") (parallel-builds 2) (compression "none") (private-key "/home/maxim/.ssh/id_rsa.1"))) (define open-ssh-session (@@ (guix scripts offload) open-ssh-session)) (define session (open-ssh-session machine 15)) (define repl-command '("guix" "repl" "-t" "machine")) (define pipe (apply open-remote-pipe* session OPEN_BOTH repl-command)) ;;; Hangs ;;;(port->inferior pipe) (define rest (match (read pipe) (('repl-version 0 rest ...) rest))) (define %inferior-packages (@@ (guix inferior) %inferior-packages)) (define %inferior-package-table (@@ (guix inferior) %inferior-package-table)) (define inferior (@@ (guix inferior) inferior)) (define inferior-socket (@@ (guix inferior) inferior-socket)) (define result (inferior 'pipe pipe close (cons 0 rest) (delay (%inferior-packages result)) (delay (%inferior-package-table result)))) (define send-inferior-request (@@ (guix inferior) send-inferior-request)) (send-inferior-request '(() repl-version 0 1 1) result) (inferior-eval '(use-modules (guix)) result) ;;; Hangs! ;;t(inferior-eval '(use-modules (gnu)) result) (send-inferior-request '(use-modules (gnu)) result) (define socket (inferior-socket result)) ;;Throw to key `match-error' with args `("match" "no matching pattern" #)' ;;(read-repl-response socket result) ;; -> guix using 100% cpu, reading package modules for ~ 1m30s ;;; guile-ssh returns on timeout? (15 s) -> yes (read socket) --8<---------------cut here---------------end--------------->8--- I wish the Guile debugger was more capable; it'd have spared me the above manual labor :-) Maxim From unknown Sun Jun 15 08:50:01 2025 MIME-Version: 1.0 X-Mailer: MIME-tools 5.505 (Entity 5.505) X-Loop: help-debbugs@gnu.org From: help-debbugs@gnu.org (GNU bug Tracking System) To: Marius Bakke Subject: bug#41625: closed (Re: bug#41625: Sporadic guix-offload crashes due to EOF errors) Message-ID: References: <87v8w1wbiu.fsf_-_@gmail.com> <87mu5owhxh.fsf@gnu.org> X-Gnu-PR-Message: they-closed 41625 X-Gnu-PR-Package: guix Reply-To: 41625@debbugs.gnu.org Date: Sat, 26 Mar 2022 05:04:01 +0000 Content-Type: multipart/mixed; boundary="----------=_1648271041-27817-1" This is a multi-part message in MIME format... ------------=_1648271041-27817-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Your bug report #41625: Sporadic guix-offload crashes due to EOF errors which was filed against the guix package, has been closed. The explanation is attached below, along with your original report. If you require more details, please reply to 41625@debbugs.gnu.org. --=20 41625: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D41625 GNU Bug Tracking System Contact help-debbugs@gnu.org with problems ------------=_1648271041-27817-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at 41625-done) by debbugs.gnu.org; 26 Mar 2022 05:03:47 +0000 Received: from localhost ([127.0.0.1]:52884 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nXyaZ-0007E4-1l for submit@debbugs.gnu.org; Sat, 26 Mar 2022 01:03:47 -0400 Received: from mail-qk1-f169.google.com ([209.85.222.169]:42938) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nXyaX-0007Ds-LX for 41625-done@debbugs.gnu.org; Sat, 26 Mar 2022 01:03:46 -0400 Received: by mail-qk1-f169.google.com with SMTP id 85so7487541qkm.9 for <41625-done@debbugs.gnu.org>; Fri, 25 Mar 2022 22:03:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version:content-transfer-encoding; bh=pHO6jH2C7oqrLV1AtTFrjGKXnc1yPPHEtyMNvxVvaQo=; b=GGk0tanmPQmq7F7TfUloRQGcZ0N+uv6Vgob7CF+UGx5dri7hVM7QOmgMjhYkUy1S+v LWvwh27+eiiVsYK8491qK9DGZQ7m+wI3jluMo1jiJ4GXLp6muOlrR2T592JQQ9js9lfB /F5FdXaiiN8STt/TSiAC6I06zN2wfJvgCjwKNhP7gQc/AarG72/IsVg2NqqQtpLwo5Mu LM3Q1pxQMvRkSs4nn+aKOpl3s9p4VkopILrTPcL2C4bmcRl8c4AHSS5MvyeAaHOJ18gl N2m1pXHFTmkHJ9liDhbNonXcPSKY6xA2iHzKWAxyAsi08F82Buq9EngrK8txGgkR3Gyc 2Ysg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version:content-transfer-encoding; bh=pHO6jH2C7oqrLV1AtTFrjGKXnc1yPPHEtyMNvxVvaQo=; b=vRY8PpJ0PvN/AROl291ICTn3iKcboqVjExf6efM+3Qn0mxphRnT62lbMUJzxxklU89 HOmVYRDiil40/VZpfItnPHAZkeeN3EI0RempGQbKFcErv7YoBksZMSt9e/Jq9rlZc+D0 MPTo6cokPs6Ekv8A4IQ/ZKREkGv5ZYGuHnq9OSktXjTcxy9+a1Zr3uXGHlb9bpELnh/n rsA3Z5L2e+0e8sQ9EmDtEQ/LtDFrQHhCzh9zdqfvcDxQqUxLzZNKkPV89d2NjEc07muE j22qUH/NiDrBIDq+ewKLtIB97kYYrOQ5ZEBEBiFfC2+4WFNxbQqwFqru/u4tKetM7txA kU5g== X-Gm-Message-State: AOAM531G8KHQA7hFSc/OhPJZWRvBh5V/ZiiyavLzTSlqS+DO3Non68bI eKZjikP4QWQibjtHM5doQYEBDc8U1Ns= X-Google-Smtp-Source: ABdhPJwN+zn0NcBXzi53pOvppV9uapWLMCFlnbt3iwlda4fESbeVJZZumVCB03nYTtXphK/QXikNew== X-Received: by 2002:a05:620a:4706:b0:67d:a135:c912 with SMTP id bs6-20020a05620a470600b0067da135c912mr9549346qkb.344.1648271020037; Fri, 25 Mar 2022 22:03:40 -0700 (PDT) Received: from hurd (dsl-157-48.b2b2c.ca. [66.158.157.48]) by smtp.gmail.com with ESMTPSA id bm21-20020a05620a199500b0067d5e6c7bd8sm4487234qkb.56.2022.03.25.22.03.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 22:03:39 -0700 (PDT) From: Maxim Cournoyer To: Marius Bakke Subject: Re: bug#41625: Sporadic guix-offload crashes due to EOF errors References: <87mtsky9um.fsf@gmail.com> <20210525155003.27590-1-maxim.cournoyer@gmail.com> <875yz61rvt.fsf@gnu.org> <87mtsikwsm.fsf_-_@gmail.com> <87h7ipa433.fsf@gnu.org> <8735u8l7iy.fsf@gmail.com> Date: Sat, 26 Mar 2022 01:03:37 -0400 In-Reply-To: <8735u8l7iy.fsf@gmail.com> (Maxim Cournoyer's message of "Thu, 27 May 2021 07:51:01 -0400") Message-ID: <87v8w1wbiu.fsf_-_@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 41625-done Cc: Ludovic =?utf-8?Q?Court=C3=A8s?= , 41625-done@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Hello, Maxim Cournoyer writes: > Hi Marius, > > Marius Bakke writes: > >> Maxim Cournoyer skriver: >> >>>> Is running =E2=80=98guix offload test /etc/guix/machines.scm overdrive= 1=E2=80=99 on >>>> berlin enough to reproduce the issue? If so, we could monitor/strace >>>> sshd on overdrive1 to get a better understanding of what=E2=80=99s goi= ng on. >>> >>> It's actually difficult to trigger it; it seems to happen mostly on the >>> first try after a long time without connecting to the machine; on the >>> 2nd and later tries, everything is smooth. Waiting a few minutes is not >>> enough to re-trigger the problem. >>> >>> I've managed to see the problem a few lucky times with: >>> >>> --8<---------------cut here---------------start------------->8--- >>> while true; do guix offload test /etc/guix/machines.scm overdrive1; done >>> --8<---------------cut here---------------end--------------->8--- >> >> I used to be able to reproduce it by inducing a high load on the target >> machine and just let Guix keep trying to connect. But now I did that, >> and set overload threshold to 0.0 for good measure, and Guix has been >> waiting patiently for two hours without failure. >> >> So AFAICT this bug has been fixed. Perhaps Berlin or the Overdrive >> simply needs to be updated? > > Ah! Do you have root access to overdrive1? It'd be interesting to > reconfigure it to update the guix-daemon and see if the problem > vanishes. Good news, this seems resolved with the newer Guile-SSH 0.15.1, where long delays to return some output no longer triggers an EOF response (instead now the client waits still). I believe it was fixed by this commit [0]. Many thanks to Artyom Poptsov for fixing it! Closing. Maxim [0] https://github.com/artyom-poptsov/guile-ssh/commit/fefaab9e925d015b01a= bc7c76ea4017c373ad895 ------------=_1648271041-27817-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at submit) by debbugs.gnu.org; 31 May 2020 09:52:00 +0000 Received: from localhost ([127.0.0.1]:59782 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jfKdL-0003ub-My for submit@debbugs.gnu.org; Sun, 31 May 2020 05:51:59 -0400 Received: from lists.gnu.org ([209.51.188.17]:42984) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jfKdK-0003uU-H4 for submit@debbugs.gnu.org; Sun, 31 May 2020 05:51:58 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46916) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jfKdK-00082P-8V for bug-guix@gnu.org; Sun, 31 May 2020 05:51:58 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:52884) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jfKdK-0006P9-0H for bug-guix@gnu.org; Sun, 31 May 2020 05:51:58 -0400 Received: from ti0006q161-2604.bb.online.no ([84.202.68.75]:47896 helo=localhost) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1jfKdJ-0005Ma-CQ for bug-guix@gnu.org; Sun, 31 May 2020 05:51:57 -0400 From: Marius Bakke To: bug-guix@gnu.org Subject: Sporadic guix-offload crashes due to EOF errors Date: Sun, 31 May 2020 11:51:54 +0200 Message-ID: <87mu5owhxh.fsf@gnu.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello, During 'guix build -s aarch64-linux dolphin' on Berlin, I got this crash: =2D-8<---------------cut here---------------start------------->8--- building /gnu/store/87655bh9rqcr29qasl1c4yj3skmxkyiz-kfilemetadata-5.70.0.d= rv... process 12989 acquired build slot '/var/guix/offload/overdrive1.guixsd.org:= 52522/1' process 12989 acquired build slot '/var/guix/offload/dover.guix.info:9023/1' process 12989 acquired build slot '/var/guix/offload/141.80.167.167:22/0' process 12989 acquired build slot '/var/guix/offload/141.80.167.163:22/0' process 12989 acquired build slot '/var/guix/offload/localhost:2223/1' process 12989 acquired build slot '/var/guix/offload/141.80.167.168:22/0' process 12989 acquired build slot '/var/guix/offload/141.80.167.173:22/0' process 12989 acquired build slot '/var/guix/offload/141.80.167.176:22/0' process 12989 acquired build slot '/var/guix/offload/localhost:2222/0' process 12989 acquired build slot '/var/guix/offload/141.80.167.165:22/0' process 12989 acquired build slot '/var/guix/offload/141.80.167.169:22/0' process 12989 acquired build slot '/var/guix/offload/141.80.167.181:22/0' process 12989 acquired build slot '/var/guix/offload/141.80.167.170:22/0' process 12989 acquired build slot '/var/guix/offload/141.80.167.174:22/0' process 12989 acquired build slot '/var/guix/offload/141.80.167.180:22/0' process 12989 acquired build slot '/var/guix/offload/141.80.167.161:22/0' Backtrace: In ice-9/boot-9.scm: 1736:10 5 (with-exception-handler _ _ #:unwind? _ # _) In unknown file: 4 (apply-smob/0 #) In ice-9/boot-9.scm: 718:2 3 (call-with-prompt _ _ #) In ice-9/eval.scm: 619:8 2 (_ #(#(#))) In guix/ui.scm: 1936:12 1 (run-guix-command _ . _) In guix/scripts/offload.scm: 742:22 0 (guix-offload . _) guix/scripts/offload.scm:742:22: In procedure guix-offload: Throw to key `match-error' with args `("match" "no matching pattern" #= )'. guix build: error: unexpected EOF reading a line =2D-8<---------------cut here---------------end--------------->8--- Which is strange because guix/scripts/offload.scm:742 is wrapped in a (unless (eof-object? ...)) block. When this happens, the build command terminates, along with any other builds that it had started concurrently. Builds from other clients were unaffected, of course. I have also seen this occur on my personal offloading setup once every blue moon, but don't know what could have caused it. --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCgAdFiEEu7At3yzq9qgNHeZDoqBt8qM6VPoFAl7TfjoACgkQoqBt8qM6 VPokIQf+Lt6//6tAzD0+oGyAhc15p4LAqqkW5/lxQb/6nluNcifbjN/SSCgeFTzu k/Lti/6HEbjOqrUORtw9Yl50B3/5Is/qzuqFtmf7i++47r6QN2+dlwwK4vfePylc qy8caALlHDvC7rqrpVFq3MxStuW7QXBe/+jSjSORAh1KVh8TKHnhkdkRaazyZOP8 oIl879u7txA9a1wqtkmgjX49QqkXrTZV8QK4PBCW+hiqobgIcxqDr9l21GMEWRYw ssIxH0RphQlMrvhg2TPQhY2guNeLVy2eKwtr3VYe51RKWZTkoQ+ntQfOylltoypP QRJFs59QUW85DzbybcV+9I5Monr6Og== =iT+K -----END PGP SIGNATURE----- --=-=-=-- ------------=_1648271041-27817-1--