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.94.2) (envelope-from ) id 1qLCQR-002YmA-TK for pgsql-bugs@arkaria.postgresql.org; Mon, 17 Jul 2023 00:49:20 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1qLCQP-002Trm-VM for pgsql-bugs@arkaria.postgresql.org; Mon, 17 Jul 2023 00:49: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.94.2) (envelope-from ) id 1qLCQP-002Tre-G8 for pgsql-bugs@lists.postgresql.org; Mon, 17 Jul 2023 00:49:17 +0000 Received: from mail-yw1-x1135.google.com ([2607:f8b0:4864:20::1135]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1qLCQI-000x21-3N for pgsql-bugs@lists.postgresql.org; Mon, 17 Jul 2023 00:49:16 +0000 Received: by mail-yw1-x1135.google.com with SMTP id 00721157ae682-579e5d54e68so42973367b3.1 for ; Sun, 16 Jul 2023 17:49:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=leadboat.com; s=google; t=1689554948; x=1692146948; h=user-agent:in-reply-to:content-transfer-encoding :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=TsyqUsnG/NHqjJS2fRtUKFAFuM1e2piVxfUiw2tDgFc=; b=Zu1jzMNMbznaKeogyF19lP2VWs+tH80EEeurc0zB6jG7P4xUl0Mw2zkLFLCJee1oqQ dHeU2ufp5769f8fs9/gBkH90xYagze9que+ETopttSJnKeQw6uYo8+waf+hCQph75M1O mU/Dinh/KgJJOx31FBe1kHZL9dizVZWNwsAz4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689554948; x=1692146948; h=user-agent:in-reply-to:content-transfer-encoding :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=TsyqUsnG/NHqjJS2fRtUKFAFuM1e2piVxfUiw2tDgFc=; b=YtpdQi+sbrppB3kuJEFPDXbdEyr4NgZbEolYFR6fKIGMesC2HwvGNxfqCRIb1yvU8t Bv6v2SzVxDkXDu1rz1qCLfnex5J7sNaBTQ4t+3bzfO+uadU5CvdsSpqSLCRrKqHUHJ5p 1eLxiDL21kgkQd3jrd6Eyeg69O8Fr9iyaHN2jD2ILqrbaiRiomL6B0sFzFWomCpSf+k0 87Had8Wujq70tigtP06xByYiO2MOHttNWsZR4l2qUZjrJAa5K4iHar9mpel6cVJZm540 gVPvk1zRB1okB+U4iIHbts9Usq8cnFmAIsGjbvOW4PmsYchPv43PUaDbYi1r+UHyCm8S v8vA== X-Gm-Message-State: ABy/qLbhvBY0rg0bN1jSO+X3SyD6GFv5LOcC+aSbOyxgC9sQK5ljT3k2 RDYeyWbauUD5DqbHGg/AnOsZ4A== X-Google-Smtp-Source: APBJJlFkyZmoAGnWHZDbziN1j7btOljoLxKXvTjYmGYFpGJn6vtburnKt/ppNnvfxY68zNcd/eY1bA== X-Received: by 2002:a0d:ea04:0:b0:57a:fb9:7523 with SMTP id t4-20020a0dea04000000b0057a0fb97523mr10297980ywe.49.1689554948557; Sun, 16 Jul 2023 17:49:08 -0700 (PDT) Received: from rfd.leadboat.com ([2600:1702:a20:5750::2e]) by smtp.gmail.com with ESMTPSA id m140-20020a0dca92000000b00576c727498dsm3567096ywd.92.2023.07.16.17.49.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 16 Jul 2023 17:49:07 -0700 (PDT) Date: Sun, 16 Jul 2023 17:49:05 -0700 From: Noah Misch To: Kyotaro Horiguchi Cc: thomas.munro@gmail.com, exclusion@gmail.com, pgsql-bugs@lists.postgresql.org Subject: Re: BUG #17928: Standby fails to decode WAL on termination of primary Message-ID: <20230717004905.GE3826297@rfd.leadboat.com> References: <72bd036d-4f2a-8d50-b56e-6b1e3b9ba0a9@gmail.com> <20230710200012.GB3476234@rfd.leadboat.com> <20230711.155414.939136339819647605.horikyota.ntt@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20230711.155414.939136339819647605.horikyota.ntt@gmail.com> User-Agent: Mutt/1.5.24 (2015-08-30) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On Tue, Jul 11, 2023 at 03:54:14PM +0900, Kyotaro Horiguchi wrote: > At Mon, 10 Jul 2023 13:00:12 -0700, Noah Misch wrote in > > On Mon, May 15, 2023 at 03:38:17PM +1200, Thomas Munro wrote: > > > On Fri, May 12, 2023 at 6:00 AM Alexander Lakhin wrote: > > > > 2023-05-11 20:19:22.248 MSK [2037134] FATAL: invalid memory alloc request size 2021163525 > > > > 2023-05-11 20:19:22.248 MSK [2037114] LOG: startup process (PID 2037134) exited with exit code 1 On my system, testing unpatched REL_15_2, the test reached its first failure at minute 53 and its second failure at minute 189. Perhaps a faster, deterministic test would be feasible: - Use pg_logical_emit_message to fill a few segments with 0xFF. - CHECKPOINT the primary, so the standby recycles segments. - One more pg_logical_emit_message, computing the length from pg_current_wal_insert_lsn() such that new message crosses a segment boundary and ends 4 bytes before the end of a page. - Stop the primary. - If the bug is present, the standby will exit. > > > Thanks Alexander. Looking into this. I think it is probably > > > something like: recycled standby pages are not zeroed (something we > > > already needed to do something about[1]), and when we read a recycled > > > garbage size (like your "xxxx") at the end of a page at an offset > > > where we don't have a full record header on one page, we skip the > > > ValidXLogRecordHeader() call (and always did), but the check in > > > allocate_recordbuf() which previously handled that "gracefully" (well, > > > it would try to allocate up to 1GB bogusly, but it wouldn't try to > > > allocate more than that and ereport) is a bit too late. I probably > > > need to add an earlier not-too-big validation. Thinking. > > > > I agree about an earlier not-too-big validation. Like the attached? I > > haven't tested it with Alexander's recipe or pondered it thoroughly. > > I like the patch for its code clean up, but I'm afraid that it removes > the existing record length check when reading continued > pages. The removed check would be repetitive in all cases known to me, but I wouldn't mind keeping the check instead. > However, I'm unsure about merely adding a check for too-long > records, due to the potential for requesting an excessively large > amount of memory, even if it will be released shortly. > > > > [1] https://www.postgresql.org/message-id/20210505010835.umylslxgq4a6rbwg@alap3.anarazel.de > > > > Regarding [1], is it still worth zeroing recycled pages on standbys and/or > > reading the whole header before allocating xl_tot_len? (Are there benefits > > other than avoiding a 1G backend allocation or 4G frontend allocation, or is > > that benefit worth the cycles?) > > I believe reading the whole header is the most sensible approach as it > can prevent unnecessary memory requests. Another potential solution > (or hack) for this specific case is to let XLogWalRcvFlush write a > finalizing ((uint32)0) when dying is true. This stabilizes the > behavior to "invalid record length.. got 0" when running the TAP test. > --- a/src/backend/replication/walreceiver.c > +++ b/src/backend/replication/walreceiver.c > @@ -989,6 +989,15 @@ XLogWalRcvFlush(bool dying, TimeLineID tli) > { > Assert(tli != 0); > > + if (dying) > + { > + int buflen = sizeof(uint32); > + char buf[sizeof(uint32)]; > + > + memset(buf, 0, buflen); > + XLogWalRcvWrite(buf, buflen, LogstreamResult.Write, tli); > + } > + > if (LogstreamResult.Flush < LogstreamResult.Write) > { > WalRcvData *walrcv = WalRcv; That's inexpensive in cycles, and it should make the failures in question quite rare. If we do that instead of pre-zeroing, I think we'd still want to be ready for invalid lengths, for the case of unclean standby shutdown.