Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1jt47e-0006a8-QT for pgsql-hackers@arkaria.postgresql.org; Wed, 08 Jul 2020 07:04:03 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1jt47d-0003ol-NS for pgsql-hackers@arkaria.postgresql.org; Wed, 08 Jul 2020 07:04:01 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1jt47d-0003oY-As for pgsql-hackers@lists.postgresql.org; Wed, 08 Jul 2020 07:04:01 +0000 Received: from forwardcorp1o.mail.yandex.net ([2a02:6b8:0:1a2d::193]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1jt47a-0004LI-AR for pgsql-hackers@postgresql.org; Wed, 08 Jul 2020 07:04:00 +0000 Received: from myt5-23f0be3aa648.qloud-c.yandex.net (myt5-23f0be3aa648.qloud-c.yandex.net [IPv6:2a02:6b8:c12:3e29:0:640:23f0:be3a]) by forwardcorp1o.mail.yandex.net (Yandex) with ESMTP id 565532E1617; Wed, 8 Jul 2020 10:03:56 +0300 (MSK) Received: from myt5-70c90f7d6d7d.qloud-c.yandex.net (myt5-70c90f7d6d7d.qloud-c.yandex.net [2a02:6b8:c12:3e2c:0:640:70c9:f7d]) by myt5-23f0be3aa648.qloud-c.yandex.net (mxbackcorp/Yandex) with ESMTP id HPPNjymvYr-3tsqsVSc; Wed, 08 Jul 2020 10:03:56 +0300 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1594191836; bh=5BBiMCktw8H8uTy/r4sHmePINM5laqwFu2Gxx4dQOFo=; h=To:In-Reply-To:References:Date:Subject:Cc:Message-Id:From; b=zVeXt+VPDRxhgD+ZcEsiRnYFv/cSNCO/NmdtpJHv4wMIBG0WXveyzv6lqzB4x804P WnlcOs5yrKkEJB3XEv5NvK6KI9J0c1sCAF0Q9oRr0L8REu7soWgfk0DKb9Qohqc4yz tL0FVD64O4PWEHA+c62A5EQWnFgzUIu7MDyfAtkI= Authentication-Results: myt5-23f0be3aa648.qloud-c.yandex.net; dkim=pass header.i=@yandex-team.ru Received: from dynamic-vpn.dhcp.yndx.net (dynamic-vpn.dhcp.yndx.net [2a02:6b8:b081:1326::1:7]) by myt5-70c90f7d6d7d.qloud-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id yTIUNpWIfh-3the2obJ; Wed, 08 Jul 2020 10:03:55 +0300 (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client certificate not present) From: "Andrey M. Borodin" Message-Id: <2ECE132B-C042-4489-930E-DBC5D0DAB84A@yandex-team.ru> Content-Type: multipart/mixed; boundary="Apple-Mail=_6417DFCA-8F69-4394-A055-1D5E90A438C2" Mime-Version: 1.0 (Mac OS X Mail 13.0 \(3608.60.0.2.5\)) Subject: Re: MultiXact\SLRU buffers configuration Date: Wed, 8 Jul 2020 12:03:54 +0500 In-Reply-To: Cc: Kyotaro Horiguchi , pgsql-hackers To: Daniel Gustafsson References: <3B099683-ECCD-43CD-A3D6-F08C3745002A@yandex-team.ru> <20200514.151659.1224056315528271804.horikyota.ntt@gmail.com> <102F673B-C9C5-4823-A92F-96799FC61ED0@yandex-team.ru> <20200515.090333.24867479329066911.horikyota.ntt@gmail.com> X-Mailer: Apple Mail (2.3608.60.0.2.5) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --Apple-Mail=_6417DFCA-8F69-4394-A055-1D5E90A438C2 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 > 2 =D0=B8=D1=8E=D0=BB=D1=8F 2020 =D0=B3., =D0=B2 17:02, Daniel = Gustafsson =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB(=D0= =B0): >=20 >> On 15 May 2020, at 02:03, Kyotaro Horiguchi = wrote: >=20 >> Generally in such cases, condition variables would work. In the >> attached PoC, the reader side gets no penalty in the "likely" code >> path. The writer side always calls ConditionVariableBroadcast but = the >> waiter list is empty in almost all cases. But I couldn't cause the >> situation where the sleep 1000u is reached. >=20 > The submitted patch no longer applies, can you please submit an = updated > version? I'm marking the patch Waiting on Author in the meantime. Thanks, Daniel! PFA V2 Best regards, Andrey Borodin. --Apple-Mail=_6417DFCA-8F69-4394-A055-1D5E90A438C2 Content-Disposition: attachment; filename=v2-0001-Use-shared-lock-in-GetMultiXactIdMembers-for-offs.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v2-0001-Use-shared-lock-in-GetMultiXactIdMembers-for-offs.patch" Content-Transfer-Encoding: quoted-printable =46rom=20264b475fbf6ee519dc3b4eb2cca25145d2aaa569=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Andrey=20Borodin=20=0ADate:=20= Sat,=209=20May=202020=2021:19:18=20+0500=0ASubject:=20[PATCH=20v2=201/4]=20= Use=20shared=20lock=20in=20GetMultiXactIdMembers=20for=20offsets=0A=20= and=20members=0A=0APreviously=20read=20of=20multixact=20required=20= exclusive=20control=20locks=20in=0Aoffstes=20and=20members=20SLRUs.=20= This=20could=20lead=20to=20contention.=0AIn=20this=20commit=20we=20take=20= advantge=20of=20SimpleLruReadPage_ReadOnly=0Asimilar=20to=20CLOG=20= usage.=0A---=0A=20src/backend/access/transam/clog.c=20=20=20=20=20=20|=20= =202=20+-=0A=20src/backend/access/transam/commit_ts.c=20|=20=202=20+-=0A=20= src/backend/access/transam/multixact.c=20|=2012=20++++++------=0A=20= src/backend/access/transam/slru.c=20=20=20=20=20=20|=20=208=20+++++---=0A= =20src/backend/access/transam/subtrans.c=20=20|=20=202=20+-=0A=20= src/backend/commands/async.c=20=20=20=20=20=20=20=20=20=20=20|=20=202=20= +-=0A=20src/backend/storage/lmgr/predicate.c=20=20=20|=20=202=20+-=0A=20= src/include/access/slru.h=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20=20= 2=20+-=0A=208=20files=20changed,=2017=20insertions(+),=2015=20= deletions(-)=0A=0Adiff=20--git=20a/src/backend/access/transam/clog.c=20= b/src/backend/access/transam/clog.c=0Aindex=20f3da40ae01..3614d0c774=20= 100644=0A---=20a/src/backend/access/transam/clog.c=0A+++=20= b/src/backend/access/transam/clog.c=0A@@=20-643,7=20+643,7=20@@=20= TransactionIdGetStatus(TransactionId=20xid,=20XLogRecPtr=20*lsn)=0A=20=0A= =20=09/*=20lock=20is=20acquired=20by=20SimpleLruReadPage_ReadOnly=20*/=0A= =20=0A-=09slotno=20=3D=20SimpleLruReadPage_ReadOnly(XactCtl,=20pageno,=20= xid);=0A+=09slotno=20=3D=20SimpleLruReadPage_ReadOnly(XactCtl,=20pageno,=20= xid,=20false);=0A=20=09byteptr=20=3D=20= XactCtl->shared->page_buffer[slotno]=20+=20byteno;=0A=20=0A=20=09status=20= =3D=20(*byteptr=20>>=20bshift)=20&=20CLOG_XACT_BITMASK;=0Adiff=20--git=20= a/src/backend/access/transam/commit_ts.c=20= b/src/backend/access/transam/commit_ts.c=0Aindex=20= 9cdb136435..5fbbf446e3=20100644=0A---=20= a/src/backend/access/transam/commit_ts.c=0A+++=20= b/src/backend/access/transam/commit_ts.c=0A@@=20-342,7=20+342,7=20@@=20= TransactionIdGetCommitTsData(TransactionId=20xid,=20TimestampTz=20*ts,=0A= =20=09}=0A=20=0A=20=09/*=20lock=20is=20acquired=20by=20= SimpleLruReadPage_ReadOnly=20*/=0A-=09slotno=20=3D=20= SimpleLruReadPage_ReadOnly(CommitTsCtl,=20pageno,=20xid);=0A+=09slotno=20= =3D=20SimpleLruReadPage_ReadOnly(CommitTsCtl,=20pageno,=20xid,=20false);=0A= =20=09memcpy(&entry,=0A=20=09=09=20=20=20= CommitTsCtl->shared->page_buffer[slotno]=20+=0A=20=09=09=20=20=20= SizeOfCommitTimestampEntry=20*=20entryno,=0Adiff=20--git=20= a/src/backend/access/transam/multixact.c=20= b/src/backend/access/transam/multixact.c=0Aindex=20= 79ec21c75a..241d9dd78d=20100644=0A---=20= a/src/backend/access/transam/multixact.c=0A+++=20= b/src/backend/access/transam/multixact.c=0A@@=20-1321,12=20+1321,12=20@@=20= GetMultiXactIdMembers(MultiXactId=20multi,=20MultiXactMember=20= **members,=0A=20=09=20*=20time=20on=20every=20multixact=20creation.=0A=20= =09=20*/=0A=20retry:=0A-=09LWLockAcquire(MultiXactOffsetSLRULock,=20= LW_EXCLUSIVE);=0A=20=0A=20=09pageno=20=3D=20= MultiXactIdToOffsetPage(multi);=0A=20=09entryno=20=3D=20= MultiXactIdToOffsetEntry(multi);=0A=20=0A-=09slotno=20=3D=20= SimpleLruReadPage(MultiXactOffsetCtl,=20pageno,=20true,=20multi);=0A+=09= /*=20lock=20is=20acquired=20by=20SimpleLruReadPage_ReadOnly=20*/=0A+=09= slotno=20=3D=20SimpleLruReadPage_ReadOnly(MultiXactOffsetCtl,=20pageno,=20= multi,=20false);=0A=20=09offptr=20=3D=20(MultiXactOffset=20*)=20= MultiXactOffsetCtl->shared->page_buffer[slotno];=0A=20=09offptr=20+=3D=20= entryno;=0A=20=09offset=20=3D=20*offptr;=0A@@=20-1358,7=20+1358,7=20@@=20= retry:=0A=20=09=09entryno=20=3D=20MultiXactIdToOffsetEntry(tmpMXact);=0A=20= =0A=20=09=09if=20(pageno=20!=3D=20prev_pageno)=0A-=09=09=09slotno=20=3D=20= SimpleLruReadPage(MultiXactOffsetCtl,=20pageno,=20true,=20tmpMXact);=0A+=09= =09=09slotno=20=3D=20SimpleLruReadPage_ReadOnly(MultiXactOffsetCtl,=20= pageno,=20tmpMXact,=20true);=0A=20=0A=20=09=09offptr=20=3D=20= (MultiXactOffset=20*)=20MultiXactOffsetCtl->shared->page_buffer[slotno];=0A= =20=09=09offptr=20+=3D=20entryno;=0A@@=20-1382,7=20+1382,7=20@@=20retry:=0A= =20=09*members=20=3D=20ptr;=0A=20=0A=20=09/*=20Now=20get=20the=20members=20= themselves.=20*/=0A-=09LWLockAcquire(MultiXactMemberSLRULock,=20= LW_EXCLUSIVE);=0A+=09LWLockAcquire(MultiXactMemberSLRULock,=20= LW_SHARED);=0A=20=0A=20=09truelength=20=3D=200;=0A=20=09prev_pageno=20=3D=20= -1;=0A@@=20-1399,7=20+1399,7=20@@=20retry:=0A=20=0A=20=09=09if=20(pageno=20= !=3D=20prev_pageno)=0A=20=09=09{=0A-=09=09=09slotno=20=3D=20= SimpleLruReadPage(MultiXactMemberCtl,=20pageno,=20true,=20multi);=0A+=09=09= =09slotno=20=3D=20SimpleLruReadPage_ReadOnly(MultiXactMemberCtl,=20= pageno,=20multi,=20true);=0A=20=09=09=09prev_pageno=20=3D=20pageno;=0A=20= =09=09}=0A=20=0A@@=20-2745,7=20+2745,7=20@@=20= find_multixact_start(MultiXactId=20multi,=20MultiXactOffset=20*result)=0A= =20=09=09return=20false;=0A=20=0A=20=09/*=20lock=20is=20acquired=20by=20= SimpleLruReadPage_ReadOnly=20*/=0A-=09slotno=20=3D=20= SimpleLruReadPage_ReadOnly(MultiXactOffsetCtl,=20pageno,=20multi);=0A+=09= slotno=20=3D=20SimpleLruReadPage_ReadOnly(MultiXactOffsetCtl,=20pageno,=20= multi,=20false);=0A=20=09offptr=20=3D=20(MultiXactOffset=20*)=20= MultiXactOffsetCtl->shared->page_buffer[slotno];=0A=20=09offptr=20+=3D=20= entryno;=0A=20=09offset=20=3D=20*offptr;=0Adiff=20--git=20= a/src/backend/access/transam/slru.c=20= b/src/backend/access/transam/slru.c=0Aindex=2061249f4a12..96d0def5c2=20= 100644=0A---=20a/src/backend/access/transam/slru.c=0A+++=20= b/src/backend/access/transam/slru.c=0A@@=20-475,17=20+475,19=20@@=20= SimpleLruReadPage(SlruCtl=20ctl,=20int=20pageno,=20bool=20write_ok,=0A=20= =20*=20Return=20value=20is=20the=20shared-buffer=20slot=20number=20now=20= holding=20the=20page.=0A=20=20*=20The=20buffer's=20LRU=20access=20info=20= is=20updated.=0A=20=20*=0A-=20*=20Control=20lock=20must=20NOT=20be=20= held=20at=20entry,=20but=20will=20be=20held=20at=20exit.=0A+=20*=20= Control=20lock=20will=20be=20held=20at=20exit.=20If=20lock_held=20is=20= true=20at=20least=0A+=20*=20shared=20control=20lock=20must=20be=20held.=0A= =20=20*=20It=20is=20unspecified=20whether=20the=20lock=20will=20be=20= shared=20or=20exclusive.=0A=20=20*/=0A=20int=0A= -SimpleLruReadPage_ReadOnly(SlruCtl=20ctl,=20int=20pageno,=20= TransactionId=20xid)=0A+SimpleLruReadPage_ReadOnly(SlruCtl=20ctl,=20int=20= pageno,=20TransactionId=20xid,=20bool=20lock_held)=0A=20{=0A=20=09= SlruShared=09shared=20=3D=20ctl->shared;=0A=20=09int=09=09=09slotno;=0A=20= =0A=20=09/*=20Try=20to=20find=20the=20page=20while=20holding=20only=20= shared=20lock=20*/=0A-=09LWLockAcquire(shared->ControlLock,=20= LW_SHARED);=0A+=09if=20(!lock_held)=0A+=09=09= LWLockAcquire(shared->ControlLock,=20LW_SHARED);=0A=20=0A=20=09/*=20See=20= if=20page=20is=20already=20in=20a=20buffer=20*/=0A=20=09for=20(slotno=20= =3D=200;=20slotno=20<=20shared->num_slots;=20slotno++)=0Adiff=20--git=20= a/src/backend/access/transam/subtrans.c=20= b/src/backend/access/transam/subtrans.c=0Aindex=20f33ae407a6..8d8e0d9ec7=20= 100644=0A---=20a/src/backend/access/transam/subtrans.c=0A+++=20= b/src/backend/access/transam/subtrans.c=0A@@=20-123,7=20+123,7=20@@=20= SubTransGetParent(TransactionId=20xid)=0A=20=0A=20=09/*=20lock=20is=20= acquired=20by=20SimpleLruReadPage_ReadOnly=20*/=0A=20=0A-=09slotno=20=3D=20= SimpleLruReadPage_ReadOnly(SubTransCtl,=20pageno,=20xid);=0A+=09slotno=20= =3D=20SimpleLruReadPage_ReadOnly(SubTransCtl,=20pageno,=20xid,=20false);=0A= =20=09ptr=20=3D=20(TransactionId=20*)=20= SubTransCtl->shared->page_buffer[slotno];=0A=20=09ptr=20+=3D=20entryno;=0A= =20=0Adiff=20--git=20a/src/backend/commands/async.c=20= b/src/backend/commands/async.c=0Aindex=2071b7577afc..70085fc037=20100644=0A= ---=20a/src/backend/commands/async.c=0A+++=20= b/src/backend/commands/async.c=0A@@=20-2012,7=20+2012,7=20@@=20= asyncQueueReadAllNotifications(void)=0A=20=09=09=09=20*=20part=20of=20= the=20page=20we=20will=20actually=20inspect.=0A=20=09=09=09=20*/=0A=20=09= =09=09slotno=20=3D=20SimpleLruReadPage_ReadOnly(NotifyCtl,=20curpage,=0A= -=09=09=09=09=09=09=09=09=09=09=09=09InvalidTransactionId);=0A+=09=09=09=09= =09=09=09=09=09=09=09=09InvalidTransactionId,=20false);=0A=20=09=09=09if=20= (curpage=20=3D=3D=20QUEUE_POS_PAGE(head))=0A=20=09=09=09{=0A=20=09=09=09=09= /*=20we=20only=20want=20to=20read=20as=20far=20as=20head=20*/=0Adiff=20= --git=20a/src/backend/storage/lmgr/predicate.c=20= b/src/backend/storage/lmgr/predicate.c=0Aindex=20d24919f76b..e2a7d00d37=20= 100644=0A---=20a/src/backend/storage/lmgr/predicate.c=0A+++=20= b/src/backend/storage/lmgr/predicate.c=0A@@=20-948,7=20+948,7=20@@=20= SerialGetMinConflictCommitSeqNo(TransactionId=20xid)=0A=20=09=20*=20but=20= will=20return=20with=20that=20lock=20held,=20which=20must=20then=20be=20= released.=0A=20=09=20*/=0A=20=09slotno=20=3D=20= SimpleLruReadPage_ReadOnly(SerialSlruCtl,=0A-=09=09=09=09=09=09=09=09=09=09= SerialPage(xid),=20xid);=0A+=09=09=09=09=09=09=09=09=09=09= SerialPage(xid),=20xid,=20false);=0A=20=09val=20=3D=20= SerialValue(slotno,=20xid);=0A=20=09LWLockRelease(SerialSLRULock);=0A=20=09= return=20val;=0Adiff=20--git=20a/src/include/access/slru.h=20= b/src/include/access/slru.h=0Aindex=2061fbc80ef0..471c692021=20100644=0A= ---=20a/src/include/access/slru.h=0A+++=20b/src/include/access/slru.h=0A= @@=20-140,7=20+140,7=20@@=20extern=20int=09SimpleLruZeroPage(SlruCtl=20= ctl,=20int=20pageno);=0A=20extern=20int=09SimpleLruReadPage(SlruCtl=20= ctl,=20int=20pageno,=20bool=20write_ok,=0A=20=09=09=09=09=09=09=09=20=20= TransactionId=20xid);=0A=20extern=20int=09= SimpleLruReadPage_ReadOnly(SlruCtl=20ctl,=20int=20pageno,=0A-=09=09=09=09= =09=09=09=09=09=20=20=20TransactionId=20xid);=0A+=09=09=09=09=09=09=09=09= =09=20=20=20TransactionId=20xid,=20bool=20lock_held);=0A=20extern=20void=20= SimpleLruWritePage(SlruCtl=20ctl,=20int=20slotno);=0A=20extern=20void=20= SimpleLruFlush(SlruCtl=20ctl,=20bool=20allow_redirtied);=0A=20extern=20= void=20SimpleLruTruncate(SlruCtl=20ctl,=20int=20cutoffPage);=0A--=20=0A= 2.24.2=20(Apple=20Git-127)=0A=0A= --Apple-Mail=_6417DFCA-8F69-4394-A055-1D5E90A438C2 Content-Disposition: attachment; filename=v2-0002-Make-MultiXact-local-cache-size-configurable.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v2-0002-Make-MultiXact-local-cache-size-configurable.patch" Content-Transfer-Encoding: quoted-printable =46rom=20520686d6cc22a599bc06b91391171ca218c3db75=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Andrey=20Borodin=20=0ADate:=20= Mon,=2011=20May=202020=2016:17:02=20+0500=0ASubject:=20[PATCH=20v2=20= 2/4]=20Make=20MultiXact=20local=20cache=20size=20configurable=0A=0A---=0A= =20doc/src/sgml/config.sgml=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= |=2016=20++++++++++++++++=0A=20src/backend/access/transam/multixact.c=20= |=20=202=20+-=0A=20src/backend/utils/init/globals.c=20=20=20=20=20=20=20= |=20=201=20+=0A=20src/backend/utils/misc/guc.c=20=20=20=20=20=20=20=20=20= =20=20|=2010=20++++++++++=0A=20src/include/miscadmin.h=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20|=20=201=20+=0A=205=20files=20changed,=2029=20= insertions(+),=201=20deletion(-)=0A=0Adiff=20--git=20= a/doc/src/sgml/config.sgml=20b/doc/src/sgml/config.sgml=0Aindex=20= 94d99373a7..31d7c1f4b3=20100644=0A---=20a/doc/src/sgml/config.sgml=0A+++=20= b/doc/src/sgml/config.sgml=0A@@=20-1777,6=20+1777,22=20@@=20include_dir=20= 'conf.d'=0A=20=20=20=20=20=20=20=0A=20=20=20=20=20=20= =0A=20=0A+=20=20=20=20=0A+=20=20=20=20=20=20= multixact_local_cache_entries=20= (integer)=0A+=20=20=20=20=20=20=0A+=20=20=20=20=20= =20=20multixact_local_cache_entries=20= configuration=20parameter=0A+=20=20=20=20=20=20=0A= +=20=20=20=20=20=20=0A+=20=20=20=20=20=20=0A+=20=20=20=20= =20=20=20=0A+=20=20=20=20=20=20=20=20Specifies=20the=20number=20= cached=20MultiXact=20by=20backend.=20Any=20SLRU=20lookup=20is=20= preceeded=0A+=20=20=20=20=20=20=20=20by=20cache=20lookup.=20Higher=20= numbers=20of=20cache=20size=20help=20to=20deduplicate=20lock=20sets,=20= while=0A+=20=20=20=20=20=20=20=20lower=20values=20make=20cache=20lookup=20= faster.=0A+=20=20=20=20=20=20=20=20It=20defaults=20to=20256.=0A+=20=20=20= =20=20=20=20=0A+=20=20=20=20=20=20=0A+=20=20=20=20=20= =0A+=0A=20=20=20=20=20=20=0A=20=20=20=20= =20=20=20max_stack_depth=20= (integer)=0A=20=20=20=20=20=20=20=0Adiff=20--git=20= a/src/backend/access/transam/multixact.c=20= b/src/backend/access/transam/multixact.c=0Aindex=20= 241d9dd78d..445b6258a4=20100644=0A---=20= a/src/backend/access/transam/multixact.c=0A+++=20= b/src/backend/access/transam/multixact.c=0A@@=20-1589,7=20+1589,7=20@@=20= mXactCachePut(MultiXactId=20multi,=20int=20nmembers,=20MultiXactMember=20= *members)=0A=20=09qsort(entry->members,=20nmembers,=20= sizeof(MultiXactMember),=20mxactMemberComparator);=0A=20=0A=20=09= dlist_push_head(&MXactCache,=20&entry->node);=0A-=09if=20= (MXactCacheMembers++=20>=3D=20MAX_CACHE_ENTRIES)=0A+=09if=20= (MXactCacheMembers++=20>=3D=20multixact_local_cache_entries)=0A=20=09{=0A= =20=09=09dlist_node=20*node;=0A=20=09=09mXactCacheEnt=20*entry;=0Adiff=20= --git=20a/src/backend/utils/init/globals.c=20= b/src/backend/utils/init/globals.c=0Aindex=2001e739da40..f404167ad0=20= 100644=0A---=20a/src/backend/utils/init/globals.c=0A+++=20= b/src/backend/utils/init/globals.c=0A@@=20-151,3=20+151,4=20@@=20double=09= =09vacuum_cleanup_index_scale_factor;=0A=20=0A=20int=09=09=09= multixact_offsets_slru_buffers=20=3D=208;=0A=20int=09=09=09= multixact_members_slru_buffers=20=3D=2016;=0A+int=09=09=09= multixact_local_cache_entries=20=3D=20256;=0Adiff=20--git=20= a/src/backend/utils/misc/guc.c=20b/src/backend/utils/misc/guc.c=0Aindex=20= d1fbb75cd5..6443f595cc=20100644=0A---=20a/src/backend/utils/misc/guc.c=0A= +++=20b/src/backend/utils/misc/guc.c=0A@@=20-2273,6=20+2273,16=20@@=20= static=20struct=20config_int=20ConfigureNamesInt[]=20=3D=0A=20=09=09= NULL,=20NULL,=20NULL=0A=20=09},=0A=20=0A+=09{=0A+=09=09= {"multixact_local_cache_entries",=20PGC_SUSET,=20RESOURCES_MEM,=0A+=09=09= =09gettext_noop("Sets=20the=20number=20cached=20MultiXact=20by=20= backend."),=0A+=09=09=09NULL=0A+=09=09},=0A+=09=09= &multixact_local_cache_entries,=0A+=09=09256,=202,=20INT_MAX=20/=202,=0A= +=09=09NULL,=20NULL,=20NULL=0A+=09},=0A+=0A=20=09{=0A=20=09=09= {"temp_buffers",=20PGC_USERSET,=20RESOURCES_MEM,=0A=20=09=09=09= gettext_noop("Sets=20the=20maximum=20number=20of=20temporary=20buffers=20= used=20by=20each=20session."),=0Adiff=20--git=20= a/src/include/miscadmin.h=20b/src/include/miscadmin.h=0Aindex=20= bb1475ad2b..9ce2adea63=20100644=0A---=20a/src/include/miscadmin.h=0A+++=20= b/src/include/miscadmin.h=0A@@=20-163,6=20+163,7=20@@=20extern=20= PGDLLIMPORT=20int=20max_worker_processes;=0A=20extern=20PGDLLIMPORT=20= int=20max_parallel_workers;=0A=20extern=20PGDLLIMPORT=20int=20= multixact_offsets_slru_buffers;=0A=20extern=20PGDLLIMPORT=20int=20= multixact_members_slru_buffers;=0A+extern=20PGDLLIMPORT=20int=20= multixact_local_cache_entries;=0A=20=0A=20extern=20PGDLLIMPORT=20int=20= MyProcPid;=0A=20extern=20PGDLLIMPORT=20pg_time_t=20MyStartTime;=0A--=20=0A= 2.24.2=20(Apple=20Git-127)=0A=0A= --Apple-Mail=_6417DFCA-8F69-4394-A055-1D5E90A438C2 Content-Disposition: attachment; filename=v2-0003-Add-conditional-variable-to-wait-for-next-MultXac.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v2-0003-Add-conditional-variable-to-wait-for-next-MultXac.patch" Content-Transfer-Encoding: quoted-printable =46rom=20ddde253b10b87d060d34f8d7250be27a27c18c0a=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Andrey=20Borodin=20=0ADate:=20= Fri,=2022=20May=202020=2014:13:33=20+0500=0ASubject:=20[PATCH=20v2=20= 3/4]=20Add=20conditional=20variable=20to=20wait=20for=20next=20MultXact=0A= =20offset=20in=20edge=20case=0A=0A---=0A=20= src/backend/access/transam/multixact.c=20|=2023=20= ++++++++++++++++++++++-=0A=20src/backend/postmaster/pgstat.c=20=20=20=20=20= =20=20=20|=20=202=20++=0A=20src/include/pgstat.h=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20|=20=201=20+=0A=203=20files=20changed,=20= 25=20insertions(+),=201=20deletion(-)=0A=0Adiff=20--git=20= a/src/backend/access/transam/multixact.c=20= b/src/backend/access/transam/multixact.c=0Aindex=20= 445b6258a4..02de9a7c13=20100644=0A---=20= a/src/backend/access/transam/multixact.c=0A+++=20= b/src/backend/access/transam/multixact.c=0A@@=20-82,6=20+82,7=20@@=0A=20= #include=20"lib/ilist.h"=0A=20#include=20"miscadmin.h"=0A=20#include=20= "pg_trace.h"=0A+#include=20"pgstat.h"=0A=20#include=20= "postmaster/autovacuum.h"=0A=20#include=20"storage/lmgr.h"=0A=20#include=20= "storage/pmsignal.h"=0A@@=20-233,6=20+234,7=20@@=20typedef=20struct=20= MultiXactStateData=0A=20=09/*=20support=20for=20members=20= anti-wraparound=20measures=20*/=0A=20=09MultiXactOffset=20= offsetStopLimit;=09/*=20known=20if=20oldestOffsetKnown=20*/=0A=20=0A+=09= ConditionVariable=20nextoff_cv;=0A=20=09/*=0A=20=09=20*=20Per-backend=20= data=20starts=20here.=20=20We=20have=20two=20arrays=20stored=20in=20the=20= area=0A=20=09=20*=20immediately=20following=20the=20MultiXactStateData=20= struct.=20Each=20is=20indexed=20by=0A@@=20-873,6=20+875,14=20@@=20= RecordNewMultiXact(MultiXactId=20multi,=20MultiXactOffset=20offset,=0A=20= =09/*=20Exchange=20our=20lock=20*/=0A=20=09= LWLockRelease(MultiXactOffsetSLRULock);=0A=20=0A+=09/*=0A+=09=20*=20=20= Let=20everybody=20know=20the=20offset=20of=20this=20mxid=20is=20recorded=20= now.=20The=20waiters=0A+=09=20*=20=20are=20waiting=20for=20the=20offset=20= of=20the=20mxid=20next=20of=20the=20target=20to=20know=20the=0A+=09=20*=20= =20number=20of=20members=20of=20the=20target=20mxid,=20so=20we=20don't=20= need=20to=20wait=20for=0A+=09=20*=20=20members=20of=20this=20mxid=20are=20= recorded.=0A+=09=20*/=0A+=09= ConditionVariableBroadcast(&MultiXactState->nextoff_cv);=0A+=0A=20=09= LWLockAcquire(MultiXactMemberSLRULock,=20LW_EXCLUSIVE);=0A=20=0A=20=09= prev_pageno=20=3D=20-1;=0A@@=20-1367,9=20+1377,19=20@@=20retry:=0A=20=09=09= if=20(nextMXOffset=20=3D=3D=200)=0A=20=09=09{=0A=20=09=09=09/*=20Corner=20= case=202:=20next=20multixact=20is=20still=20being=20filled=20in=20*/=0A+=0A= +=09=09=09/*=0A+=09=09=09=20*=20The=20recorder=20of=20the=20next=20mxid=20= is=20just=20before=20writing=20the=20offset.=0A+=09=09=09=20*=20Wait=20= for=20the=20offset=20to=20be=20written.=0A+=09=09=09=20*/=0A+=09=09=09= ConditionVariablePrepareToSleep(&MultiXactState->nextoff_cv);=0A+=0A=20=09= =09=09LWLockRelease(MultiXactOffsetSLRULock);=0A=20=09=09=09= CHECK_FOR_INTERRUPTS();=0A-=09=09=09pg_usleep(1000L);=0A+=0A+=09=09=09= ConditionVariableSleep(&MultiXactState->nextoff_cv,=0A+=09=09=09=09=09=09= =09=09=20=20=20WAIT_EVENT_WAIT_NEXT_MXMEMBERS);=0A+=09=09=09= ConditionVariableCancelSleep();=0A=20=09=09=09goto=20retry;=0A=20=09=09}=0A= =20=0A@@=20-1847,6=20+1867,7=20@@=20MultiXactShmemInit(void)=0A=20=0A=20=09= =09/*=20Make=20sure=20we=20zero=20out=20the=20per-backend=20state=20*/=0A= =20=09=09MemSet(MultiXactState,=200,=20SHARED_MULTIXACT_STATE_SIZE);=0A+=09= =09ConditionVariableInit(&MultiXactState->nextoff_cv);=0A=20=09}=0A=20=09= else=0A=20=09=09Assert(found);=0Adiff=20--git=20= a/src/backend/postmaster/pgstat.c=20b/src/backend/postmaster/pgstat.c=0A= index=20edfa774ee4..4bce534c7a=20100644=0A---=20= a/src/backend/postmaster/pgstat.c=0A+++=20= b/src/backend/postmaster/pgstat.c=0A@@=20-3877,6=20+3877,8=20@@=20= pgstat_get_wait_ipc(WaitEventIPC=20w)=0A=20=09=09=09break;=0A=20=09=09= case=20WAIT_EVENT_XACT_GROUP_UPDATE:=0A=20=09=09=09event_name=20=3D=20= "XactGroupUpdate";=0A+=09=09case=20WAIT_EVENT_WAIT_NEXT_MXMEMBERS:=0A+=09= =09=09event_name=20=3D=20"MultiXact/WaitNextXactMembers";=0A=20=09=09=09= break;=0A=20=09=09=09/*=20no=20default=20case,=20so=20that=20compiler=20= will=20warn=20*/=0A=20=09}=0Adiff=20--git=20a/src/include/pgstat.h=20= b/src/include/pgstat.h=0Aindex=201387201382..26f828597b=20100644=0A---=20= a/src/include/pgstat.h=0A+++=20b/src/include/pgstat.h=0A@@=20-887,6=20= +887,7=20@@=20typedef=20enum=0A=20=09WAIT_EVENT_REPLICATION_SLOT_DROP,=0A= =20=09WAIT_EVENT_SAFE_SNAPSHOT,=0A=20=09WAIT_EVENT_SYNC_REP,=0A+=09= WAIT_EVENT_WAIT_NEXT_MXMEMBERS,=0A=20=09WAIT_EVENT_XACT_GROUP_UPDATE=0A=20= }=20WaitEventIPC;=0A=20=0A--=20=0A2.24.2=20(Apple=20Git-127)=0A=0A= --Apple-Mail=_6417DFCA-8F69-4394-A055-1D5E90A438C2 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii --Apple-Mail=_6417DFCA-8F69-4394-A055-1D5E90A438C2--