Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1it1cw-0001D6-Rs for pgsql-hackers@arkaria.postgresql.org; Sun, 19 Jan 2020 03:51:55 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1it1ct-0004LW-P3 for pgsql-hackers@arkaria.postgresql.org; Sun, 19 Jan 2020 03:51:51 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1it1ct-0004LK-2R for pgsql-hackers@lists.postgresql.org; Sun, 19 Jan 2020 03:51:51 +0000 Received: from mail-pj1-x1042.google.com ([2607:f8b0:4864:20::1042]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1it1cl-0001zi-Io for pgsql-hackers@postgresql.org; Sun, 19 Jan 2020 03:51:49 +0000 Received: by mail-pj1-x1042.google.com with SMTP id bg7so5352371pjb.5 for ; Sat, 18 Jan 2020 19:51:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=leadboat.com; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=OSt5kxXy5xmAfIbanw377imJC8PCzUmVjpJND+Kx1Mc=; b=N5ZOi/xLsbCGUUgI/jtcFmIZ3ShxDFtS4jIB3mBoKT4gpppxjKhf9uNhrJrJ0vapYK KB+bgyk78yFp3Wc7AQjlWRYExs5qR2z2NVsmh0FMoolhUf6Cm3G63QCtW63H6tZs3aSp h+Qp+L4rg8QMHU124Lh7rkSylTGdFXm7gB8aM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=OSt5kxXy5xmAfIbanw377imJC8PCzUmVjpJND+Kx1Mc=; b=s49E/RV+8moJzCbo33JXZaY68D9wotS4ry3yRBO4zJUcjovkeEQyrodH5xATgSjNxQ Rd6ZfqWXIikxpC60udrj1L+pT5ZqatV7HCJykTb00nACgkX4lTFLgIv/x7VqESUcMTpS xMtYxyYr9XGqTcBp/MPzJJHDyx2BE3uGJ2EyGaD3LkYYKPfJXR4fdHz5HzKTeReG8O24 XzK/VgGy6r2zX7QwuK3O4IhDhKcbfXyUSh3Dr33lH1G7yYvqYXYGetSmakdaeqUi9o2O RJUSaDvglXR+XDsBQV93Hmq1BEuY6p26VDX5geOHuTvmDZOFEQNkgxtadxz9fmf+0nQM PJIw== X-Gm-Message-State: APjAAAULC1RGhBssIiRS6ENJJIrkuNmz3ZA19lflBKZ84iJYqVreHkwj hFWASJVxBq032U0v0yfUFf472w== X-Google-Smtp-Source: APXvYqx4b2jMEdzH/q602M7k44PVyRIcvZAjY6HgdrzvRqogal7aDcGK0gNzz5MMIFjlXjLjDdYrBw== X-Received: by 2002:a17:902:d898:: with SMTP id b24mr8092146plz.133.1579405901873; Sat, 18 Jan 2020 19:51:41 -0800 (PST) Received: from rfd.leadboat.com (108-233-125-46.lightspeed.sntcca.sbcglobal.net. [108.233.125.46]) by smtp.gmail.com with ESMTPSA id l10sm12705645pjy.5.2020.01.18.19.51.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 18 Jan 2020 19:51:41 -0800 (PST) Date: Sat, 18 Jan 2020 19:51:39 -0800 From: Noah Misch To: Kyotaro Horiguchi Cc: robertmhaas@gmail.com, pgsql-hackers@postgresql.org, 9erthalion6@gmail.com, andrew.dunstan@2ndquadrant.com, hlinnaka@iki.fi, michael@paquier.xyz Subject: Re: [HACKERS] WAL logging problem in 9.4.3? Message-ID: <20200119035139.GA2811524@rfd.leadboat.com> References: <20191226.124639.5401358775142406.horikyota.ntt@gmail.com> <20200114.193522.177274387863061991.horikyota.ntt@gmail.com> <20200115.171857.1170166613760719188.horikyota.ntt@gmail.com> <20200116.142057.1250623796779593147.horikyota.ntt@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200116.142057.1250623796779593147.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: Precedence: bulk On Tue, Jan 14, 2020 at 07:35:22PM +0900, Kyotaro Horiguchi wrote: > At Thu, 26 Dec 2019 12:46:39 +0900 (JST), Kyotaro Horiguchi wrote in > > At Wed, 25 Dec 2019 16:15:21 -0800, Noah Misch wrote in > > > === Defect 1: Forgets to skip WAL after SAVEPOINT; DROP TABLE; ROLLBACK TO > > > > > > A test in transactions.sql now fails in AssertPendingSyncs_RelationCache(), > > > when running "make check" under wal_level=minimal. I test this way: > > > > > > printf '%s\n%s\n' 'wal_level = minimal' 'max_wal_senders = 0' >$PWD/minimal.conf > > > make check TEMP_CONFIG=$PWD/minimal.conf > > > > > > Self-contained demonstration: > > > begin; > > > create table t (c int); > > > savepoint q; drop table t; rollback to q; -- forgets table is skipping wal > > > commit; -- assertion failure > > This is complex than expected. The DROP TABLE unconditionally removed > relcache entry. To fix that, I tried to use rd_isinvalid but it failed > because there's a state that a relcache invalid but the corresponding > catalog entry is alive. > > In the attached patch 0002, I added a boolean in relcache that > indicates that the relation is already removed in catalog but not > committed. This design could work, but some if its properties aren't ideal. For example, RelationIdGetRelation() can return a !rd_isvalid relation when the relation has been dropped. What others designs did you consider, if any? On Thu, Jan 16, 2020 at 02:20:57PM +0900, Kyotaro Horiguchi wrote: > --- a/src/backend/utils/cache/relcache.c > +++ b/src/backend/utils/cache/relcache.c > @@ -3114,8 +3153,10 @@ AtEOXact_cleanup(Relation relation, bool isCommit) > */ > if (relation->rd_createSubid != InvalidSubTransactionId) > { > - if (isCommit) > - relation->rd_createSubid = InvalidSubTransactionId; > + relation->rd_createSubid = InvalidSubTransactionId; > + > + if (isCommit && !relation->rd_isdropped) > + {} /* Nothing to do */ What is the purpose of this particular change? This executes at the end of a top-level transaction. We've already done any necessary syncing, and we're clearing any flags that caused WAL skipping. I think it's no longer productive to treat dropped relations differently. > @@ -3232,6 +3272,19 @@ AtEOSubXact_cleanup(Relation relation, bool isCommit, > } > } > > + /* > + * If this relation registered pending sync then dropped, subxact rollback > + * cancels the uncommitted drop, and commit propagates it to the parent. > + */ > + if (relation->rd_isdropped) > + { > + Assert (!relation->rd_isvalid && > + (relation->rd_createSubid != InvalidSubTransactionId || > + relation->rd_firstRelfilenodeSubid != InvalidSubTransactionId)); > + if (!isCommit) > + relation->rd_isdropped = false; This does the wrong thing when there exists some subtransaction rollback that does not rollback the DROP: \pset null 'NULL' begin; create extension pg_visibility; create table droppedtest (c int); select 'droppedtest'::regclass::oid as oid \gset savepoint q; drop table droppedtest; release q; -- rd_dropped==true select * from pg_visibility_map(:oid); -- processes !rd_isvalid rel (not ideal) savepoint q; select 1; rollback to q; -- rd_dropped==false (wrong) savepoint q; select 1; rollback to q; select pg_relation_size(:oid), pg_relation_filepath(:oid), has_table_privilege(:oid, 'SELECT'); -- all nulls, okay select * from pg_visibility_map(:oid); -- assertion failure rollback;