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 1w9lC0-001iln-2t for pgsql-hackers@arkaria.postgresql.org; Mon, 06 Apr 2026 14:44:45 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w9lBz-009JuJ-0t for pgsql-hackers@arkaria.postgresql.org; Mon, 06 Apr 2026 14:44:43 +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 1w9lBy-009Ju3-0z for pgsql-hackers@lists.postgresql.org; Mon, 06 Apr 2026 14:44:43 +0000 Received: from fhigh-b3-smtp.messagingengine.com ([202.12.124.154]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1w9lBv-00000000ugN-1yLR for pgsql-hackers@lists.postgresql.org; Mon, 06 Apr 2026 14:44:42 +0000 Received: from phl-compute-04.internal (phl-compute-04.internal [10.202.2.44]) by mailfhigh.stl.internal (Postfix) with ESMTP id 683AB7A01F0; Mon, 6 Apr 2026 10:44:36 -0400 (EDT) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-04.internal (MEProxy); Mon, 06 Apr 2026 10:44:36 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=anarazel.de; h= cc:cc: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=fm2; t=1775486675; x=1775573075; bh=ng2BFSors5 +/Yaj3xchfntuj3Yn5ixY+9Y5ecxLGRSE=; b=MpwW+e5dExdp0VQBXO0lLx8/L7 K65/SJbOb44OFZuVnTm57NpRyPJh2mAAG4RHk7+KiCFKmGbBSFl1wIL30r+6jnJL 6hgSBBtanV57WOCyRSYcIA6VDlaNwDp/zd3IY+uqqHdAsXwfqOYKswHGJ0mcTkIz DlUSuXXBc/lh/s8DfdX6ofiVr1QU1U9AGMJvB6UwNZSQfATBYTf/SZjW3rULP/Fi jHlFo7odJ6MJeMQdk0Goh6PhrlkgYrkk94rU/Wqsa+BndrMWznHkOlIPkM434zii Fs+WFQB6m5cGpTZPoCtDnK+WrM27grHo4mkg35a0NNLx6y5py6iqc3irQplw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc: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=fm2; t= 1775486675; x=1775573075; bh=ng2BFSors5+/Yaj3xchfntuj3Yn5ixY+9Y5 ecxLGRSE=; b=H0xXZAqOzLWwJXNOPBXmCsHolvQy8g+jM1oj8aajPAP/+vlMr2u z0mLb5YKCGKCZsf5fAbCFWErl+zE4nnc/RTtYnFhQW0Tl9g7XYBL0JiMKKiFC0XD V5AxIiMb8jLoLiiT6nnp8avoM5ldtevO0GzKlccGC3drF5HyXZMREaSZinlTem3z wrYEx/rH+it9VrkgOcADbUi8UQR6bfZ7dC08ANkImWoXV0nGIxp7CfUkXj0k1AVp uU8DdOSB66wQ0J+ZDnGYdldG3GQTFsVqjnJykPxWYeW61ED3/OpThFvL9Eb64+34 E0DnyJjx1pmwE9bv4ROwlHQ8mmjdXNclhiA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefhedrtddtgddujeellecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenucfjug hrpeffhffvvefukfhfgggtuggjsehttdfstddttddvnecuhfhrohhmpeetnhgurhgvshcu hfhrvghunhguuceorghnughrvghssegrnhgrrhgriigvlhdruggvqeenucggtffrrghtth gvrhhnpeeffffgledvffegtdevlefgtdeggffhvdekgfegteeiveejkeetudelveejhfeu geenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpegrnh gurhgvshesrghnrghrrgiivghlrdguvgdpnhgspghrtghpthhtohepjedpmhhouggvpehs mhhtphhouhhtpdhrtghpthhtohepmhgvlhgrnhhivghplhgrghgvmhgrnhesghhmrghilh drtghomhdprhgtphhtthhopehrvghshhhkvghkihhrihhllhesghhmrghilhdrtghomhdp rhgtphhtthhopehrohgsvghrthhmhhgrrghssehgmhgrihhlrdgtohhmpdhrtghpthhtoh ephhhlihhnnhgrkhgrsehikhhirdhfihdprhgtphhtthhopehpghhsqhhlqdhhrggtkhgv rhhssehlihhsthhsrdhpohhsthhgrhgvshhqlhdrohhrghdprhgtphhtthhopegrrdhmrg hkhhhmuhhtohhvsehpohhsthhgrhgvshhprhhordhruhdprhgtphhtthhopeiggehmmhhm seihrghnuggvgidqthgvrghmrdhruh X-ME-Proxy: Feedback-ID: id4a34324:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 6 Apr 2026 10:44:34 -0400 (EDT) Date: Mon, 6 Apr 2026 10:44:33 -0400 From: Andres Freund To: Alexey Makhmutov Cc: Melanie Plageman , PostgreSQL Hackers , Kirill Reshke , Andrey Borodin , Robert Haas , Heikki Linnakangas Subject: Re: eliminate xl_heap_visible to reduce WAL (and eventually set VM on-access) Message-ID: <7clovcjtacv6peujpfaimeynrkcd4anp6ohbdd3ncgtjo67anb@ylcccepdiuz2> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk Hi, On 2026-04-06 17:30:51 +0300, Alexey Makhmutov wrote: > Sorry for the late note for the already committed patch, but I have a > question on the last part of the 'heap_xlog_prune_freeze' function related > to the FSM update (it was committed in add323d -'Eliminate > XLOG_HEAP2_VISIBLE from vacuum phase III'). FWIW, I don't think it's ever too late to look at commits, and certainly not when it's a commit from the same release. > Currently it contains the following logic: > > ... > Size freespace = 0; > ... > if (BufferIsValid(buffer)) > { > if ((xlrec.flags & (XLHP_HAS_REDIRECTIONS | > XLHP_HAS_DEAD_ITEMS | > XLHP_HAS_NOW_UNUSED_ITEMS)) || > (vmflags & VISIBILITYMAP_VALID_BITS)) > freespace = PageGetHeapFreeSpace(BufferGetPage(buffer)); > ... > UnlockReleaseBuffer(buffer); > } > ... > if (freespace > 0) > XLogRecordPageWithFreeSpace(rlocator, blkno, freespace); > ... > > My question is about the last check ('freespace > 0') - do we really want to > call 'XLogRecordPageWithFreeSpace' only if 'freespace' is greater than 0? As > I understand, the zero value is a perfectly valid output of the > 'PageGetHeapFreeSpace' call (i.e. page has no space or no free line items > while we mark all rows as frozen/visible), but with the current > implementation we will skip FSM update in such case. I don't have a strong opinion on this, but I think it's pretty defensible to record only when there's free space. The whole goal of updating the FSM during recovery is to make sure that free space can be found fairly quickly after promotion (it's also beneficial in some crash recovery cases, but not that much). If the page filled up during an insert / update / delete, we will have updated the FSM with that information at that point: /* * If the page is running low on free space, update the FSM as well. * Arbitrarily, our definition of "low" is less than 20%. We can't do much * better than that without knowing the fill-factor for the table. * * XXX: Don't do this if the page was restored from full page image. We * don't bother to update the FSM in that case, it doesn't need to be * totally accurate anyway. */ if (action == BLK_NEEDS_REDO && freespace < BLCKSZ / 5) XLogRecordPageWithFreeSpace(target_locator, blkno, freespace); The reason to update the FSM after something pruning / vacuuming related is that there now might be *more* space available than before, it shouldn't shrink. Obviously the FSM is not crashsafe, so updating it with 0 during replay could avoid some unnecessary page reads after a promotion. But I'm not sure that that's particularly worth optimizing for. With all that said, I'm somewhat doubtful that freespace > 0 filters out a meaningful amount of freespace updates, it's rare for pages to be that full. Greetings, Andres Freund