Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bFTz1-0004pF-C5 for pgsql-hackers@arkaria.postgresql.org; Tue, 21 Jun 2016 22:17:23 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.84_2) (envelope-from ) id 1bFTz0-0005pY-8J for pgsql-hackers@arkaria.postgresql.org; Tue, 21 Jun 2016 22:17:22 +0000 Received: from makus.postgresql.org ([2001:4800:1501:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1bFTxb-0004KR-QT for pgsql-hackers@postgresql.org; Tue, 21 Jun 2016 22:15:55 +0000 Received: from smtprelay0128.b.hostedemail.com ([64.98.42.128] helo=smtprelay.b.hostedemail.com) by makus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1bFTxU-0005nN-4v for pgsql-hackers@postgresql.org; Tue, 21 Jun 2016 22:15:54 +0000 Received: from filter.hostedemail.com (10.5.19.248.rfc1918.com [10.5.19.248]) by smtprelay02.b.hostedemail.com (Postfix) with ESMTP id 894DBD39B7; Tue, 21 Jun 2016 22:15:46 +0000 (UTC) X-Session-Marker: 616C76686572726540616C76682E6E6F2D69702E6F7267 X-Spam-Summary: 13,1.2,0,,d41d8cd98f00b204,alvherre@alvh.no-ip.org,:::::::,RULES_HIT:41:355:379:599:800:871:960:967:968:973:988:989:1260:1263:1311:1312:1313:1314:1345:1359:1431:1437:1515:1516:1518:1519:1534:1541:1575:1594:1595:1596:1711:1730:1747:1764:1777:1792:2393:2525:2553:2560:2563:2682:2685:2691:2859:2933:2937:2939:2942:2945:2947:2951:2954:3022:3138:3139:3140:3141:3142:3353:3865:3866:3867:3868:3870:3871:3872:3874:3934:3936:3938:3941:3944:3947:3950:3953:3956:3959:4605:4659:5007:6119:6261:6748:7281:7514:7903:8660:8957:9025:9036:9121:10008:10394:10400:10848:11232:11256:11257:11604:11638:11658:11914:12043:12296:12438:12517:12519:12555:12660:12663:13148:13230:13439:13894:13895:14181:14659:14721:21080:21324,0,RBL:none,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:fn,MSBL:0,DNSBL:none,Custom_rules:0:1:0,LFtime:3,LUA_SUMMARY:none X-HE-Tag: land83_325aacf85c41d X-Filterd-Recvd-Size: 4482 Received: from alvin.alvh.no-ip.org (unknown [216.155.90.98]) (Authenticated sender: alvherre@alvh.no-ip.org) by omf07.b.hostedemail.com (Postfix) with ESMTPA; Tue, 21 Jun 2016 22:15:45 +0000 (UTC) Received: by alvin.alvh.no-ip.org (Postfix, from userid 1000) id 2A911686; Tue, 21 Jun 2016 18:15:43 -0400 (CLT) Date: Tue, 21 Jun 2016 18:15:43 -0400 From: Alvaro Herrera To: Robert Haas Cc: Andrew Gierth , Stephen Frost , "pgsql-hackers@postgresql.org" Subject: Re: MultiXactId error after upgrade to 9.3.4 Message-ID: <20160621221543.GA123505@alvherre.pgsql> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="qMm9M+Fa2AknHoGS" Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20160621200922.GA106138@alvherre.pgsql> User-Agent: Mutt/1.5.23 (2014-03-12) X-Pg-Spam-Score: -0.4 (/) List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-hackers Precedence: bulk Sender: pgsql-hackers-owner@postgresql.org --qMm9M+Fa2AknHoGS Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit Alvaro Herrera wrote: > Robert Haas wrote: > > On Fri, Jun 17, 2016 at 9:33 AM, Andrew Gierth > > wrote: > > >>>>>> "Robert" == Robert Haas writes: > > > >> Why is the correct rule not "check for and ignore pre-upgrade mxids > > > >> before even trying to fetch members"? > > > > > > Robert> I entirely believe that's the correct rule, but doesn't > > > Robert> implementing it require a crystal balll? > > > > > > Why would it? Pre-9.3 mxids are identified by the combination of flag > > > bits in the infomask, see Alvaro's patch. > > > > I see the patch, but I don't see much explanation of why the patch is > > correct, which I think is pretty scary in view of the number of > > mistakes we've already made in this area. > > ... and actually the patch fails one isolation tests in 9.3, which is > why I haven't pushed (I haven't tested 9.4 but I suppose it should be > the same). I'm looking into that now. Ah, it should have been obvious; the reason it's failing is because 9.3 and 9.4 lack commit 27846f02c176 which removed MultiXactHasRunningRemoteMembers(), so the straight backpatch plus conflict fixes left one GetMultiXactIdMembers call with the allow_old flag to true. The attached patch fixes that omission. -- Álvaro Herrera http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services --qMm9M+Fa2AknHoGS Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="locked-upgraded-93-fixup.patch" Content-Transfer-Encoding: quoted-printable commit 17507b2a04b8c381997410d1fe3fbaacc34f5a31=1B[m Author: Alvaro Herrera AuthorDate: Tue Jun 21 18:07:49 2016 -0400 CommitDate: Tue Jun 21 18:07:49 2016 -0400 fixup MultiXactHasRunningRemoteMembers diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/tr= ansam/multixact.c index 15de62d..efbca6f 100644 --- a/src/backend/access/transam/multixact.c +++ b/src/backend/access/transam/multixact.c @@ -1448,7 +1448,7 @@ MultiXactHasRunningRemoteMembers(MultiXactId multi) int nmembers; int i; =20 - nmembers =3D GetMultiXactIdMembers(multi, &members, true); + nmembers =3D GetMultiXactIdMembers(multi, &members, false); if (nmembers <=3D 0) return false; =20 diff --git a/src/backend/utils/time/tqual.c b/src/backend/utils/time/tqual.c index 9d7050a..931e2fb 100644 --- a/src/backend/utils/time/tqual.c +++ b/src/backend/utils/time/tqual.c @@ -701,7 +701,9 @@ HeapTupleSatisfiesUpdate(HeapTupleHeader tuple, Command= Id curcid, =20 if (tuple->t_infomask & HEAP_XMAX_IS_MULTI) { - if (MultiXactHasRunningRemoteMembers(xmax)) + if (HEAP_LOCKED_UPGRADED(tuple->t_infomask)) + return HeapTupleMayBeUpdated; + else if (MultiXactHasRunningRemoteMembers(xmax)) return HeapTupleBeingUpdated; else return HeapTupleMayBeUpdated; @@ -725,6 +727,7 @@ HeapTupleSatisfiesUpdate(HeapTupleHeader tuple, Command= Id curcid, =20 /* not LOCKED_ONLY, so it has to have an xmax */ Assert(TransactionIdIsValid(xmax)); + Assert(!HEAP_LOCKED_UPGRADED(tuple->t_infomask)); =20 /* updating subtransaction must have aborted */ if (!TransactionIdIsCurrentTransactionId(xmax)) --qMm9M+Fa2AknHoGS Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers --qMm9M+Fa2AknHoGS--