From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp2 ([2001:41d0:2:c151::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms11 with LMTPS id sb/2A+iWVmBmMgAA0tVLHw (envelope-from ) for ; Sun, 21 Mar 2021 00:44:24 +0000 Received: from aspmx2.migadu.com ([2001:41d0:2:c151::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp2 with LMTPS id 6EjGOueWVmBtDgAAB5/wlQ (envelope-from ) for ; Sun, 21 Mar 2021 00:44:23 +0000 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx2.migadu.com (Postfix) with ESMTPS id 8DBE7DCF4 for ; Sun, 21 Mar 2021 01:44:23 +0100 (CET) Received: from localhost ([::1]:56830 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lNmCc-0002Ue-0d for larch@yhetil.org; Sat, 20 Mar 2021 20:44:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58076) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lNmCI-0002UJ-Hf for guix-patches@gnu.org; Sat, 20 Mar 2021 20:44:02 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:41809) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lNmCI-000305-AJ for guix-patches@gnu.org; Sat, 20 Mar 2021 20:44:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1lNmCI-0003GW-7s for guix-patches@gnu.org; Sat, 20 Mar 2021 20:44:02 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#47288] [PATCH] guix: http-client: Tweak http-multiple-get error handling. Resent-From: Christopher Baines Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Sun, 21 Mar 2021 00:44:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 47288 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 47288@debbugs.gnu.org X-Debbugs-Original-To: guix-patches@gnu.org Received: via spool by submit@debbugs.gnu.org id=B.161628743112526 (code B ref -1); Sun, 21 Mar 2021 00:44:02 +0000 Received: (at submit) by debbugs.gnu.org; 21 Mar 2021 00:43:51 +0000 Received: from localhost ([127.0.0.1]:53355 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lNmC6-0003Fx-IX for submit@debbugs.gnu.org; Sat, 20 Mar 2021 20:43:50 -0400 Received: from lists.gnu.org ([209.51.188.17]:58442) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lNmC3-0003Fn-EB for submit@debbugs.gnu.org; Sat, 20 Mar 2021 20:43:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58066) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lNmC2-0002SU-JG for guix-patches@gnu.org; Sat, 20 Mar 2021 20:43:46 -0400 Received: from mira.cbaines.net ([2a01:7e00:e000:2f8:fd4d:b5c7:13fb:3d27]:38847) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lNmBy-0002t7-De for guix-patches@gnu.org; Sat, 20 Mar 2021 20:43:46 -0400 Received: from localhost (unknown [IPv6:2a02:8010:68c1:0:8ac0:b4c7:f5c8:7caa]) by mira.cbaines.net (Postfix) with ESMTPSA id 0954327BC57 for ; Sun, 21 Mar 2021 00:43:40 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id 886c814a for ; Sun, 21 Mar 2021 00:43:38 +0000 (UTC) From: Christopher Baines Date: Sun, 21 Mar 2021 00:43:38 +0000 Message-Id: <20210321004338.31867-1-mail@cbaines.net> X-Mailer: git-send-email 2.30.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Received-SPF: pass client-ip=2a01:7e00:e000:2f8:fd4d:b5c7:13fb:3d27; envelope-from=mail@cbaines.net; helo=mira.cbaines.net X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+larch=yhetil.org@gnu.org Sender: "Guix-patches" X-Migadu-Flow: FLOW_IN ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1616287463; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding:resent-cc: resent-from:resent-sender:resent-message-id:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=DAT2Clu+7Y1+Pp1OscFzPmM7qRuexnAp7HMYSw8Ersk=; b=YQyakEz+MjpLTR9/JU4rM4xJ9kIu7uajV/w2r7R5iu46quqlrB87s7WT0jvbPLTOQM03dp hkdgE8awcN27hOm6N1NXtjqhDZMBi+1l2liYHGEtI+91TFh5ynRV8On7MbMV3Mrjo2ebtV gjI3s+6qbzMsUqoN7ao5bYh5rd+7NLF7UDbHJCUZ5t1LQxzuqXQqhjeMogvBDaVyzzMqlI FI1kDmu5TT6YeAdh//KI9IB9I/SwRlvDSKstuxn7S8VWXmjbPlPpvOquZkbG6WstH7m0yI lnIdCeb/w0dQswumBUG7HQrymoSzKsCTU1VW34YJpaMYBekTLFa30lOLsUb1HQ== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1616287463; a=rsa-sha256; cv=none; b=SwFJYrsKXwpqCFtlm5/J+hyhLjfF+O9+xm5WHiaFdictuUERLfRHK9uQOZt4bXQjVSF24+ JqewijUDKX/aZVJSHIT3izmAXozkXHsWGHY1shCN5qmULLfp30H1OETMuWzoc62N2AHkao HYCUNk1tDb6FJgvlnd1AMH7ChzwImJV9JT3Bo22KxvjlH6wuZ5j2zg6QKBKm/Vt3vMyprY mrj5CYiNQEvtyZzPaiRWAr8Q4t1G489ICgSs5Dg78pxo+Z++PwvTYNT93U2AF8fBKbpe0c UPJ+EYLPCVlRMeq4uAEqTlsLxmfpaHpWYDVDhki6hzLLTGYfaR51dKMFX7iqxw== ARC-Authentication-Results: i=1; aspmx2.migadu.com; dkim=none; dmarc=none; spf=pass (aspmx2.migadu.com: domain of guix-patches-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=guix-patches-bounces@gnu.org X-Migadu-Spam-Score: 2.59 Authentication-Results: aspmx2.migadu.com; dkim=none; dmarc=none; spf=pass (aspmx2.migadu.com: domain of guix-patches-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=guix-patches-bounces@gnu.org X-Migadu-Queue-Id: 8DBE7DCF4 X-Spam-Score: 2.59 X-Migadu-Scanner: scn0.migadu.com X-TUID: 5brBm1kjOTF/ This isn't meant to change the way errors are handled, and arguably makes the code harder to read, but it's a uninformed attempt to improve the performance (following on from a performance regression in 205833b72c5517915a47a50dbe28e7024dc74e57). I'm guessing something about Guile internals makes calling (loop ...) within the catch bit less performant than avoiding this and calling (loop ...) after the catch bit has finished. Since this happens lots, this seems to be sufficient to make guix weather a lot slower than it was before. Anecdotal testing of guix weather suggests this change might work. * guix/http-client.scm (http-multiple-get): Tweak how the second catch statement works. --- guix/http-client.scm | 77 +++++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 36 deletions(-) diff --git a/guix/http-client.scm b/guix/http-client.scm index 4b4c14ed0b..a189cceecf 100644 --- a/guix/http-client.scm +++ b/guix/http-client.scm @@ -219,42 +219,47 @@ returning." (remainder (connect p remainder result)))) ((head tail ...) - (catch #t - (lambda () - (let* ((resp (read-response p)) - (body (response-body-port resp)) - (result (proc head resp body result))) - ;; The server can choose to stop responding at any time, - ;; in which case we have to try again. Check whether - ;; that is the case. Note that even upon "Connection: - ;; close", we can read from BODY. - (match (assq 'connection (response-headers resp)) - (('connection 'close) - (close-port p) - (connect #f ;try again - (drop requests (+ 1 processed)) - result)) - (_ - (loop tail (+ 1 processed) result))))) ;keep going - (lambda (key . args) - ;; If PORT was cached and the server closed the connection - ;; in the meantime, we get EPIPE. In that case, open a - ;; fresh connection and retry. We might also get - ;; 'bad-response or a similar exception from (web response) - ;; later on, once we've sent the request, or a - ;; ERROR/INVALID-SESSION from GnuTLS. - (if (or (and (eq? key 'system-error) - (= EPIPE (system-error-errno `(,key ,@args)))) - (and (eq? key 'gnutls-error) - (eq? (first args) error/invalid-session)) - (memq key - '(bad-response bad-header bad-header-component))) - (begin - (close-port p) - (connect #f ; try again - (drop requests (+ 1 processed)) - result)) - (apply throw key args)))))))))) + (match + (catch #t + (lambda () + (let* ((resp (read-response p)) + (body (response-body-port resp)) + (result (proc head resp body result))) + ;; The server can choose to stop responding at any time, + ;; in which case we have to try again. Check whether + ;; that is the case. Note that even upon "Connection: + ;; close", we can read from BODY. + (match (assq 'connection (response-headers resp)) + (('connection 'close) + (close-port p) + 'try-again-with-new-connection) + (_ + result)))) + (lambda (key . args) + ;; If PORT was cached and the server closed the connection + ;; in the meantime, we get EPIPE. In that case, open a + ;; fresh connection and retry. We might also get + ;; 'bad-response or a similar exception from (web response) + ;; later on, once we've sent the request, or a + ;; ERROR/INVALID-SESSION from GnuTLS. + (if (or (and (eq? key 'system-error) + (= EPIPE (system-error-errno `(,key ,@args)))) + (and (eq? key 'gnutls-error) + (eq? (first args) error/invalid-session))1 + (memq key + '(bad-response + bad-header + bad-header-component))) + (begin + (close-port p) + 'try-again-with-new-connection) + (apply throw key args)))) + ('try-again-with-new-connection + (connect #f + (drop requests (+ 1 processed)) + result)) + (result + (loop tail (+ 1 processed) result))))))))) ;;; -- 2.30.1