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.96) (envelope-from ) id 1vx4QQ-00DirZ-18 for pgsql-hackers@arkaria.postgresql.org; Mon, 02 Mar 2026 14:39:11 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vx4QO-001Ok0-2O for pgsql-hackers@arkaria.postgresql.org; Mon, 02 Mar 2026 14:39:09 +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.96) (envelope-from ) id 1vx4QO-001Ojs-0Z for pgsql-hackers@lists.postgresql.org; Mon, 02 Mar 2026 14:39:08 +0000 Received: from mail-wr1-x435.google.com ([2a00:1450:4864:20::435]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vx4QJ-000000001rO-3pOX for pgsql-hackers@lists.postgresql.org; Mon, 02 Mar 2026 14:39:08 +0000 Received: by mail-wr1-x435.google.com with SMTP id ffacd0b85a97d-437711e9195so3510937f8f.1 for ; Mon, 02 Mar 2026 06:39:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cybertec.at; s=google; t=1772462343; x=1773067143; darn=lists.postgresql.org; h=message-id:date:mime-version:comments:references:in-reply-to :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=2UnLLFeyb+9lNKJNydL+QYocMXS7RMDBKoVjkqIRj00=; b=eVeko80ASivvPt+ORzcG0w9WqZlQ3DZZek1WUj9CHFWroE6bBiNuqgVdRSe1IT7kAt 7P+o/KIlyJgIKtGnaNvNXbgYLofnQaT43/sCYT+OHm/eKjs+OadnZCvB30KFA8nQ5/vq MHHtvFsDcha+LmF3scguDz7p9p+0JaLr1fqCU/i8qj3TRwzsf1Rj4dBweQINVNw9c6ga K7JUrMWhU+IJngHntcYWiyJ2AeOypwWBjqcpEq0tf6zQx164kCMGy7hyfNgITwRo7Cak qcX0rfIo+shaCorvrE/7nK6xNGHjclu1PNZ7VNHMSloaZFAYnKPgFpl2fUA6S3LVtlkd qBKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772462343; x=1773067143; h=message-id:date:mime-version:comments:references:in-reply-to :subject:cc:to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=2UnLLFeyb+9lNKJNydL+QYocMXS7RMDBKoVjkqIRj00=; b=lB3pOpV1Tv0kH/DMCtErGu1U2coJnV+rlYdRwkLm3TmRwNpjifOmuMWsDy40/d+1NX fPRuSfV7JXVMAcxioTdb2uh3PhgJ2PcQh4ARlxGGjblEyi2+97b8nDCK39cOEBejvEGb mD7+kx5JGI2arm5+yuehjXQvVkAMzTp+NcOkiH/gI4QbtgVsWMYvnZksT3+Gw27fY3Iv +ktg6yVqoZ58CgfPO6Q3pEHRvSgQ7kLBDjIkSO1u5N023fmGs0181n5jhfaJ1Dv2nckO TUA/TDszJ4mNQnaFnECQO+uUKqeBK9Om4pLgFqj+26hdHZiLyAmhDsnW0zV9EPvykXCT eeUw== X-Forwarded-Encrypted: i=1; AJvYcCX+B4tiYctVu7oNOvCI4A3lN6R9Nl2sL5lsTWmuRWwLGxj7t6zwCdqkLJhxNnR/jTia1ukg9BhhDwbrmEB1@lists.postgresql.org X-Gm-Message-State: AOJu0YxCIUGM5CKmA9da9ZnpxFU2HeyedJ2C/nU5jb50XfQ3XRYL58h+ 7zkdCTxPR6jGph1bOOxnbxPiwgQfwJ4dfZKL3hn/0Msd2yW8M7+5z8u/L+/ls/VZi6vO2EjQ7XL alr67Y+4= X-Gm-Gg: ATEYQzx2bCxpXVfxRAKG+79ZYmeuN8n/1wKA4ZeA+EgMyt8hLWR93VDjLLRwFzUsMdz 7qfUEh8qd9MrNW7GVCH14cPw2YENtq23P2nWGDkBEN+B+Y9KD6a+dRgdcrvbpCOY8SNoxUcIhk4 oHIoE5XVXnS+XPsDrbf6tnAHOSdBliGLwrY6VJSyIKmc27WPAhkstqdNDcK3zf1Fg8QKQPpliTU oMK5gQqZK2L+hoN7rZOu5XVRnDlyDKujvHkvhMQK1XcdgSpYhnlbyuKvgA1DM+1Bo3pRfHDdt5h 7uXpb85YdZIgnXM5XcheGpagPHrn7fdpGiBdODfLkbKBDud43C6slR7mwPKW2M6c+wBApaDe7cE wgNkBOm/iC0jG5JYDv30quAJYiADQ9+VI4ViVtG7PsIi4EkQnM+qFBD+1Y7JFypphesCTI6kjPB 1VLs11JczwzzrMLdEWelGDCtcuXEkvWPcg+b2xb/lyHf5ZdGk= X-Received: by 2002:a05:600c:548a:b0:483:c12b:fe46 with SMTP id 5b1f17b1804b1-483c9bdb2edmr213699395e9.10.1772462343101; Mon, 02 Mar 2026 06:39:03 -0800 (PST) Received: from localhost (109-81-168-142.rct.o2.cz. [109.81.168.142]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd70e6c9sm361072465e9.8.2026.03.02.06.39.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 06:39:02 -0800 (PST) From: Antonin Houska To: Mihail Nikalayeu cc: Alvaro Herrera , Pg Hackers , Robert Treat Subject: Re: Adding REPACK [concurrently] In-reply-to: References: <202602251618.dpgvox64vziz@alvherre.pgsql> <97234.1772046253@localhost> <87648.1772217509@localhost> Comments: In-reply-to Mihail Nikalayeu message dated "Sat, 28 Feb 2026 16:16:00 +0100." X-Mailer: MH-E 8.6+git; nmh 1.8; GNU Emacs 28.3 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Date: Mon, 02 Mar 2026 15:39:01 +0100 Message-ID: <67772.1772462341@localhost> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=-=-= Content-Type: text/plain Mihail Nikalayeu wrote: > Some review comments: Thanks again! > ------------ > > > attrs = palloc0_array(Datum, desc->natts); > > isnull = palloc0_array(bool, desc->natts); > > It looks like there is a memory leak with those arrays. I suppose you mean store_change(). Yes, I tried to free the individual chunks and forgot these. The next version uses a new, per-change memory context. > > ident_idx = RelationGetReplicaIndex(rel); > > if (!OidIsValid(ident_idx) && OidIsValid(rel->rd_pkindex)) > > check_repack_concurrently_requirements uses rd_pkindex as fallback. > > But rebuild_relation_finish_concurrent does not contain such logic: > > > ident_idx_old = RelationGetReplicaIndex(OldHeap); Good point. I added a new argument to rebuild_relation_finish_concurrent() so that the identity index is only determined once. > ------------ > > > > > > > > ConditionVariablePrepareToSleep(&shared->cv); > > > > for (;;) > > > > { > > > > bool initialized; > > > > > > > > SpinLockAcquire(&shared->mutex); > > > > initialized = shared->initialized; > > > > SpinLockRelease(&shared->mutex); > > > src/backend/commands/cluster.c:3663 > > > > > > I think we should check GetBackgroundWorkerPid for worker status, to > > > not wait forever in case of some issue with the worker. > > > ConditionVariableSleep() calls CHECK_FOR_INTERRUPTS(). That should process > > error messages from the worker. > > Hm, yes, and RepackWorkerShutdown will detach the queue. But > ProcessRepackMessages does not react somehow to SHM_MQ_DETACHED - just > ignores. Or am I missing something? On ERROR / FATAL, RepackWorkerShutdown() should send the message before detaching. elog.c does it via send_message_to_frontend(), due to the previous call of pq_redirect_to_shm_mq() in RepackWorkerMain(). ProcessRepackMessages() then only needs to care about the message, not about the worker's detaching. > ------------ > > > build_identity_key > > .... > > n = ident_idx->indnatts; > > Should we use indnkeyatts here? Definitely. I missed the addition of the INCLUDE columns feature during maintenance of pg_squeeze, and copied the bug to REPACK. Fixed. > ------------ > > > build_identity_key > > .... > > entry->sk_collation = att->attcollation; > > Should we use index collation (not heap) here? > entry->sk_collation = ident_idx_rel->rd_indcollation[i]; AFAIC they should be equal, but what you propose simplifies the code a bit. Done. > ------------ > > > SnapBuildInitialSnapshotForRepack > > What is about to add defensive checks like SnapBuildInitialSnapshot does? > > > if (!builder->committed.includes_all_transactions) > > elog(ERROR, "cannot build an initial slot snapshot, not all transactions are monitored anymore"); Initially I added a header comment (XXX) to SnapBuildInitialSnapshotForRepack() saying that some of the checks, including this one, could be adopted. The checks were problematic in the backend executing REPACK. However, they appear to be fine if the code is executed by the logical decoding worker. So what I'm trying now is to add a new argument "repack" to SnapBuildInitialSnapshot() and remove the original 0003 diff ("Move conversion of a historic to MVCC snapshot to a separate function.") from the series altogether. -- Antonin Houska Web: https://www.cybertec-postgresql.com --=-=-= Content-Type: text/x-diff; charset=utf-8 Content-Disposition: attachment; filename=v37-0001-Add-REPACK-command.patch Content-Transfer-Encoding: quoted-printable