Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vQAVO-000XA4-2Y for pgsql-hackers@arkaria.postgresql.org; Mon, 01 Dec 2025 20:28:19 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vQAVM-004J4K-2k for pgsql-hackers@arkaria.postgresql.org; Mon, 01 Dec 2025 20:28:17 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vQAVM-004J4B-1k for pgsql-hackers@lists.postgresql.org; Mon, 01 Dec 2025 20:28:16 +0000 Received: from fout-a5-smtp.messagingengine.com ([103.168.172.148]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vQAVK-002cBj-1w for pgsql-hackers@postgresql.org; Mon, 01 Dec 2025 20:28:16 +0000 Received: from phl-compute-06.internal (phl-compute-06.internal [10.202.2.46]) by mailfout.phl.internal (Postfix) with ESMTP id 07DBAEC0BE5; Mon, 1 Dec 2025 15:28:11 -0500 (EST) Received: from phl-mailfrontend-01 ([10.202.2.162]) by phl-compute-06.internal (MEProxy); Mon, 01 Dec 2025 15:28:11 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=anarazel.de; h= cc:cc:content-transfer-encoding:content-type:content-type:date :date:from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm1; t=1764620891; x=1764707291; bh=PZFufjQsYorXmVH6XTDGcVf9gqsTZ4v8+ICN+Rk40WE=; b= JVTB9qRyxN13RAjCcLClX3TXBwJCe1aHlMjaNB5lneyVZK6jyIcYAi7fvbHuLJTY rxZAaAZUGJPS1y47skifKOhnLx+xOaYUegEgx4IcaLDiphertmiSg34MI8lR01B9 U7vgAoRC5gbfA+v3RWhHwXNTFxVAKOwUy1NLtGHPEQo2RC6ki2usczqL2wH0nFws NnexEmdkgVfOww8VjDG5HcYgl/W4wfiywU9Dnu0mqH+V2VVHU4nVnUEnPRyaj9Cc LdLEvo1glFLUFli2pE0DY18+V3/F1QXvAFyLkf3d6COwq5nUnch0JDcmNXBd865J vyY2LkBh4HqrkMc5YRALrA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm1; t=1764620891; x= 1764707291; bh=PZFufjQsYorXmVH6XTDGcVf9gqsTZ4v8+ICN+Rk40WE=; b=b eTTjOmtyxSnnPGc2ajX7vNhCRWRM2z7MeNiY3CrEtq0XGh5jwYl7H0k5kYCcF9Iv 8+0NIfFcQHjdhDHNWxxQRuct2Y0tgNjKvWEYWDdO8ZsWriq5LKeQlxjaesNygnsY 0DH2xzdzYkM8lmvJy6k2w/PWk9XsVqj/NyeRR41RqG8qiQIlmyTvgPlICN3sYAox dcuP8j9JDEfNKKKsYcLp4mFpW2/k1do2b01i6L0Uc4qqWXVQzZYjkwNbyZOLB3le 22KfLLmTEOuMgZE5/QtWDmphoXeWrAKJyb9sMRHeQJpH+NPYElHmYsb/OxnndI2c 75h4GdORERnnDWXKeBvIg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggddvheekieejucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujf gurhepfffhvfevuffkfhggtggugfgjsehtkefstddttdejnecuhfhrohhmpeetnhgurhgv shcuhfhrvghunhguuceorghnughrvghssegrnhgrrhgriigvlhdruggvqeenucggtffrrg htthgvrhhnpedtleelvdfgjedvffeiueekfeeuleffhfegfffhgfffkeevueehieehhfei gffhvdenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpe grnhgurhgvshesrghnrghrrgiivghlrdguvgdpnhgspghrtghpthhtohepkedpmhhouggv pehsmhhtphhouhhtpdhrtghpthhtohepsghovghkvgifuhhrmhdophhoshhtghhrvghsse hgmhgrihhlrdgtohhmpdhrtghpthhtohepmhgvlhgrnhhivghplhgrghgvmhgrnhesghhm rghilhdrtghomhdprhgtphhtthhopehmihgthhgrvghlrdhprghquhhivghrsehgmhgrih hlrdgtohhmpdhrtghpthhtoheprhhosggvrhhtmhhhrggrshesghhmrghilhdrtghomhdp rhgtphhtthhopehthhhomhgrshdrmhhunhhrohesghhmrghilhdrtghomhdprhgtphhtth hopehhlhhinhhnrghkrgesihhkihdrfhhipdhrtghpthhtohepnhhorghhsehlvggruggs ohgrthdrtghomhdprhgtphhtthhopehpghhsqhhlqdhhrggtkhgvrhhssehpohhsthhgrh gvshhqlhdrohhrgh X-ME-Proxy: Feedback-ID: id4a34324:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 1 Dec 2025 15:28:10 -0500 (EST) Date: Mon, 1 Dec 2025 15:28:09 -0500 From: Andres Freund To: Melanie Plageman Cc: Matthias van de Meent , pgsql-hackers@postgresql.org, Thomas Munro , Heikki Linnakangas , Noah Misch , Robert Haas , Michael Paquier Subject: Re: Buffer locking is special (hints, checksums, AIO writes) Message-ID: References: <6kmid26do57ykqfpvq6iieniy4djsymhrypkjccazq5g4bbe6a@2y6owwv7qpex> <3je3ahgf7rrmmurxo6hnlhg5d3ffwfrtjwjxd6jm5srlv5iebp@vxqk5qtgmowr> <3w7v3w6a57jnssokap4k7thoekig72flnyhd4wp3yftzdd7lm7@f6lpcfen6hr7> <6rgb2nvhyvnszz4ul3wfzlf5rheb2kkwrglthnna7qhe24onwr@vw27225tkyar> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk Hi, On 2025-11-21 12:52:38 -0500, Melanie Plageman wrote: > > 0004: Use 64bit atomics for BufferDesc.state - at this point nothing uses the > > additional bits yet, though. Some annoying reformatting required to avoid > > long lines. > > I noticed that the BUF_STATE_GET_REFCOUNT and BUF_STATE_GET_USAGECOUNT > macros cast the return value to a uint32. We won't use the extra bits > but we did bother to keep the macro result sized to the field width > before so keeping it uint32 is probably more confusing now that state > is 64 bit. I can't really follow - why would we want to return a 64bit value if none of the values ever can get anywhere near that big? > Not related to this patch, but I noticed GetBufferDescriptor() calls > for a uint32 and all the callers pretty much pass a signed int — > wonder why it calls for uint32. It's not strictly required - no Buffers exist bet INT32_MAX and UINT32_MAX. However, GetBufferDescriptor() cannot be used for local buffers (which would have a negative buffer id), therefore a uint32 is fine. Many of the callers have dedicated branches to deal with local buffers and therefore couldn't use a uint32. > > 0006+0007: This is preparatory work for 0008, but also worthwhile on its > > own. The private refcount stuff does show up in profiles. The reason it's > > related is that without these changes the added information in 0008 makes that > > worse. > > I found it slightly confusing that this commit appears to > unnecessarily add the PrivateRefCountData struct (given that it > doesn't need it to do the new parallel array thing). You could wait > until you need it in 0008, but 0008 is big as it is, so it probably is > fine where it is. It seemed too annoying to whack the code around multiple times... > in InitBufferManagerAccess(), why do you have > > memset(&PrivateRefCountArrayKeys, 0, sizeof(Buffer)); > seems like it should be > memset(PrivateRefCountArrayKeys, 0, sizeof(PrivateRefCountArrayKeys)); Ugh, indeed. > I wonder how easy it will be to keep the Buffer in sync between > PrivateRefCountArrayKeys and the PrivateRefCountEntry — would a helper > function help? I don't think we really need it, the existing helper functions are where it should be manipulated. > ForgetPrivateRefCountEntry doesn’t clear the data member — but maybe > it doesn’t matter... It asserts that the fields are reset, which seems to suffice. > in ReservePrivateRefCountEntry() there is a superfluous clear > > memset(&victim_entry->data, 0, sizeof(victim_entry->data)); > victim_entry->data.refcount = 0; It's indeed superfluous today. I guess I put it in as a belt and suspenders approach to future members... The compiler is easily be able to optimize that redundancy away. > 0007 > needs a commit message. overall seems fine though. This is what I've since written: bufmgr: Add one-entry cache for private refcount The private refcount entry for a buffer is often looked up repeatedly for the same buffer, e.g. to pin and then unpin a buffer. Benchmarking shows that it's worthwhile to have a one-entry cache for that case. With that cache in place, it's worth splitting GetPrivateRefCountEntry() into a small inline portion (for the cache hit case) and an out-of-line helper for the rest. This is helpful for some workloads today, but becomes more important in an upcoming patch that will utilize the private refcount infrastructure to also store whether the buffer is currently locked, as that increases the rate of lookups substantially. > You should probably capitalize the "c" of "count" in > PrivateRefcountEntryLast to be consistent with the other names. Ooops, yes. Greetings, Andres Freund