From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp2 ([2001:41d0:8:6d80::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms11 with LMTPS id ALDVJOyZVmCgOgAA0tVLHw (envelope-from ) for ; Sun, 21 Mar 2021 00:57:16 +0000 Received: from aspmx1.migadu.com ([2001:41d0:8:6d80::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp2 with LMTPS id 0KmcIOyZVmBvDgAAB5/wlQ (envelope-from ) for ; Sun, 21 Mar 2021 00:57:16 +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 aspmx1.migadu.com (Postfix) with ESMTPS id 794A22126F for ; Sun, 21 Mar 2021 01:57:15 +0100 (CET) Received: from localhost ([::1]:59196 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lNmP4-0004R7-5k for larch@yhetil.org; Sat, 20 Mar 2021 20:57:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:59884) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lNmOs-0004QU-Np for guix-patches@gnu.org; Sat, 20 Mar 2021 20:57:02 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:41818) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lNmOs-0008Qs-H5 for guix-patches@gnu.org; Sat, 20 Mar 2021 20:57:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1lNmOs-0003ZL-Ev for guix-patches@gnu.org; Sat, 20 Mar 2021 20:57:02 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#47288] [PATCH v2] guix: http-client: Tweak http-multiple-get error handling. References: <20210321004338.31867-1-mail@cbaines.net> In-Reply-To: <20210321004338.31867-1-mail@cbaines.net> Resent-From: Christopher Baines Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Sun, 21 Mar 2021 00:57:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 47288 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 47288@debbugs.gnu.org Received: via spool by 47288-submit@debbugs.gnu.org id=B47288.161628816813656 (code B ref 47288); Sun, 21 Mar 2021 00:57:02 +0000 Received: (at 47288) by debbugs.gnu.org; 21 Mar 2021 00:56:08 +0000 Received: from localhost ([127.0.0.1]:53364 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lNmNz-0003YB-2P for submit@debbugs.gnu.org; Sat, 20 Mar 2021 20:56:07 -0400 Received: from mira.cbaines.net ([212.71.252.8]:59698) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lNmNt-0003Xi-70 for 47288@debbugs.gnu.org; Sat, 20 Mar 2021 20:56:05 -0400 Received: from localhost (unknown [IPv6:2a02:8010:68c1:0:8ac0:b4c7:f5c8:7caa]) by mira.cbaines.net (Postfix) with ESMTPSA id 5131E27BC57 for <47288@debbugs.gnu.org>; Sun, 21 Mar 2021 00:56:00 +0000 (GMT) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id 87a2253f for <47288@debbugs.gnu.org>; Sun, 21 Mar 2021 00:56:00 +0000 (UTC) From: Christopher Baines Date: Sun, 21 Mar 2021 00:56:00 +0000 Message-Id: <20210321005600.12551-1-mail@cbaines.net> X-Mailer: git-send-email 2.30.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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=1616288236; 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:in-reply-to:in-reply-to: references:references:list-id:list-help:list-unsubscribe: list-subscribe:list-post; bh=ssCjejq418Tp5URIeahAJaSntMoOG0hUcDNnQ33wL+4=; b=Q0fFSDHJW/8rafP6k/KTvJdUmuUd1UwHBB6AYEPKeM1EvT293vSHNp7WOvHmtc6aBXg76p plqCM74kWRepnPPXD4NornN2gRhCcSogl4sej1DKkmMucJjuDMg9USGXl3DYFE/li/Bg76 a/85YZ+F+td79BQ2WD9XdrmoIg99OeU2Csp7Z+bthadZLZaLm6lFYMYzfBgxNUo/u30QLT lEsPwAKELJFjGuwE9RgJtd3T1N0dHej7sJ7+usiYzpYPxfbrTpYb7bQG890w7L8BTqdRQj kIueFU72u9PfOeBOZFa8/4O1gG4SGjUqxxkiKP6PXRsxQPca1P1DNPAZGMCoUg== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1616288236; a=rsa-sha256; cv=none; b=Jgo/XMjEJgYC8Sbstf07zvHLK3CPGE2PpfjorcoclhyjZ6/Cl2Rh8maFElTKYCSH4UFLlg rzc8QaV9LYfhRJYVuwBR+cVjLMLy4rvR+FGE2j9bGcLgAIz2rkOQ85pVmMXxNvNvh7WEKx eoqn4IOPPCAlmKv2YfzwJo+usu+7PGQRCYZ58aDu+B2Rl4Y4VbFF6/pCgvkLAF4N5r5Uns zf08xdOEguw2oF3vnfIPBb597RxDEbKI9V1SUyT9tncwNqtjR6SI29nH869ecVhy9x5wkQ cBhjGnfB+HknaFPV2wxMlmLkAKiX5x9YhXBbJNrEIHQZYjL8ULqnxzPoNuC3fA== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=none; dmarc=none; spf=pass (aspmx1.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: aspmx1.migadu.com; dkim=none; dmarc=none; spf=pass (aspmx1.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: 794A22126F X-Spam-Score: 2.59 X-Migadu-Scanner: scn0.migadu.com X-TUID: iWZ4QMhDe3B3 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, 43 insertions(+), 34 deletions(-) diff --git a/guix/http-client.scm b/guix/http-client.scm index 4b4c14ed0b..a9609445c8 100644 --- a/guix/http-client.scm +++ b/guix/http-client.scm @@ -219,42 +219,51 @@ 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 + (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) + (list 'connect + #f (drop requests (+ 1 processed)) result)) - (apply throw key args)))))))))) + (_ + (list 'loop tail (+ 1 processed) 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) + (list 'connect + #f + requests + result)) + (apply throw key args)))) + (('connect . args) + (apply connect args)) + (('loop . args) + (apply loop args))))))))) ;;; -- 2.30.1