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 1rpCEO-005YCj-SZ for pgsql-hackers@arkaria.postgresql.org; Tue, 26 Mar 2024 19:13:09 +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 1rpCEN-003nLP-TY for pgsql-hackers@arkaria.postgresql.org; Tue, 26 Mar 2024 19:13:07 +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 1rpCEN-003nKJ-HU for pgsql-hackers@lists.postgresql.org; Tue, 26 Mar 2024 19:13:07 +0000 Received: from mail-ed1-x529.google.com ([2a00:1450:4864:20::529]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1rpCEJ-006dEV-9k for pgsql-hackers@lists.postgresql.org; Tue, 26 Mar 2024 19:13:06 +0000 Received: by mail-ed1-x529.google.com with SMTP id 4fb4d7f45d1cf-56c36c67deaso414915a12.0 for ; Tue, 26 Mar 2024 12:13:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; t=1711480381; x=1712085181; darn=lists.postgresql.org; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=iMi9vIrMgs9dQ8qRKdCY7vb0kKwp+FTwyg/E3CgPjQc=; b=Yt7nekr+HSrJy6ekAdIDQKAg6jlIYCg6w2kov//JGfBSuD9KMHrZ1/TmtQa7x4tnpB V5v7Z/n/LqThfmF4eevJr4qNTWQ8zOQYoo4NYaCT/CJtzBnMlPZkPU/hVvO9edduuB54 Fsv/zNvdibrfvJX6i7jTQPBn0Cm8/bez9DtHnai8TsxqBlVDeyKO/zW7f48udZf+irbH tNBlTvVoaL939NpUPw0DhEeER6oXHNu9Q4FFmGSSFDYAyHm4dpcZCFCTuIUSmxAaS28g KeK2ebpTRVNyNIALNOVqzxCHtGvmZTFzuiMaOG/m1ZQHQzSxgHQqhjG1zWdhCHPPQUIB q/KQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711480381; x=1712085181; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=iMi9vIrMgs9dQ8qRKdCY7vb0kKwp+FTwyg/E3CgPjQc=; b=KSNunrA87U7V0EUsJE4jlndSHU+PMpDYvgeW/2kAmTw0M7s56OQVxRuDqQXPZtLvDB VMNopIbQBgDOgjhTILu+ikuGPzXA6U9C2JSllA0Y95HFshIwp47l1B3ntc+nSBHgp0wT kemFXTLlc3Hh51ZJd8fEYLKBZUmgvA6twImRoCtrJERPhjbKt3hzC5FHthRfrlrid7Lc 1cw7uMPzgnmnE2hxs5wxqmQrhI+i7zRAqosUfNirpjJR3E4rRzDvm3I5otCAxl8isx4w tC4FPeOsr+Ygq2nHoq3SIUKWOsIfPqBX2IRQOOa4mhVFI0w0PIP3sAx8BfMIx9fwWNrJ YnAw== X-Forwarded-Encrypted: i=1; AJvYcCW8AQ0eoOtq+hAdsIZ+g/zwSt4DkO5KsGXpaeiwcalj/9DcQiBqrn6cOnFsUoFaAJ7+/3tTB4xDamGsWmgGtGTS2eu+RC5trskvH4LoLnaId0HZ X-Gm-Message-State: AOJu0YyMUiNeEvcTvpVULewOGBK6rUqAz7xJ32XiDZHPWGJQ0iIYsAe/ ljBKerjvrJYQcJ3oB0h5nGDDx7Fnj71TrQhfiTJm+ABWgcmBGLlRzLfD3YwdbQ== X-Google-Smtp-Source: AGHT+IEiOb6sEofFvGkBdfZN0GZBftx3LGzoI8lvl36nO4gUrRfkXr0T6hpqpMJvAURKIHSZi3CjjQ== X-Received: by 2002:a50:99d8:0:b0:56b:a8ea:964a with SMTP id n24-20020a5099d8000000b0056ba8ea964amr7675458edb.9.1711480381248; Tue, 26 Mar 2024 12:13:01 -0700 (PDT) Received: from [10.137.0.18] (ip-86-49-229-30.bb.vodafone.cz. [86.49.229.30]) by smtp.gmail.com with ESMTPSA id x19-20020aa7cd93000000b00568c613570dsm4462658edv.79.2024.03.26.12.13.00 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 26 Mar 2024 12:13:00 -0700 (PDT) Message-ID: <47524383-6fd1-4b13-8c4e-fb918b1d35ba@enterprisedb.com> Date: Tue, 26 Mar 2024 20:12:59 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: speed up a logical replica setup Content-Language: en-US To: Euler Taveira , "kuroda.hayato@fujitsu.com" , Peter Eisentraut , Bharath Rupireddy Cc: Amit Kapila , Shlok Kyal , "pgsql-hackers@lists.postgresql.org" , Michael Paquier , Andres Freund , Ashutosh Bapat , =?UTF-8?Q?Fabr=C3=ADzio_de_Royes_Mello?= , vignesh C References: <9a9c7e65-c47b-4400-a63e-ac6169c0860e@app.fastmail.com> <2f0b73f3-e7c0-4e95-9712-1993442a6b64@app.fastmail.com> <34637e7f-0330-420d-8f45-1d022962d2fe@app.fastmail.com> <7a970912-0b77-4942-84f7-2c9ca0bc05a5@eisentraut.org> <44de4e04-db22-40ed-8ba9-46387dc8bf83@app.fastmail.com> <3fa9ef0f-b277-4c13-850a-8ccc04de1406@eisentraut.org> <65b841a8-0c2f-4953-b9cd-240fce84b90b@eisentraut.org> From: Tomas Vondra In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On 3/26/24 03:53, Euler Taveira wrote: > On Mon, Mar 25, 2024, at 1:06 PM, Hayato Kuroda (Fujitsu) wrote: >> ## Analysis for failure 1 >> >> The failure caused by a time lag between walreceiver finishes and pg_is_in_recovery() >> returns true. >> >> According to the output [1], it seems that the tool failed at wait_for_end_recovery() >> with the message "standby server disconnected from the primary". Also, lines >> "redo done at..." and "terminating walreceiver process due to administrator command" >> meant that walreceiver was requested to shut down by XLogShutdownWalRcv(). >> >> According to the source, we confirm that walreceiver is shut down in >> StartupXLOG()->FinishWalRecovery()->XLogShutdownWalRcv(). Also, SharedRecoveryState >> is changed to RECOVERY_STATE_DONE (this meant the pg_is_in_recovery() return true) >> at the latter part of StartupXLOG(). >> >> So, if there is a delay between FinishWalRecovery() and change the state, the check >> in wait_for_end_recovery() would be failed during the time. Since we allow to miss >> the walreceiver 10 times and it is checked once per second, the failure occurs if >> the time lag is longer than 10 seconds. >> >> I do not have a good way to fix it. One approach is make NUM_CONN_ATTEMPTS larger, >> but it's not a fundamental solution. > > I was expecting that slow hosts might have issues in wait_for_end_recovery(). > As you said it took a lot of steps between FinishWalRecovery() (where > walreceiver is shutdown -- XLogShutdownWalRcv) and SharedRecoveryState is set to > RECOVERY_STATE_DONE. If this window takes longer than NUM_CONN_ATTEMPTS * > WAIT_INTERVAL (10 seconds), it aborts the execution. That's a bad decision > because it already finished the promotion and it is just doing the final > preparation for the host to become a primary. > > /* > * If it is still in recovery, make sure the target server is > * connected to the primary so it can receive the required WAL to > * finish the recovery process. If it is disconnected try > * NUM_CONN_ATTEMPTS in a row and bail out if not succeed. > */ > res = PQexec(conn, > "SELECT 1 FROM pg_catalog.pg_stat_wal_receiver"); > if (PQntuples(res) == 0) > { > if (++count > NUM_CONN_ATTEMPTS) > { > stop_standby_server(subscriber_dir); > pg_log_error("standby server disconnected from the primary"); > break; > } > } > else > count = 0; /* reset counter if it connects again */ > > This code was add to defend against the death/crash of the target server. There > are at least 3 options: > > (1) increase NUM_CONN_ATTEMPTS * WAIT_INTERVAL seconds. We discussed this constant > and I decided to use 10 seconds because even in some slow hosts, this time > wasn't reached during my tests. It seems I forgot to test the combination of slow > host, asserts enabled, and ubsan. I didn't notice that pg_promote() uses 60 > seconds as default wait. Maybe that's a reasonable value. I checked the > 004_timeline_switch test and the last run took: 39.2s (serinus), 33.1s > (culicidae), 18.31s (calliphoridae) and 27.52s (olingo). > > (2) check if the primary is not running when walreceiver is not available on the > target server. Increase the connection attempts iif the primary is not running. > Hence, the described case doesn't cause an increment on the count variable. > > (3) set recovery_timeout default to != 0 and remove pg_stat_wal_receiver check > protection against the death/crash target server. I explained in a previous > message that timeout may occur in cases that WAL replay to reach consistent > state takes more than recovery-timeout seconds. > > Option (1) is the easiest fix, however, we can have the same issue again if a > slow host decides to be even slower, hence, we have to adjust this value again. > Option (2) interprets the walreceiver absence as a recovery end and if the > primary server is running it can indicate that the target server is in the > imminence of the recovery end. Option (3) is not as resilient as the other > options. > > The first patch implements a combination of (1) and (2). > >> ## Analysis for failure 2 >> >> According to [2], the physical replication slot which is specified as primary_slot_name >> was not used by the walsender process. At that time walsender has not existed. >> >> ``` >> ... >> pg_createsubscriber: publisher: current wal senders: 0 >> pg_createsubscriber: command is: SELECT 1 FROM pg_catalog.pg_replication_slots WHERE active AND slot_name = 'physical_slot' >> pg_createsubscriber: error: could not obtain replication slot information: got 0 rows, expected 1 row >> ... >> ``` >> >> Currently standby must be stopped before the command and current code does not >> block the flow to ensure the replication is started. So there is a possibility >> that the checking is run before walsender is launched. >> >> One possible approach is to wait until the replication starts. Alternative one is >> to ease the condition. > > That's my suggestion too. I reused NUM_CONN_ATTEMPTS (that was renamed to > NUM_ATTEMPTS in the first patch). See second patch. > Perhaps I'm missing something, but why is NUM_CONN_ATTEMPTS even needed? Why isn't recovery_timeout enough to decide if wait_for_end_recovery() waited long enough? IMHO the test should simply pass PG_TEST_DEFAULT_TIMEOUT when calling pg_createsubscriber, and that should do the trick. Increasing PG_TEST_DEFAULT_TIMEOUT is what buildfarm animals doing things like ubsan/valgrind already use to deal with exactly this kind of timeout problem. Or is there a deeper problem with deciding if the system is in recovery? regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company