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 1rs3Sr-004Wfq-PX for pgsql-hackers@arkaria.postgresql.org; Wed, 03 Apr 2024 16:27:54 +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 1rs3Sq-004Vya-Oe for pgsql-hackers@arkaria.postgresql.org; Wed, 03 Apr 2024 16:27:52 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rs3Sq-004VyS-Ab for pgsql-hackers@lists.postgresql.org; Wed, 03 Apr 2024 16:27:52 +0000 Received: from mail-wm1-x32b.google.com ([2a00:1450:4864:20::32b]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1rs3Sn-000Nx5-JD for pgsql-hackers@lists.postgresql.org; Wed, 03 Apr 2024 16:27:51 +0000 Received: by mail-wm1-x32b.google.com with SMTP id 5b1f17b1804b1-41624c40b44so133955e9.0 for ; Wed, 03 Apr 2024 09:27:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712161667; x=1712766467; darn=lists.postgresql.org; h=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=2rSXn5XNIVo/Oq+4ZsYXMfKxEpTgPYsaRdTIQjF6tBw=; b=nZ0Dy2sA3kwdCEyq+FW6oosUXiSSKtD6Lwj+2VWckXu0lKtNSlTDXUeHcjbfuznwyv OO4pA0uNpegn74MzlQu0q+d572Bv+cXVs9AP5VSks94WN1TP/rQYyvpemP46qH0P72bh ViwJ2fbJEgA139U0gNSt8dEIWW0TQiVosyLFDRJ4M5DDyY3WitZAL2PhGYC9jJLCcOFh 3dL1Z2HPK0Lxgkw5sJ9r2SoTVFWjtNNS1Q9YxOkPL7BDoK4r98QeqbCNQsIp9LyqOWAe bK8MQ9e4mINlhkCwlQozcOnQWaCv+QfccEDsuVJ1Zfz1YoR6Dze+sHMGRGWaUV5r2rHM m8hg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712161667; x=1712766467; h=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=2rSXn5XNIVo/Oq+4ZsYXMfKxEpTgPYsaRdTIQjF6tBw=; b=t4MUuc232K7G+r5wn8ppO2SC1WwKSsovHam/UBdsV3YB4b0qsUpYPHpbu+xwe0QzHn WCQBiYX6gqNswRP+o45govl/J3iZjt9xIaHFUB4kWhSwqOShEqf1YntHtbK+8VPRZQ9V tr+YGeWZK0Mok/mvDCnaaWsIfNaK33Bm2GXqWSTvauzJvIJJuUO2C03wwmz2aF1cpgFq IxThQq65Cu4h3PY3MlQlfEyPk+LI51Tw5i7F1/2SABM7BvOprcXivcOCAm+5phsoa2c+ gxN53X3baakkE7q0rhF72bd+WqY/Uu64h6QUUcocjMDZWAspGcvES1PRr+lhfeCa1EiL +BuA== X-Forwarded-Encrypted: i=1; AJvYcCXgTCdoR8S6IyFKk4z5LmtDJ7aT9NqgxoGourV+UhO8d/KeQ9bTP01sq1SgTqADFifQmYBA4w/IaAmbmoGOU7no2XxDtrZLHxwXyn4w2wmTux2W X-Gm-Message-State: AOJu0YzMkpVzHCWi2vl6ZqQKXNupQAbS7FwD+LVI6er+gzS6Maxm8Uvv VtcLCgpz2TuKGxO6IVZHRTD+XWRUVZxSol5XXLlTrayr36exLsfd X-Google-Smtp-Source: AGHT+IFYXPQwfO6P1iqsIzJL0a//0jsGIErnjvxabU4Uyli+8IwT9G3+/Qfj9/Z/I5JglEKcljxsiw== X-Received: by 2002:a05:6000:1364:b0:33e:7a7c:a058 with SMTP id q4-20020a056000136400b0033e7a7ca058mr6838wrz.18.1712161667381; Wed, 03 Apr 2024 09:27:47 -0700 (PDT) Received: from ip-10-97-1-34.eu-west-3.compute.internal (ec2-15-236-134-5.eu-west-3.compute.amazonaws.com. [15.236.134.5]) by smtp.gmail.com with ESMTPSA id c3-20020adfef43000000b003439d2a5f99sm1591463wrp.55.2024.04.03.09.27.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Apr 2024 09:27:46 -0700 (PDT) Date: Wed, 3 Apr 2024 16:27:45 +0000 From: Bertrand Drouvot To: Bharath Rupireddy Cc: shveta malik , Masahiko Sawada , Amit Kapila , Nathan Bossart , PostgreSQL Hackers Subject: Re: Introduce XID age and inactive timeout based replication slot invalidation Message-ID: References: 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 Wed, Apr 03, 2024 at 08:28:04PM +0530, Bharath Rupireddy wrote: > On Wed, Apr 3, 2024 at 6:46 PM Bertrand Drouvot > wrote: > > > > Just one comment on v32-0001: > > > > +# Synced slot on the standby must get its own inactive_since. > > +is( $standby1->safe_psql( > > + 'postgres', > > + "SELECT '$inactive_since_on_primary'::timestamptz <= '$inactive_since_on_standby'::timestamptz AND > > + '$inactive_since_on_standby'::timestamptz <= '$slot_sync_time'::timestamptz;" > > + ), > > + "t", > > + 'synchronized slot has got its own inactive_since'); > > + > > > > By using <= we are not testing that it must get its own inactive_since (as we > > allow them to be equal in the test). I think we should just add some usleep() > > where appropriate and deny equality during the tests on inactive_since. > > > Except for the above, v32-0001 LGTM. > > Thanks. Please see the attached v33-0001 patch after removing equality > on inactive_since TAP tests. Thanks! v33-0001 LGTM. > On Wed, Apr 3, 2024 at 1:47 PM Bertrand Drouvot > wrote: > > Some comments regarding v31-0002: > > > > T2 === > > > > In case the slot is invalidated on the primary, > > > > primary: > > > > postgres=# select slot_name, inactive_since, invalidation_reason from pg_replication_slots where slot_name = 's1'; > > slot_name | inactive_since | invalidation_reason > > -----------+-------------------------------+--------------------- > > s1 | 2024-04-03 06:56:28.075637+00 | inactive_timeout > > > > then on the standby we get: > > > > standby: > > > > postgres=# select slot_name, inactive_since, invalidation_reason from pg_replication_slots where slot_name = 's1'; > > slot_name | inactive_since | invalidation_reason > > -----------+------------------------------+--------------------- > > s1 | 2024-04-03 07:06:43.37486+00 | inactive_timeout > > > > shouldn't the slot be dropped/recreated instead of updating inactive_since? > > The sync slots that are invalidated on the primary aren't dropped and > recreated on the standby. Yeah, right (I was confused with synced slots that are invalidated locally). > However, I > found that the synced slot is acquired and released unnecessarily > after the invalidation_reason is synced from the primary. I added a > skip check in synchronize_one_slot to skip acquiring and releasing the > slot if it's locally found inactive. With this, inactive_since won't > get updated for invalidated sync slots on the standby as we don't > acquire and release the slot. CR1 === Yeah, I can see: @@ -575,6 +575,13 @@ synchronize_one_slot(RemoteSlot *remote_slot, Oid remote_dbid) " name slot \"%s\" already exists on the standby", remote_slot->name)); + /* + * Skip the sync if the local slot is already invalidated. We do this + * beforehand to save on slot acquire and release. + */ + if (slot->data.invalidated != RS_INVAL_NONE) + return false; Thanks to the drop_local_obsolete_slots() call I think we are not missing the case where the slot has been invalidated on the primary, invalidation reason has been synced on the standby and later the slot is dropped/ recreated manually on the primary (then it should be dropped/recreated on the standby too). Also it seems we are not missing the case where a sync slot is invalidated locally due to wal removal (it should be dropped/recreated). > > > CR5 === > > > > + /* > > + * This function isn't expected to be called for inactive timeout based > > + * invalidation. A separate function InvalidateInactiveReplicationSlot is > > + * to be used for that. > > > > Do you think it's worth to explain why? > > Hm, I just wanted to point out the actual function here. I modified it > to something like the following, if others feel we don't need that, I > can remove it. Sorry If I was not clear but I meant to say "Do you think it's worth to explain why we decided to create a dedicated function"? (currently we "just" explain that we created one). Regards, -- Bertrand Drouvot PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com