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 1rpAyE-005Ryy-78 for pgsql-hackers@arkaria.postgresql.org; Tue, 26 Mar 2024 17:52:22 +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 1rpAyC-002F3K-IJ for pgsql-hackers@arkaria.postgresql.org; Tue, 26 Mar 2024 17:52:20 +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 1rpAyC-002F3C-8n for pgsql-hackers@lists.postgresql.org; Tue, 26 Mar 2024 17:52:20 +0000 Received: from mail-wr1-x435.google.com ([2a00:1450:4864:20::435]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1rpAy8-006ZN0-0f for pgsql-hackers@lists.postgresql.org; Tue, 26 Mar 2024 17:52:19 +0000 Received: by mail-wr1-x435.google.com with SMTP id ffacd0b85a97d-33ed7ba1a42so3936754f8f.2 for ; Tue, 26 Mar 2024 10:52:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1711475535; x=1712080335; 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=jh9YJYdUDHpZXVRcAAZ3UIu1N71Q6Zn4bsV09gzIzfQ=; b=YYWJ6NjBLnmNxwe1rJ0QtvlCacCkPspn9bT3jNPywt2YsoYZJn3Zv+WJcx/fjlBurl tDyZeVL4g7rKE5uIry3jL3uSkEhBuvy4kML3QUDlbuBcqgHdl+2ulYTN51UcH9fYFLsu bFI9Tz5bOF4m37dTUlErYKmkJWLjLDTHWy4wX9gVYTFk4ponrAU0xOxl5p6+LTIPMd6k VrxyL1RHeopl0p3Ns2XgVNPPj8XKliYR1OE2XVOxVzPhIRFAN2c+kjLQkBQ2/Sf2wfuU jzxQAAyQ8Ej8JglufOslNpkPimvAheWKkP2vHrJ7Ytz8xFTG+NHqG5Tm5i+M9d19qtsJ mVpw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711475535; x=1712080335; 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=jh9YJYdUDHpZXVRcAAZ3UIu1N71Q6Zn4bsV09gzIzfQ=; b=TacbqOqnI9tJZA+WquTnqQ8s9bUTehj7EvBw22bIfLhTrqOrJJWGPMVQwDUeX4UMBV GQ8K1jRJ61kn0th0x7BYFIv3aguPe+Czf/+6Gc0RLKzxQxgDzyBt5Wgj31O1vMep4IVK f3YM62DEM2wDsHtzW+f1MD9HSlVjIeyl6oPZNLd4+gNQum6G5jWSogXX1O/DTp1I1qIl QtPV0c52ODqz6OnHN9sWo0KYXEmqDXC7shvHEMFAl5fznapDVCTsOIfQMMcVtPEEaIs6 uJgQMIl9jbR07yGTAMnFrcWZ1og5sT8cDmJX6EO497/m4FRgiBT3K47jw+ztJa1iQM7y ovUQ== X-Forwarded-Encrypted: i=1; AJvYcCVurcVUYkCR3lB+p1oVNcNqcc4HKtPnVoYEK/TyUHtVgLcDlQvfRAhGR493pyRJ0TsObNZDy7sv7AxvxZH5PCBYyEpHMSrl2pKGofIMBtYuzerL X-Gm-Message-State: AOJu0YwpOgeUAuxoPp1soTO0yWLKoLwdqLtMCLrHnrGPtUbGdU7qUgcL u5a2f7SJfTunH4p9kA2VTXK/diOsSVguFDu1bB5XArp+xwmY0pmq X-Google-Smtp-Source: AGHT+IHIYc9VOuX1zyMVONvAD/sPGvHXlDLguoAAy75zTLTmu5RJFa26OhT6OXfvJvfrVjJBC4U3pQ== X-Received: by 2002:a05:6000:10f:b0:33e:d51d:4cf with SMTP id o15-20020a056000010f00b0033ed51d04cfmr7869669wrx.64.1711475534429; Tue, 26 Mar 2024 10:52:14 -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 x18-20020adfffd2000000b0034181bea3b0sm12792792wrs.3.2024.03.26.10.52.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Mar 2024 10:52:14 -0700 (PDT) Date: Tue, 26 Mar 2024 17:52:12 +0000 From: Bertrand Drouvot To: Bharath Rupireddy Cc: shveta malik , 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 Tue, Mar 26, 2024 at 09:59:23PM +0530, Bharath Rupireddy wrote: > On Tue, Mar 26, 2024 at 4:35 PM Bharath Rupireddy > wrote: > > > > If we just sync inactive_since value for synced slots while in > > recovery from the primary, so be it. Why do we need to update it to > > the current time when the slot is being created? We don't expose slot > > creation time, no? Aren't we fine if we just sync the value from > > primary and document that fact? After the promotion, we can reset it > > to the current time so that it gets its own time. > > I'm attaching v24 patches. It implements the above idea proposed > upthread for synced slots. I've now separated > s/last_inactive_time/inactive_since and synced slots behaviour. Please > have a look. Thanks! ==== v24-0001 It's now pure mechanical changes and it looks good to me. ==== v24-0002 1 === This commit does two things: 1) Updates inactive_since for sync slots with the value received from the primary's slot. Tested it and it does that. 2 === 2) Ensures the value is set to current timestamp during the shutdown of slot sync machinery to help correctly interpret the time if the standby gets promoted without a restart. Tested it and it does that. 3 === +/* + * Reset the synced slots info such as inactive_since after shutting + * down the slot sync machinery. + */ +static void +update_synced_slots_inactive_time(void) Looks like the comment "reset" is not matching the name of the function and what it does. 4 === + /* + * We get the current time beforehand and only once to avoid + * system calls overhead while holding the lock. + */ + if (now == 0) + now = GetCurrentTimestamp(); Also +1 of having GetCurrentTimestamp() just called one time within the loop. 5 === - if (!(RecoveryInProgress() && slot->data.synced)) + if (!(InRecovery && slot->data.synced)) slot->inactive_since = GetCurrentTimestamp(); else slot->inactive_since = 0; Not related to this change but more the way RestoreSlotFromDisk() behaves here: For a sync slot on standby it will be set to zero and then later will be synchronized with the one coming from the primary. I think that's fine to have it to zero for this window of time. Now, if the standby is down and one sets sync_replication_slots to off, then inactive_since will be set to zero on the standby at startup and not synchronized (unless one triggers a manual sync). I also think that's fine but it might be worth to document this behavior (that after a standby startup inactive_since is zero until the next sync...). 6 === + print "HI $slot_name $name $inactive_since $slot_creation_time\n"; garbage? 7 === +# Capture and validate inactive_since of a given slot. +sub capture_and_validate_slot_inactive_since +{ + my ($node, $slot_name, $slot_creation_time) = @_; + my $name = $node->name; We know have capture_and_validate_slot_inactive_since at 2 places: 040_standby_failover_slots_sync.pl and 019_replslot_limit.pl. Worth to create a sub in Cluster.pm? Regards, -- Bertrand Drouvot PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com