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 1mM9jJ-0004AR-5B for pgsql-hackers@arkaria.postgresql.org; Fri, 03 Sep 2021 13:59:41 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1mM9jI-00046v-3D for pgsql-hackers@arkaria.postgresql.org; Fri, 03 Sep 2021 13:59:40 +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 1mM9jH-00046n-8l for pgsql-hackers@lists.postgresql.org; Fri, 03 Sep 2021 13:59:39 +0000 Received: from out3-smtp.messagingengine.com ([66.111.4.27]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mM9jE-0003fv-La for pgsql-hackers@lists.postgresql.org; Fri, 03 Sep 2021 13:59:38 +0000 Received: from compute6.internal (compute6.nyi.internal [10.202.2.46]) by mailout.nyi.internal (Postfix) with ESMTP id BF46C5C014D; Fri, 3 Sep 2021 09:59:33 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute6.internal (MEProxy); Fri, 03 Sep 2021 09:59:33 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:content-type :date:from:in-reply-to:message-id:mime-version:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm3; bh=gxfufP7N3hdsnnZ68wLw3NqBOWXffIipq3uWR1D4WvY=; b=ow7biTlp GXrkYgAE59eygi6454yXncMGBem3aEfMbxBk+Uyyelrg9j05ylXh1IrTKcq5B18Y PUkr6Itty5grUcEMWm1+B12RHldf8+mQ+cipYkp2djO74BiYH3B+X6hwbCfC42Au 1hdw3da3bFBG8bKUuENRClRp3lplew8jB3Iw3IUTuAbI/eNWuPsmyHUas/xIZ6cO 7KehXee6+Pfxpvn+OFI+31PZYQDJvc/wwL1YjFLNozl44dRwNNvmC3KKUZ71YKW7 mSkBYL+aDrOKGIb4+ufkLTO69oU/IP03aXW90MW6E1YlibhWtRP8JUjyfXEqDkB5 xFQRU3FRqO987Q== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvtddruddvjedgjedtucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpeffhffvuffkgggtugfgjgesthekre dttddtjeenucfhrhhomheptehlvhgrrhhoucfjvghrrhgvrhgruceorghlvhhhvghrrhgv segrlhhvhhdrnhhoqdhiphdrohhrgheqnecuggftrfgrthhtvghrnhepudejveejffejve duudetvdekieeuiedtvdeileefkeevjedufeeguedvjefhueelnecuffhomhgrihhnpegv nhhtvghrphhrihhsvggusgdrtghomhenucevlhhushhtvghrufhiiigvpedtnecurfgrrh grmhepmhgrihhlfhhrohhmpegrlhhvhhgvrhhrvgesrghlvhhhrdhnohdqihhprdhorhhg X-ME-Proxy: Received: by mail.messagingengine.com (Postfix) with ESMTPA; Fri, 3 Sep 2021 09:59:32 -0400 (EDT) Received: by perhan.alvh.no-ip.org (Postfix, from userid 1000) id 7D6152A07D0; Fri, 3 Sep 2021 09:59:29 -0400 (-04) Date: Fri, 3 Sep 2021 09:59:29 -0400 From: Alvaro Herrera To: Kyotaro Horiguchi Cc: masao.fujii@oss.nttdata.com, andres@anarazel.de, pgsql-hackers@lists.postgresql.org, bossartn@amazon.com, mengjuan.cmj@alibaba-inc.com, Jakub.Wartak@tomtom.com Subject: Re: prevent immature WAL streaming Message-ID: <202109031359.by2swmsx6ha2@alvherre.pgsql> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20210903.160904.904317102157226316.horikyota.ntt@gmail.com> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On 2021-Sep-03, Kyotaro Horiguchi wrote: > At Thu, 2 Sep 2021 18:43:33 -0400, Alvaro Herrera wrote in > 0002: > > + XLogRecPtr abortedContrecordPtr; /* LSN of incomplete record at end of > > + * WAL */ > > The name sounds like the start LSN. doesn't contrecordAbort(ed)Ptr work? I went over various iterations of the name of this, and still not entirely happy. I think we need to convey the ideas that * This is the endptr+1 of the known-good part of the record, that is, the beginning of the next part of the record. I think "endPtr" summarizes this well; we use this name elsewhere. * At some point before recovery, this was the last WAL record that existed * there is an invalid contrecord, or we were looking for a contrecord and found invalid data * this record is incomplete So maybe 1. incompleteRecEndPtr 2. finalInvalidRecEndPtr 3. brokenContrecordEndPtr > > if (!(pageHeader->xlp_info & XLP_FIRST_IS_CONTRECORD)) > > { > > report_invalid_record(state, > > "there is no contrecord flag at %X/%X", > > LSN_FORMAT_ARGS(RecPtr)); > > - goto err; > > + goto aborted_contrecord; > > This loses the exclusion check between XLP_FIRST_IS_CONTRECORD and > _IS_ABROTED_PARTIAL. Is it okay? (I don't object to remove the check.). Yeah, I was unsure about that. I think it's good to have it as a cross-check, though it should never occur. I'll put it back. Another related point is whether it's a good idea to have the ereport() about the bit appearing in a not-start-of-page address being a PANIC. If we degrade to WARNING then it'll be lost in the noise, but I'm not sure what else can we do. (If it's a PANIC, then you end up with an unusable database). > I didin't thought this as an aborted contrecord. but on second > thought, when we see a record broken in any style, we stop recovery at > the point. I agree to the change and all the silmiar changes. > > + /* XXX should we goto aborted_contrecord here? */ > > I think it should be aborted_contrecord. > > When that happens, the loaded bytes actually looked like the first > fragment of a continuation record to xlogreader, even if the cause > were a broken total_len. So if we abort the record there, the next > time xlogreader will meet XLP_FIRST_IS_ABORTED_PARTIAL at the same > page, and correctly finds a new record there. > > On the other hand if we just errored-out there, we will step-back to > the beginning of the broken record in the previous page or segment > then start writing a new record there but that is exactly what we want > to avoid now. Hmm, yeah, makes sense. -- Álvaro Herrera 39°49'30"S 73°17'W — https://www.EnterpriseDB.com/