From patchwork Mon May 9 22:57:21 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Wielaard X-Patchwork-Id: 53687 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id CB2C8384B075 for ; Mon, 9 May 2022 22:58:47 +0000 (GMT) X-Original-To: elfutils-devel@sourceware.org Delivered-To: elfutils-devel@sourceware.org Received: from gnu.wildebeest.org (gnu.wildebeest.org [45.83.234.184]) by sourceware.org (Postfix) with ESMTPS id C91403857364 for ; Mon, 9 May 2022 22:57:55 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org C91403857364 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=klomp.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=klomp.org Received: from reform (deer0x07.wildebeest.org [172.31.17.137]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by gnu.wildebeest.org (Postfix) with ESMTPSA id 1B88930007D1; Tue, 10 May 2022 00:57:54 +0200 (CEST) Received: by reform (Postfix, from userid 1000) id AAC0A2E8237E; Tue, 10 May 2022 00:57:53 +0200 (CEST) From: Mark Wielaard To: elfutils-devel@sourceware.org Subject: [PATCH 1/3] debuginfod: Make sure debuginfod_config_cache always returns valid stat Date: Tue, 10 May 2022 00:57:21 +0200 Message-Id: <20220509225723.96902-2-mark@klomp.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220509225723.96902-1-mark@klomp.org> References: <20220509225723.96902-1-mark@klomp.org> MIME-Version: 1.0 X-Spam-Status: No, score=-9.5 required=5.0 tests=BAYES_00, GIT_PATCH_0, JMQ_SPF_NEUTRAL, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: elfutils-devel@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Elfutils-devel mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , Cc: Mark Wielaard Errors-To: elfutils-devel-bounces+patchwork=sourceware.org@sourceware.org Sender: "Elfutils-devel" If the condig file which value was requested from debuginfod_config_cache didn't exist yet, stat would fail and no valid struct stat would be returned even when the file was correctly created. Fix this by always using O_CREAT to open the file, and reuse that file descriptor to call fstat and for either writing the default value or reading the config file value. Signed-off-by: Mark Wielaard --- debuginfod/ChangeLog | 6 ++++++ debuginfod/debuginfod-client.c | 21 ++++++++++++++------- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/debuginfod/ChangeLog b/debuginfod/ChangeLog index 257ac39f..46a6e22b 100644 --- a/debuginfod/ChangeLog +++ b/debuginfod/ChangeLog @@ -1,3 +1,9 @@ +2022-05-09 Mark Wielaard + + * debuginfod-client.c (debuginfod_config_cache): Always open with + O_CREATE first, then use fstat, only write the cache_config_default_s + value if st_size == 0, otherwise read value from file. + 2022-05-09 Mark Wielaard * debuginfod.cxx (conninfo): Always provide servname to getnameinfo. diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c index 89208216..3b2728f1 100644 --- a/debuginfod/debuginfod-client.c +++ b/debuginfod/debuginfod-client.c @@ -235,14 +235,19 @@ debuginfod_config_cache(char *config_path, long cache_config_default_s, struct stat *st) { - int fd; - /* if the config file doesn't exist, create one with DEFFILEMODE*/ - if(stat(config_path, st) == -1) + int fd = open(config_path, O_CREAT | O_RDWR, DEFFILEMODE); + if (fd < 0) + return -errno; + + if (fstat (fd, st) < 0) { - fd = open(config_path, O_CREAT | O_RDWR, DEFFILEMODE); - if (fd < 0) - return -errno; + int ret = -errno; + close (fd); + return ret; + } + if (st->st_size == 0) + { if (dprintf(fd, "%ld", cache_config_default_s) < 0) { int ret = -errno; @@ -251,10 +256,11 @@ debuginfod_config_cache(char *config_path, } close (fd); + return cache_config_default_s; } long cache_config; - FILE *config_file = fopen(config_path, "r"); + FILE *config_file = fdopen(fd, "r"); if (config_file) { if (fscanf(config_file, "%ld", &cache_config) != 1) @@ -264,6 +270,7 @@ debuginfod_config_cache(char *config_path, else cache_config = cache_config_default_s; + close (fd); return cache_config; } From patchwork Mon May 9 22:57:22 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Wielaard X-Patchwork-Id: 53688 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 3A33B385E45D for ; Mon, 9 May 2022 22:58:53 +0000 (GMT) X-Original-To: elfutils-devel@sourceware.org Delivered-To: elfutils-devel@sourceware.org Received: from gnu.wildebeest.org (gnu.wildebeest.org [45.83.234.184]) by sourceware.org (Postfix) with ESMTPS id 948823856DCF for ; Mon, 9 May 2022 22:57:58 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 948823856DCF Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=klomp.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=klomp.org Received: from reform (deer0x07.wildebeest.org [172.31.17.137]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by gnu.wildebeest.org (Postfix) with ESMTPSA id 249C13000599; Tue, 10 May 2022 00:57:57 +0200 (CEST) Received: by reform (Postfix, from userid 1000) id C44552E8237E; Tue, 10 May 2022 00:57:56 +0200 (CEST) From: Mark Wielaard To: elfutils-devel@sourceware.org Subject: [PATCH 2/3] debuginfod: Remove debuginfod_init_cache Date: Tue, 10 May 2022 00:57:22 +0200 Message-Id: <20220509225723.96902-3-mark@klomp.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220509225723.96902-1-mark@klomp.org> References: <20220509225723.96902-1-mark@klomp.org> MIME-Version: 1.0 X-Spam-Status: No, score=-9.8 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: elfutils-devel@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Elfutils-devel mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , Cc: Mark Wielaard Errors-To: elfutils-devel-bounces+patchwork=sourceware.org@sourceware.org Sender: "Elfutils-devel" debuginfod_init_cache would create all config files if they didn't exist yet. It always made two stat calls. Then debuginfod_clean_cache would call debuginfod_config_cache which did the same checks and created any missing config files. Just make sure the cache_path directory exists and remove debuginfod_init_cache before calling debuginfod_clean_cache. Signed-off-by: Mark Wielaard --- debuginfod/ChangeLog | 6 ++++ debuginfod/debuginfod-client.c | 61 +++++----------------------------- 2 files changed, 15 insertions(+), 52 deletions(-) diff --git a/debuginfod/ChangeLog b/debuginfod/ChangeLog index 46a6e22b..c9aa4fcf 100644 --- a/debuginfod/ChangeLog +++ b/debuginfod/ChangeLog @@ -1,3 +1,9 @@ +2022-05-09 Mark Wielaard + + * debuginfod-client.c (debuginfod_init_cache): Remove. + (debuginfod_query_server): Don't call debuginfod_init_cache, call + mkdir then debuginfod_clean_cache. + 2022-05-09 Mark Wielaard * debuginfod-client.c (debuginfod_config_cache): Always open with diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c index 3b2728f1..6bdf1908 100644 --- a/debuginfod/debuginfod-client.c +++ b/debuginfod/debuginfod-client.c @@ -274,55 +274,6 @@ debuginfod_config_cache(char *config_path, return cache_config; } -/* Create the cache and interval file if they do not already exist. - Return 0 if cache and config file are initialized, otherwise return - the appropriate error code. */ -static int -debuginfod_init_cache (char *cache_path, char *interval_path, char *maxage_path) -{ - struct stat st; - - /* If the cache and config file already exist then we are done. */ - if (stat(cache_path, &st) == 0 && stat(interval_path, &st) == 0) - return 0; - - /* Create the cache and config files as necessary. */ - if (stat(cache_path, &st) != 0 && mkdir(cache_path, ACCESSPERMS) < 0) - return -errno; - - int fd = -1; - - /* init cleaning interval config file. */ - fd = open(interval_path, O_CREAT | O_RDWR, DEFFILEMODE); - if (fd < 0) - return -errno; - - if (dprintf(fd, "%ld", cache_clean_default_interval_s) < 0) - { - int ret = -errno; - close (fd); - return ret; - } - - close (fd); - - /* init max age config file. */ - if (stat(maxage_path, &st) != 0 - && (fd = open(maxage_path, O_CREAT | O_RDWR, DEFFILEMODE)) < 0) - return -errno; - - if (dprintf(fd, "%ld", cache_default_max_unused_age_s) < 0) - { - int ret = -errno; - close (fd); - return ret; - } - - close (fd); - return 0; -} - - /* Delete any files that have been unmodied for a period longer than $DEBUGINFOD_CACHE_CLEAN_INTERVAL_S. */ static int @@ -795,9 +746,15 @@ debuginfod_query_server (debuginfod_client *c, if (vfd >= 0) dprintf (vfd, "checking cache dir %s\n", cache_path); - rc = debuginfod_init_cache(cache_path, interval_path, maxage_path); - if (rc != 0) - goto out; + /* Make sure cache dir exists. debuginfo_clean_cache will then make + sure the interval, cache_miss and maxage files exist. */ + if (mkdir (cache_path, ACCESSPERMS) != 0 + && errno != EEXIST) + { + rc = -errno; + goto out; + } + rc = debuginfod_clean_cache(c, cache_path, interval_path, maxage_path); if (rc != 0) goto out; From patchwork Mon May 9 22:57:23 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Wielaard X-Patchwork-Id: 53689 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A1643385626E for ; Mon, 9 May 2022 22:58:58 +0000 (GMT) X-Original-To: elfutils-devel@sourceware.org Delivered-To: elfutils-devel@sourceware.org Received: from gnu.wildebeest.org (gnu.wildebeest.org [45.83.234.184]) by sourceware.org (Postfix) with ESMTPS id 1F1703856DF9 for ; Mon, 9 May 2022 22:58:00 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 1F1703856DF9 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=klomp.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=klomp.org Received: from reform (deer0x07.wildebeest.org [172.31.17.137]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by gnu.wildebeest.org (Postfix) with ESMTPSA id D125930007D1; Tue, 10 May 2022 00:57:58 +0200 (CEST) Received: by reform (Postfix, from userid 1000) id B23402E8237E; Tue, 10 May 2022 00:57:58 +0200 (CEST) From: Mark Wielaard To: elfutils-devel@sourceware.org Subject: [PATCH 3/3] debuginfod: update mtime of interval_path as early as possible Date: Tue, 10 May 2022 00:57:23 +0200 Message-Id: <20220509225723.96902-4-mark@klomp.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220509225723.96902-1-mark@klomp.org> References: <20220509225723.96902-1-mark@klomp.org> MIME-Version: 1.0 X-Spam-Status: No, score=-9.5 required=5.0 tests=BAYES_00, GIT_PATCH_0, JMQ_SPF_NEUTRAL, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: elfutils-devel@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Elfutils-devel mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , Cc: Mark Wielaard Errors-To: elfutils-devel-bounces+patchwork=sourceware.org@sourceware.org Sender: "Elfutils-devel" Call utime on interval_path file as soon as the thread is committed to cleanup the cache files. This will prevent other threads trying to also commit to cleaning the cache files. Having multiple threads try to clean the cache simultaniously doesn't improve cleanup speed because the threads will try to delete the files in the same order. Signed-off-by: Mark Wielaard --- debuginfod/ChangeLog | 5 +++++ debuginfod/debuginfod-client.c | 7 +++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/debuginfod/ChangeLog b/debuginfod/ChangeLog index c9aa4fcf..209a22a7 100644 --- a/debuginfod/ChangeLog +++ b/debuginfod/ChangeLog @@ -1,3 +1,8 @@ +2022-05-09 Mark Wielaard + + * debuginfod-client.c (debuginfod_clean_cache): Move utime call to + before fts traversal. + 2022-05-09 Mark Wielaard * debuginfod-client.c (debuginfod_init_cache): Remove. diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c index 6bdf1908..b7b65aff 100644 --- a/debuginfod/debuginfod-client.c +++ b/debuginfod/debuginfod-client.c @@ -297,6 +297,11 @@ debuginfod_clean_cache(debuginfod_client *c, /* Interval has not passed, skip cleaning. */ return 0; + /* Update timestamp representing when the cache was last cleaned. + Do it at the start to reduce the number of threads trying to do a + cleanup simultaniously. */ + utime (interval_path, NULL); + /* Read max unused age value from config file. */ rc = debuginfod_config_cache(max_unused_path, cache_default_max_unused_age_s, &st); @@ -351,8 +356,6 @@ debuginfod_clean_cache(debuginfod_client *c, fts_close (fts); regfree (&re); - /* Update timestamp representing when the cache was last cleaned. */ - utime (interval_path, NULL); return 0; }