Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oPxEl-000062-TD for pgsql-hackers@arkaria.postgresql.org; Mon, 22 Aug 2022 02:32:24 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1oPxEk-0001Qj-8X for pgsql-hackers@arkaria.postgresql.org; Mon, 22 Aug 2022 02:32:22 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oPxEj-0001Qa-Sl for pgsql-hackers@lists.postgresql.org; Mon, 22 Aug 2022 02:32:21 +0000 Received: from mail-pg1-x52d.google.com ([2607:f8b0:4864:20::52d]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1oPxEh-0005oH-7X for pgsql-hackers@lists.postgresql.org; Mon, 22 Aug 2022 02:32:20 +0000 Received: by mail-pg1-x52d.google.com with SMTP id v4so8187663pgi.10 for ; Sun, 21 Aug 2022 19:32:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:user-agent:references :in-reply-to:from:subject:cc:to:message-id:date:from:to:cc; bh=Lp3U8ZMthM6xsw+Eeocm74NqHJXCe1dGcwsRMLBL7HY=; b=HYCc2rQRbcnhnD9uOGzkKreO9c7xISaBMzab3jxzthQnTFadghRi1R/ufP1qD9G+eE v5h3bYGW+RoBrgnN4V6fdV7Uhm3YMO7YE6P8Qduv4BKZlOfIJdJshOc9h56eFIJjJnsa gsoICKmEe/6EWhO0rtpVzsVyGDidPknG1JpIwZ6kZhQp4oYJldpya12kAMRTIiBk1KKV 63MmectdhTSz60zNddG3xK7ZKRsM3FuecR2UzrwG5AO/frcA/g1oy1U2BVtpIIcc56Ha guCDuGTMj7qcBtbnohc+AN3yGVsQaD/09ZDjVTp92p7sAx1DTJtjqJvTFcobIzN6PdkO fbkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:user-agent:references :in-reply-to:from:subject:cc:to:message-id:date:x-gm-message-state :from:to:cc; bh=Lp3U8ZMthM6xsw+Eeocm74NqHJXCe1dGcwsRMLBL7HY=; b=bhekTK0sLqJD2G1Mpx9mSfkMYFcj5vSBWl+NPYRO5XyRVHBzbXDlljIMsqnw9QVdBs Ibrxbfg+ps4SJCR6FNAgstBsjUIki/h31ngEiL9LjslYRsiW/3YeqmM/a6NtfNJt1DOv Nlt59OyOSTqtpXN0b1AXlhH06iivnjFwkAKUytIapKRPanrjK25ex/yi6mVR/8lbupN4 GlwcLdgEszSD072OLIPcyup24fqD7BYrYoVbrX/QUITOzEAc2f4qwLzhh4lG9GouGYix /HEWOh0GPn3V6O1ZxmsNJM3/3i9KfRj/OOATszhkpFzvrk3xC03aWX/EBonF4ulrXyeS 8ePQ== X-Gm-Message-State: ACgBeo3fyiMznlBxWdgZZOYJVV8pqYUE0d3IShejKPDQtx5JQabmzoQ0 A+0gVcgARRECupjlyPbDI/s= X-Google-Smtp-Source: AA6agR5XjSZi0u0pMKjmy/Ix7fL4wnfCoZcoaf+zRkacb8xszrdh4rDn6BasLtC8ufuSJNUWFdJlQw== X-Received: by 2002:a05:6a00:acc:b0:530:e79e:fc27 with SMTP id c12-20020a056a000acc00b00530e79efc27mr18849384pfl.61.1661135537710; Sun, 21 Aug 2022 19:32:17 -0700 (PDT) Received: from localhost (KD036014041111.ppp-bb.dion.ne.jp. [36.14.41.111]) by smtp.gmail.com with ESMTPSA id h135-20020a62838d000000b0052d432b4cc0sm7375726pfe.33.2022.08.21.19.32.15 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 21 Aug 2022 19:32:16 -0700 (PDT) Date: Mon, 22 Aug 2022 11:32:14 +0900 (JST) Message-Id: <20220822.113214.157880042751504547.horikyota.ntt@gmail.com> To: bdrouvot@amazon.com Cc: andres@anarazel.de, stark@mit.edu, pgsql-hackers@lists.postgresql.org Subject: Re: shared-memory based stats collector - v70 From: Kyotaro Horiguchi In-Reply-To: <3d853c6f-445f-782e-eab0-525729952d4c@amazon.com> References: <20220809165319.jdzd225xohqf6o57@awork3.anarazel.de> <20220810.113910.92411510444435201.horikyota.ntt@gmail.com> <3d853c6f-445f-782e-eab0-525729952d4c@amazon.com> User-Agent: Mew version 6.8 on Emacs 26.1 Mime-Version: 1.0 Content-Type: Multipart/Mixed; boundary="--Next_Part(Mon_Aug_22_11_32_14_2022_519)--" Content-Transfer-Encoding: 7bit List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk ----Next_Part(Mon_Aug_22_11_32_14_2022_519)-- Content-Type: Text/Plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable At Wed, 10 Aug 2022 14:02:34 +0200, "Drouvot, Bertrand" wrote in = > what about? > = > +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* > +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 * Acquire the LWLock d= irectly instead of using > pg_stat_lock_entry_shared() > +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 * which requires a ref= erence. > +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 */ > = > = > I think that's more consistent with other comments mentioning LWLock > acquisition. Sure. Thaks!. I did that in the attached. regards. -- = Kyotaro Horiguchi NTT Open Source Software Center ----Next_Part(Mon_Aug_22_11_32_14_2022_519)-- Content-Type: Text/X-Patch; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="v2-0001-Acquire-lock-properly-when-building-stats-snapsho.patch" From 202ef49a8885f46e339a6d81c723ac3b0a7d55ca Mon Sep 17 00:00:00 2001 From: Kyotaro Horiguchi Date: Mon, 22 Aug 2022 11:29:07 +0900 Subject: [PATCH v2] Acquire lock properly when building stats snapshot It got lost somewhere while developing shared memory stats collector but it is undoubtedly required. --- src/backend/utils/activity/pgstat.c | 8 ++++++++ src/backend/utils/activity/pgstat_shmem.c | 12 ++++++++++++ src/include/utils/pgstat_internal.h | 1 + 3 files changed, 21 insertions(+) diff --git a/src/backend/utils/activity/pgstat.c b/src/backend/utils/activity/pgstat.c index 88e5dd1b2b..95f09cfcc7 100644 --- a/src/backend/utils/activity/pgstat.c +++ b/src/backend/utils/activity/pgstat.c @@ -844,9 +844,11 @@ pgstat_fetch_entry(PgStat_Kind kind, Oid dboid, Oid objoid) else stats_data = MemoryContextAlloc(pgStatLocal.snapshot.context, kind_info->shared_data_len); + pgstat_lock_entry_shared(entry_ref, false); memcpy(stats_data, pgstat_get_entry_data(kind, entry_ref->shared_stats), kind_info->shared_data_len); + pgstat_unlock_entry(entry_ref); if (pgstat_fetch_consistency > PGSTAT_FETCH_CONSISTENCY_NONE) { @@ -983,9 +985,15 @@ pgstat_build_snapshot(void) entry->data = MemoryContextAlloc(pgStatLocal.snapshot.context, kind_info->shared_size); + /* + * Acquire the LWLock directly instead of using + * pg_stat_lock_entry_shared() which requires a reference. + */ + LWLockAcquire(&stats_data->lock, LW_SHARED); memcpy(entry->data, pgstat_get_entry_data(kind, stats_data), kind_info->shared_size); + LWLockRelease(&stats_data->lock); } dshash_seq_term(&hstat); diff --git a/src/backend/utils/activity/pgstat_shmem.c b/src/backend/utils/activity/pgstat_shmem.c index 89060ef29a..0bfa460af1 100644 --- a/src/backend/utils/activity/pgstat_shmem.c +++ b/src/backend/utils/activity/pgstat_shmem.c @@ -579,6 +579,18 @@ pgstat_lock_entry(PgStat_EntryRef *entry_ref, bool nowait) return true; } +bool +pgstat_lock_entry_shared(PgStat_EntryRef *entry_ref, bool nowait) +{ + LWLock *lock = &entry_ref->shared_stats->lock; + + if (nowait) + return LWLockConditionalAcquire(lock, LW_SHARED); + + LWLockAcquire(lock, LW_SHARED); + return true; +} + void pgstat_unlock_entry(PgStat_EntryRef *entry_ref) { diff --git a/src/include/utils/pgstat_internal.h b/src/include/utils/pgstat_internal.h index 9303d05427..901d2041d6 100644 --- a/src/include/utils/pgstat_internal.h +++ b/src/include/utils/pgstat_internal.h @@ -581,6 +581,7 @@ extern void pgstat_detach_shmem(void); extern PgStat_EntryRef *pgstat_get_entry_ref(PgStat_Kind kind, Oid dboid, Oid objoid, bool create, bool *found); extern bool pgstat_lock_entry(PgStat_EntryRef *entry_ref, bool nowait); +extern bool pgstat_lock_entry_shared(PgStat_EntryRef *entry_ref, bool nowait); extern void pgstat_unlock_entry(PgStat_EntryRef *entry_ref); extern bool pgstat_drop_entry(PgStat_Kind kind, Oid dboid, Oid objoid); extern void pgstat_drop_all_entries(void); -- 2.31.1 ----Next_Part(Mon_Aug_22_11_32_14_2022_519)----