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 1kmhAc-0007jH-JK for pgsql-hackers@arkaria.postgresql.org; Tue, 08 Dec 2020 17:53: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 1kmhAa-0001t2-Fb for pgsql-hackers@arkaria.postgresql.org; Tue, 08 Dec 2020 17:53:00 +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 1kmhAa-0001su-1x for pgsql-hackers@lists.postgresql.org; Tue, 08 Dec 2020 17:53:00 +0000 Received: from forwardcorp1j.mail.yandex.net ([5.45.199.163]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kmhAW-0003K0-Qt for pgsql-hackers@postgresql.org; Tue, 08 Dec 2020 17:52:59 +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 forwardcorp1j.mail.yandex.net (Yandex) with ESMTP id DC44E2E1477; Tue, 8 Dec 2020 20:52:54 +0300 (MSK) Received: from myt4-18a966dbd9be.qloud-c.yandex.net (myt4-18a966dbd9be.qloud-c.yandex.net [2a02:6b8:c00:12ad:0:640:18a9:66db]) by myt5-23f0be3aa648.qloud-c.yandex.net (mxbackcorp/Yandex) with ESMTP id purrUxaSKo-qrwe5pi0; Tue, 08 Dec 2020 20:52:54 +0300 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1607449974; bh=Kop0zcl36nXhkeiJ6U7bkMl/RghVlhdq/HRpTF/YbY8=; h=To:References:Date:Subject:Cc:Message-Id:From:In-Reply-To; b=xpvaTw9TmPefRX8NP48UiHAh2GDoXh28EIiXi0EsYuUBCbrcJX//cm3VAecymO9+C PmlS/hJXe1lDQs/TooKm2ZFpoejkot8NvhDuJH4YLxIKPnSwRezd8Pn6Geku+ayx8K 79iWmQlorbsoKq3KfWvyk1HE9I35aBiqnGuVZscI= 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:b080:8019::1:0]) by myt4-18a966dbd9be.qloud-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id sVgBIiyTCL-qrmeHZBQ; Tue, 08 Dec 2020 20:52:53 +0300 (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client certificate not present) From: Andrey Borodin Message-Id: <3F5E23A3-6250-486E-9CCA-E2A5B6A28B4F@yandex-team.ru> Content-Type: multipart/mixed; boundary="Apple-Mail=_1BE14139-94CF-42BD-8471-C104694C4222" Mime-Version: 1.0 (Mac OS X Mail 13.4 \(3608.120.23.2.4\)) Subject: Re: MultiXact\SLRU buffers configuration Date: Tue, 8 Dec 2020 22:52:52 +0500 In-Reply-To: <6ba7eae2-8b0c-0690-11a5-e921e6586180@darold.net> Cc: Tomas Vondra , Tomas Vondra , Alexander Korotkov , Anastasia Lubennikova , Daniel Gustafsson , Kyotaro Horiguchi , pgsql-hackers To: Gilles Darold References: <2087E87D-44CA-4443-8E6A-5087F07443F4@yandex-team.ru> <8A94938B-054C-4439-9866-2C220B4D0DD7@yandex-team.ru> <20201028013651.de5cj2xadgmba5nf@development> <13D8FD63-559A-4737-B7FD-05288D1CEF8B@yandex-team.ru> <20201028233243.ygm6yqlynkqpzekr@development> <43F3DE92-F236-4EA5-B4D6-39BEF6BD849D@yandex-team.ru> <20201029134933.xd4mh2cofuf6tdfz@development> <65C1B4BA-D16F-4939-978B-AC8F370F5A5E@yandex-team.ru> <9b4d17df-b811-8323-16be-3cab913216d1@enterprisedb.com> <35862787-8b4d-a290-789e-6e12dc6527e8@enterprisedb.com> <13F86913-C01B-4983-AE2E-493F5A028280@yandex-team.ru> <6ba7eae2-8b0c-0690-11a5-e921e6586180@darold.net> X-Mailer: Apple Mail (2.3608.120.23.2.4) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --Apple-Mail=_1BE14139-94CF-42BD-8471-C104694C4222 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Hi Gilles! Many thanks for your message! > 8 =D0=B4=D0=B5=D0=BA. 2020 =D0=B3., =D0=B2 21:05, Gilles Darold = =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB(=D0=B0): >=20 > I know that this report is not really helpful=20 Quite contrary - this benchmarks prove that controllable reproduction = exists. I've rebased patches for PG11. Can you please benchmark them = (without extending SLRU)? Best regards, Andrey Borodin. --Apple-Mail=_1BE14139-94CF-42BD-8471-C104694C4222 Content-Disposition: attachment; filename=v1106-0001-Use-shared-lock-in-GetMultiXactIdMembers-for-o.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v1106-0001-Use-shared-lock-in-GetMultiXactIdMembers-for-o.patch" Content-Transfer-Encoding: quoted-printable =46rom=20dee5bf87314606e020a574b85cf1e9cbe066588d=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Alexander=20Korotkov=20= =0ADate:=20Tue,=2027=20Oct=202020=2019:29:56=20= +0300=0ASubject:=20[PATCH=20v1106=201/4]=20Use=20shared=20lock=20in=20= GetMultiXactIdMembers=20for=0A=20offsets=20and=20members=0A=0APreviously=20= the=20read=20of=20multixact=20required=20exclusive=20control=20locks=20= for=20both=0Aoffsets=20and=20members=20SLRUs.=20=20This=20could=20lead=20= to=20the=20excessive=20lock=20contention.=0AThis=20commit=20we=20makes=20= multixacts=20SLRU=20take=20advantage=20of=20SimpleLruReadPage_ReadOnly=0A= similar=20to=20clog,=20commit_ts=20and=20subtrans.=0A=0AIn=20order=20to=20= evade=20extra=20reacquiring=20of=20CLRU=20lock,=20we=20teach=0A= SimpleLruReadPage_ReadOnly()=20to=20take=20into=20account=20the=20= current=20lock=20mode=20and=0Areport=20resulting=20lock=20mode=20back.=0A= =0ADiscussion:=20= https://postgr.es/m/a7f1c4e1-1015-92a4-2bd4-6736bd13d03e%40postgrespro.ru#= c496c4e75fc0605094a0e1f763e6a6ec=0AAuthor:=20Andrey=20Borodin=0A= Reviewed-by:=20Kyotaro=20Horiguchi,=20Daniel=20Gustafsson=0AReviewed-by:=20= Anastasia=20Lubennikova,=20Alexander=20Korotkov=0A---=0A=20= src/backend/access/transam/clog.c=20=20=20=20=20=20|=20=203=20++-=0A=20= src/backend/access/transam/commit_ts.c=20|=20=203=20++-=0A=20= src/backend/access/transam/multixact.c=20|=2021=20++++++++++++++-------=0A= =20src/backend/access/transam/slru.c=20=20=20=20=20=20|=2023=20= +++++++++++++++++------=0A=20src/backend/access/transam/subtrans.c=20=20= |=20=203=20++-=0A=20src/backend/commands/async.c=20=20=20=20=20=20=20=20=20= =20=20|=20=206=20++++--=0A=20src/backend/storage/lmgr/lwlock.c=20=20=20=20= =20=20|=20=203=20+++=0A=20src/backend/storage/lmgr/predicate.c=20=20=20|=20= =204=20+++-=0A=20src/include/access/slru.h=20=20=20=20=20=20=20=20=20=20=20= =20=20=20|=20=208=20++++----=0A=20src/include/storage/lwlock.h=20=20=20=20= =20=20=20=20=20=20=20|=20=202=20++=0A=2010=20files=20changed,=2053=20= insertions(+),=2023=20deletions(-)=0A=0Adiff=20--git=20= a/src/backend/access/transam/clog.c=20= b/src/backend/access/transam/clog.c=0Aindex=20a8d1080f17..bdfbd10f96=20= 100644=0A---=20a/src/backend/access/transam/clog.c=0A+++=20= b/src/backend/access/transam/clog.c=0A@@=20-640,10=20+640,11=20@@=20= TransactionIdGetStatus(TransactionId=20xid,=20XLogRecPtr=20*lsn)=0A=20=09= int=09=09=09lsnindex;=0A=20=09char=09=20=20=20*byteptr;=0A=20=09= XidStatus=09status;=0A+=09LWLockMode=09lockmode=20=3D=20LW_NONE;=0A=20=0A= =20=09/*=20lock=20is=20acquired=20by=20SimpleLruReadPage_ReadOnly=20*/=0A= =20=0A-=09slotno=20=3D=20SimpleLruReadPage_ReadOnly(ClogCtl,=20pageno,=20= xid);=0A+=09slotno=20=3D=20SimpleLruReadPage_ReadOnly(ClogCtl,=20pageno,=20= xid,=20&lockmode);=0A=20=09byteptr=20=3D=20= ClogCtl->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= 6c4911d9bc..d7b6f583e1=20100644=0A---=20= a/src/backend/access/transam/commit_ts.c=0A+++=20= b/src/backend/access/transam/commit_ts.c=0A@@=20-288,6=20+288,7=20@@=20= TransactionIdGetCommitTsData(TransactionId=20xid,=20TimestampTz=20*ts,=0A= =20=09CommitTimestampEntry=20entry;=0A=20=09TransactionId=20= oldestCommitTsXid;=0A=20=09TransactionId=20newestCommitTsXid;=0A+=09= LWLockMode=09lockmode=20=3D=20LW_NONE;=0A=20=0A=20=09if=20= (!TransactionIdIsValid(xid))=0A=20=09=09ereport(ERROR,=0A@@=20-342,7=20= +343,7=20@@=20TransactionIdGetCommitTsData(TransactionId=20xid,=20= TimestampTz=20*ts,=0A=20=09}=0A=20=0A=20=09/*=20lock=20is=20acquired=20= by=20SimpleLruReadPage_ReadOnly=20*/=0A-=09slotno=20=3D=20= SimpleLruReadPage_ReadOnly(CommitTsCtl,=20pageno,=20xid);=0A+=09slotno=20= =3D=20SimpleLruReadPage_ReadOnly(CommitTsCtl,=20pageno,=20xid,=20= &lockmode);=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= 365daf153a..5ca10a139a=20100644=0A---=20= a/src/backend/access/transam/multixact.c=0A+++=20= b/src/backend/access/transam/multixact.c=0A@@=20-1216,6=20+1216,7=20@@=20= GetMultiXactIdMembers(MultiXactId=20multi,=20MultiXactMember=20= **members,=0A=20=09MultiXactId=20tmpMXact;=0A=20=09MultiXactOffset=20= nextOffset;=0A=20=09MultiXactMember=20*ptr;=0A+=09LWLockMode=09lockmode=20= =3D=20LW_NONE;=0A=20=0A=20=09debug_elog3(DEBUG2,=20"GetMembers:=20asked=20= for=20%u",=20multi);=0A=20=0A@@=20-1319,12=20+1320,13=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(MultiXactOffsetControlLock,=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,=0A= +=09=09=09=09=09=09=09=09=09=09multi,=20&lockmode);=0A=20=09offptr=20=3D=20= (MultiXactOffset=20*)=20MultiXactOffsetCtl->shared->page_buffer[slotno];=0A= =20=09offptr=20+=3D=20entryno;=0A=20=09offset=20=3D=20*offptr;=0A@@=20= -1356,7=20+1358,8=20@@=20retry:=0A=20=09=09entryno=20=3D=20= MultiXactIdToOffsetEntry(tmpMXact);=0A=20=0A=20=09=09if=20(pageno=20!=3D=20= prev_pageno)=0A-=09=09=09slotno=20=3D=20= SimpleLruReadPage(MultiXactOffsetCtl,=20pageno,=20true,=20tmpMXact);=0A+=09= =09=09slotno=20=3D=20SimpleLruReadPage_ReadOnly(MultiXactOffsetCtl,=20= pageno,=0A+=09=09=09=09=09=09=09=09=09=09=09=09tmpMXact,=20&lockmode);=0A= =20=0A=20=09=09offptr=20=3D=20(MultiXactOffset=20*)=20= MultiXactOffsetCtl->shared->page_buffer[slotno];=0A=20=09=09offptr=20+=3D=20= entryno;=0A@@=20-1380,8=20+1383,7=20@@=20retry:=0A=20=09*members=20=3D=20= ptr;=0A=20=0A=20=09/*=20Now=20get=20the=20members=20themselves.=20*/=0A-=09= LWLockAcquire(MultiXactMemberControlLock,=20LW_EXCLUSIVE);=0A-=0A+=09= lockmode=20=3D=20LW_NONE;=0A=20=09truelength=20=3D=200;=0A=20=09= prev_pageno=20=3D=20-1;=0A=20=09for=20(i=20=3D=200;=20i=20<=20length;=20= i++,=20offset++)=0A@@=20-1397,7=20+1399,8=20@@=20retry:=0A=20=0A=20=09=09= if=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,=0A+=09=09=09=09=09=09=09=09=09=09=09=09multi,=20&lockmode);=0A=20= =09=09=09prev_pageno=20=3D=20pageno;=0A=20=09=09}=0A=20=0A@@=20-1420,6=20= +1423,7=20@@=20retry:=0A=20=09=09truelength++;=0A=20=09}=0A=20=0A+=09= Assert(lockmode=20!=3D=20LW_NONE);=0A=20=09= LWLockRelease(MultiXactMemberControlLock);=0A=20=0A=20=09/*=0A@@=20= -2723,6=20+2727,7=20@@=20find_multixact_start(MultiXactId=20multi,=20= MultiXactOffset=20*result)=0A=20=09int=09=09=09entryno;=0A=20=09int=09=09= =09slotno;=0A=20=09MultiXactOffset=20*offptr;=0A+=09LWLockMode=09= lockmode=20=3D=20LW_NONE;=0A=20=0A=20=09= Assert(MultiXactState->finishedStartup);=0A=20=0A@@=20-2743,10=20= +2748,12=20@@=20find_multixact_start(MultiXactId=20multi,=20= MultiXactOffset=20*result)=0A=20=09=09return=20false;=0A=20=0A=20=09/*=20= lock=20is=20acquired=20by=20SimpleLruReadPage_ReadOnly=20*/=0A-=09slotno=20= =3D=20SimpleLruReadPage_ReadOnly(MultiXactOffsetCtl,=20pageno,=20multi);=0A= +=09slotno=20=3D=20SimpleLruReadPage_ReadOnly(MultiXactOffsetCtl,=20= pageno,=0A+=09=09=09=09=09=09=09=09=09=09multi,=20&lockmode);=0A=20=09= offptr=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+=09Assert(lockmode=20!=3D=20= LW_NONE);=0A=20=09LWLockRelease(MultiXactOffsetControlLock);=0A=20=0A=20=09= *result=20=3D=20offset;=0Adiff=20--git=20= a/src/backend/access/transam/slru.c=20= b/src/backend/access/transam/slru.c=0Aindex=20cfe9513827..f86950eb51=20= 100644=0A---=20a/src/backend/access/transam/slru.c=0A+++=20= b/src/backend/access/transam/slru.c=0A@@=20-460,17=20+460,23=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*=20It=20= is=20unspecified=20whether=20the=20lock=20will=20be=20shared=20or=20= exclusive.=0A+=20*=20Control=20lock=20must=20be=20held=20in=20*lock_mode=20= mode,=20which=20may=20be=20LW_NONE.=20=20Control=0A+=20*=20lock=20will=20= be=20held=20at=20exit=20in=20at=20least=20shared=20mode.=20=20Resulting=20= control=20lock=0A+=20*=20mode=20is=20set=20to=20*lock_mode.=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,=0A+=09=09=09=09=09=09=20=20=20LWLockMode=20= *lock_mode)=0A=20{=0A=20=09SlruShared=09shared=20=3D=20ctl->shared;=0A=20= =09int=09=09=09slotno;=0A=20=0A=20=09/*=20Try=20to=20find=20the=20page=20= while=20holding=20only=20shared=20lock=20*/=0A-=09= LWLockAcquire(shared->ControlLock,=20LW_SHARED);=0A+=09if=20(*lock_mode=20= =3D=3D=20LW_NONE)=0A+=09{=0A+=09=09LWLockAcquire(shared->ControlLock,=20= LW_SHARED);=0A+=09=09*lock_mode=20=3D=20LW_SHARED;=0A+=09}=0A=20=0A=20=09= /*=20See=20if=20page=20is=20already=20in=20a=20buffer=20*/=0A=20=09for=20= (slotno=20=3D=200;=20slotno=20<=20shared->num_slots;=20slotno++)=0A@@=20= -486,8=20+492,13=20@@=20SimpleLruReadPage_ReadOnly(SlruCtl=20ctl,=20int=20= pageno,=20TransactionId=20xid)=0A=20=09}=0A=20=0A=20=09/*=20No=20luck,=20= so=20switch=20to=20normal=20exclusive=20lock=20and=20do=20regular=20read=20= */=0A-=09LWLockRelease(shared->ControlLock);=0A-=09= LWLockAcquire(shared->ControlLock,=20LW_EXCLUSIVE);=0A+=09if=20= (*lock_mode=20!=3D=20LW_EXCLUSIVE)=0A+=09{=0A+=09=09Assert(*lock_mode=20= =3D=3D=20LW_NONE);=0A+=09=09LWLockRelease(shared->ControlLock);=0A+=09=09= LWLockAcquire(shared->ControlLock,=20LW_EXCLUSIVE);=0A+=09=09*lock_mode=20= =3D=20LW_EXCLUSIVE;=0A+=09}=0A=20=0A=20=09return=20= SimpleLruReadPage(ctl,=20pageno,=20true,=20xid);=0A=20}=0Adiff=20--git=20= a/src/backend/access/transam/subtrans.c=20= b/src/backend/access/transam/subtrans.c=0Aindex=20ef63b6d98a..440a21415a=20= 100644=0A---=20a/src/backend/access/transam/subtrans.c=0A+++=20= b/src/backend/access/transam/subtrans.c=0A@@=20-113,6=20+113,7=20@@=20= SubTransGetParent(TransactionId=20xid)=0A=20=09int=09=09=09slotno;=0A=20=09= TransactionId=20*ptr;=0A=20=09TransactionId=20parent;=0A+=09LWLockMode=09= lockmode=20=3D=20LW_NONE;=0A=20=0A=20=09/*=20Can't=20ask=20about=20stuff=20= that=20might=20not=20be=20around=20anymore=20*/=0A=20=09= Assert(TransactionIdFollowsOrEquals(xid,=20TransactionXmin));=0A@@=20= -123,7=20+124,7=20@@=20SubTransGetParent(TransactionId=20xid)=0A=20=0A=20= =09/*=20lock=20is=20acquired=20by=20SimpleLruReadPage_ReadOnly=20*/=0A=20= =0A-=09slotno=20=3D=20SimpleLruReadPage_ReadOnly(SubTransCtl,=20pageno,=20= xid);=0A+=09slotno=20=3D=20SimpleLruReadPage_ReadOnly(SubTransCtl,=20= pageno,=20xid,=20&lockmode);=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=207f4e11bd90..4ebc069a5d=20100644=0A= ---=20a/src/backend/commands/async.c=0A+++=20= b/src/backend/commands/async.c=0A@@=20-1834,6=20+1834,7=20@@=20= asyncQueueReadAllNotifications(void)=0A=20=09=09=09int=09=09=09curoffset=20= =3D=20QUEUE_POS_OFFSET(pos);=0A=20=09=09=09int=09=09=09slotno;=0A=20=09=09= =09int=09=09=09copysize;=0A+=09=09=09LWLockMode=09lockmode=20=3D=20= LW_NONE;=0A=20=0A=20=09=09=09/*=0A=20=09=09=09=20*=20We=20copy=20the=20= data=20from=20SLRU=20into=20a=20local=20buffer,=20so=20as=20to=20avoid=0A= @@=20-1842,7=20+1843,7=20@@=20asyncQueueReadAllNotifications(void)=0A=20=09= =09=09=20*=20of=20the=20page=20we=20will=20actually=20inspect.=0A=20=09=09= =09=20*/=0A=20=09=09=09slotno=20=3D=20= SimpleLruReadPage_ReadOnly(AsyncCtl,=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=09= InvalidTransactionId,=20&lockmode);=0A=20=09=09=09if=20(curpage=20=3D=3D=20= QUEUE_POS_PAGE(head))=0A=20=09=09=09{=0A=20=09=09=09=09/*=20we=20only=20= want=20to=20read=20as=20far=20as=20head=20*/=0A@@=20-1859,7=20+1860,8=20= @@=20asyncQueueReadAllNotifications(void)=0A=20=09=09=09=09=20=20=20= AsyncCtl->shared->page_buffer[slotno]=20+=20curoffset,=0A=20=09=09=09=09=20= =20=20copysize);=0A=20=09=09=09/*=20Release=20lock=20that=20we=20got=20= from=20SimpleLruReadPage_ReadOnly()=20*/=0A-=09=09=09= LWLockRelease(AsyncCtlLock);=0A+=09=09=09Assert(lockmode=20!=3D=20= LW_NONE);=0A+=09=09=09LWLockRelease(AsyncCtl);=0A=20=0A=20=09=09=09/*=0A=20= =09=09=09=20*=20Process=20messages=20up=20to=20the=20stop=20position,=20= end=20of=20page,=20or=20an=0Adiff=20--git=20= a/src/backend/storage/lmgr/lwlock.c=20= b/src/backend/storage/lmgr/lwlock.c=0Aindex=205aae233995..066dbb8ccf=20= 100644=0A---=20a/src/backend/storage/lmgr/lwlock.c=0A+++=20= b/src/backend/storage/lmgr/lwlock.c=0A@@=20-982,6=20+982,8=20@@=20= LWLockWakeup(LWLock=20*lock)=0A=20static=20void=0A=20= LWLockQueueSelf(LWLock=20*lock,=20LWLockMode=20mode)=0A=20{=0A+=09= Assert(mode=20!=3D=20LW_NONE);=0A+=0A=20=09/*=0A=20=09=20*=20If=20we=20= don't=20have=20a=20PGPROC=20structure,=20there's=20no=20way=20to=20wait.=20= This=0A=20=09=20*=20should=20never=20occur,=20since=20MyProc=20should=20= only=20be=20null=20during=20shared=0A@@=20-1742,6=20+1744,7=20@@=20= LWLockRelease(LWLock=20*lock)=0A=20=09=09elog(ERROR,=20"lock=20%s=20is=20= not=20held",=20T_NAME(lock));=0A=20=0A=20=09mode=20=3D=20= held_lwlocks[i].mode;=0A+=09Assert(mode=20=3D=3D=20LW_EXCLUSIVE=20||=20= mode=20=3D=3D=20LW_SHARED);=0A=20=0A=20=09num_held_lwlocks--;=0A=20=09= for=20(;=20i=20<=20num_held_lwlocks;=20i++)=0Adiff=20--git=20= a/src/backend/storage/lmgr/predicate.c=20= b/src/backend/storage/lmgr/predicate.c=0Aindex=20002d040ba6..9513fd915b=20= 100644=0A---=20a/src/backend/storage/lmgr/predicate.c=0A+++=20= b/src/backend/storage/lmgr/predicate.c=0A@@=20-908,6=20+908,7=20@@=20= OldSerXidGetMinConflictCommitSeqNo(TransactionId=20xid)=0A=20=09= TransactionId=20tailXid;=0A=20=09SerCommitSeqNo=20val;=0A=20=09int=09=09=09= slotno;=0A+=09LWLockMode=09lockmode=20=3D=20LW_NONE;=0A=20=0A=20=09= Assert(TransactionIdIsValid(xid));=0A=20=0A@@=20-930,8=20+931,9=20@@=20= OldSerXidGetMinConflictCommitSeqNo(TransactionId=20xid)=0A=20=09=20*=20= but=20will=20return=20with=20that=20lock=20held,=20which=20must=20then=20= be=20released.=0A=20=09=20*/=0A=20=09slotno=20=3D=20= SimpleLruReadPage_ReadOnly(OldSerXidSlruCtl,=0A-=09=09=09=09=09=09=09=09=09= =09OldSerXidPage(xid),=20xid);=0A+=09=09=09=09=09=09=09=09=09=09= OldSerXidPage(xid),=20xid,=20&lockmode);=0A=20=09val=20=3D=20= OldSerXidValue(slotno,=20xid);=0A+=09Assert(lockmode=20!=3D=20LW_NONE);=0A= =20=09LWLockRelease(OldSerXidLock);=0A=20=09return=20val;=0A=20}=0Adiff=20= --git=20a/src/include/access/slru.h=20b/src/include/access/slru.h=0A= index=200e89e48c97..51a3df62e0=20100644=0A---=20= a/src/include/access/slru.h=0A+++=20b/src/include/access/slru.h=0A@@=20= -141,10=20+141,10=20@@=20extern=20Size=20SimpleLruShmemSize(int=20= nslots,=20int=20nlsns);=0A=20extern=20void=20SimpleLruInit(SlruCtl=20= ctl,=20const=20char=20*name,=20int=20nslots,=20int=20nlsns,=0A=20=09=09=09= =20=20LWLock=20*ctllock,=20const=20char=20*subdir,=20int=20tranche_id);=0A= =20extern=20int=09SimpleLruZeroPage(SlruCtl=20ctl,=20int=20pageno);=0A= -extern=20int=20SimpleLruReadPage(SlruCtl=20ctl,=20int=20pageno,=20bool=20= write_ok,=0A-=09=09=09=09=20=20TransactionId=20xid);=0A-extern=20int=20= SimpleLruReadPage_ReadOnly(SlruCtl=20ctl,=20int=20pageno,=0A-=09=09=09=09= =09=09=20=20=20TransactionId=20xid);=0A+extern=20int=09= SimpleLruReadPage(SlruCtl=20ctl,=20int=20pageno,=20bool=20write_ok,=0A+=09= =09=09=09=09=09=09=20=20TransactionId=20xid);=0A+extern=20int=09= SimpleLruReadPage_ReadOnly(SlruCtl=20ctl,=20int=20pageno,=0A+=09=09=09=09= =09=09=09=09=09=20=20=20TransactionId=20xid,=20LWLockMode=20*lock_mode);=0A= =20extern=20void=20SimpleLruWritePage(SlruCtl=20ctl,=20int=20slotno);=0A=20= extern=20void=20SimpleLruFlush(SlruCtl=20ctl,=20bool=20allow_redirtied);=0A= =20extern=20void=20SimpleLruTruncate(SlruCtl=20ctl,=20int=20cutoffPage);=0A= diff=20--git=20a/src/include/storage/lwlock.h=20= b/src/include/storage/lwlock.h=0Aindex=20c21bfe2f66..3263c0fe62=20100644=0A= ---=20a/src/include/storage/lwlock.h=0A+++=20= b/src/include/storage/lwlock.h=0A@@=20-131,6=20+131,8=20@@=20extern=20= PGDLLIMPORT=20int=20NamedLWLockTrancheRequests;=0A=20=0A=20typedef=20= enum=20LWLockMode=0A=20{=0A+=09LW_NONE,=09=09=09=09=09/*=20Not=20a=20= lock=20mode.=20Indicates=20that=20there=20is=20no=0A+=09=09=09=09=09=09=09= =09=20*=20lock.=20*/=0A=20=09LW_EXCLUSIVE,=0A=20=09LW_SHARED,=0A=20=09= LW_WAIT_UNTIL_FREE=09=09=09/*=20A=20special=20mode=20used=20in=20= PGPROC->lwlockMode,=0A--=20=0A2.24.3=20(Apple=20Git-128)=0A=0A= --Apple-Mail=_1BE14139-94CF-42BD-8471-C104694C4222 Content-Disposition: attachment; filename=v1106-0002-Make-MultiXact-local-cache-size-configurable.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v1106-0002-Make-MultiXact-local-cache-size-configurable.patch" Content-Transfer-Encoding: quoted-printable =46rom=20649c5c25349c32aecf02fad46197234af95f9860=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Alexander=20Korotkov=20= =0ADate:=20Mon,=2026=20Oct=202020=2003:44:50=20= +0300=0ASubject:=20[PATCH=20v1106=202/4]=20Make=20MultiXact=20local=20= cache=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|=2037=20++++++++++++++++++++++++++=0A= =20src/backend/access/transam/multixact.c=20|=20=202=20+-=0A=20= src/backend/utils/init/globals.c=20=20=20=20=20=20=20|=20=202=20++=0A=20= src/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=202=20++=0A=205=20files=20changed,=2052=20insertions(+),=20= 1=20deletion(-)=0A=0Adiff=20--git=20a/doc/src/sgml/config.sgml=20= b/doc/src/sgml/config.sgml=0Aindex=203570b422be..15fb2f2bde=20100644=0A= ---=20a/doc/src/sgml/config.sgml=0A+++=20b/doc/src/sgml/config.sgml=0A@@=20= -1637,6=20+1637,43=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=20= =0A+=20=20=20=20=20=20= logical_decoding_work_mem=20= (integer)=0A+=20=20=20=20=20=20=0A+=20=20=20=20=20= =20=20logical_decoding_work_mem=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=20maximum=20= amount=20of=20memory=20to=20be=20used=20by=20logical=20decoding,=0A+=20=20= =20=20=20=20=20=20before=20some=20of=20the=20decoded=20changes=20are=20= written=20to=20local=20disk.=20This=0A+=20=20=20=20=20=20=20=20limits=20= the=20amount=20of=20memory=20used=20by=20logical=20streaming=20= replication=0A+=20=20=20=20=20=20=20=20connections.=20It=20defaults=20to=20= 64=20megabytes=20(64MB).=0A+=20=20=20=20=20=20=20=20= Since=20each=20replication=20connection=20only=20uses=20a=20single=20= buffer=20of=20this=20size,=0A+=20=20=20=20=20=20=20=20and=20an=20= installation=20normally=20doesn't=20have=20many=20such=20connections=0A+=20= =20=20=20=20=20=20=20concurrently=20(as=20limited=20by=20= max_wal_senders),=20it's=0A+=20=20=20=20=20=20=20=20= safe=20to=20set=20this=20value=20significantly=20higher=20than=20= work_mem,=0A+=20=20=20=20=20=20=20=20reducing=20the=20= amount=20of=20decoded=20changes=20written=20to=20disk.=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=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= 5ca10a139a..6203be0aa3=20100644=0A---=20= a/src/backend/access/transam/multixact.c=0A+++=20= b/src/backend/access/transam/multixact.c=0A@@=20-1591,7=20+1591,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=20f7d6617a13..22af834150=20= 100644=0A---=20a/src/backend/utils/init/globals.c=0A+++=20= b/src/backend/utils/init/globals.c=0A@@=20-147,3=20+147,5=20@@=20int=09=09= =09VacuumCostBalance=20=3D=200;=09/*=20working=20state=20for=20vacuum=20= */=0A=20bool=09=09VacuumCostActive=20=3D=20false;=0A=20=0A=20double=09=09= vacuum_cleanup_index_scale_factor;=0A+=0A+int=20=20=20=20=20=20=20=20=20= 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= 710344c72b..b54a063782=20100644=0A---=20a/src/backend/utils/misc/guc.c=0A= +++=20b/src/backend/utils/misc/guc.c=0A@@=20-2026,6=20+2026,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=20of=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= 8024145535..11c3c8e6c5=20100644=0A---=20a/src/include/miscadmin.h=0A+++=20= b/src/include/miscadmin.h=0A@@=20-161,6=20+161,8=20@@=20extern=20= PGDLLIMPORT=20int=20MaxConnections;=0A=20extern=20PGDLLIMPORT=20int=20= max_worker_processes;=0A=20extern=20PGDLLIMPORT=20int=20= max_parallel_workers;=0A=20=0A+extern=20PGDLLIMPORT=20int=20= multixact_local_cache_entries;=0A+=0A=20extern=20PGDLLIMPORT=20int=20= MyProcPid;=0A=20extern=20PGDLLIMPORT=20pg_time_t=20MyStartTime;=0A=20= extern=20PGDLLIMPORT=20struct=20Port=20*MyProcPort;=0A--=20=0A2.24.3=20= (Apple=20Git-128)=0A=0A= --Apple-Mail=_1BE14139-94CF-42BD-8471-C104694C4222 Content-Disposition: attachment; filename=v1106-0003-Add-conditional-variable-to-wait-for-next-Mult.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v1106-0003-Add-conditional-variable-to-wait-for-next-Mult.patch" Content-Transfer-Encoding: quoted-printable =46rom=2038dc550f363c1c8878fbf06d5616614a36112fac=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Alexander=20Korotkov=20= =0ADate:=20Mon,=2026=20Oct=202020=2001:55:31=20= +0300=0ASubject:=20[PATCH=20v1106=203/4]=20Add=20conditional=20variable=20= to=20wait=20for=20next=20MultXact=0A=20offset=20in=20corner=20case=0A=0A= GetMultiXactIdMembers()=20has=20a=20corner=20case,=20when=20the=20next=20= multixact=20offset=20is=0Anot=20yet=20set.=20=20In=20this=20case=20= GetMultiXactIdMembers()=20has=20to=20sleep=20till=20this=20offset=0Ais=20= set.=20=20Currently=20the=20sleeping=20is=20implemented=20in=20naive=20= way=20using=20pg_sleep()=0Aand=20retry.=20=20This=20commit=20implements=20= sleeping=20with=20conditional=20variable,=20which=0Aprovides=20more=20= efficient=20way=20for=20waiting=20till=20the=20event.=0A=0ADiscussion:=20= https://postgr.es/m/a7f1c4e1-1015-92a4-2bd4-6736bd13d03e%40postgrespro.ru#= c496c4e75fc0605094a0e1f763e6a6ec=0AAuthor:=20Andrey=20Borodin=0A= Reviewed-by:=20Kyotaro=20Horiguchi,=20Daniel=20Gustafsson=0AReviewed-by:=20= Anastasia=20Lubennikova,=20Alexander=20Korotkov=0A---=0A=20= src/backend/access/transam/multixact.c=20|=2035=20= ++++++++++++++++++++++++--=0A=20src/backend/postmaster/pgstat.c=20=20=20=20= =20=20=20=20|=20=203=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=203=20++-=0A=203=20files=20= changed,=2038=20insertions(+),=203=20deletions(-)=0A=0Adiff=20--git=20= a/src/backend/access/transam/multixact.c=20= b/src/backend/access/transam/multixact.c=0Aindex=20= 6203be0aa3..5d2bbb1ca6=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,13=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= /*=0A+=09=20*=20Conditional=20variable=20for=20waiting=20till=20the=20= filling=20of=20the=20next=20multixact=0A+=09=20*=20will=20be=20finished.=20= =20See=20GetMultiXactIdMembers()=20and=20RecordNewMultiXact()=0A+=09=20*=20= for=20details.=0A+=09=20*/=0A+=09ConditionVariable=20nextoffCV;=0A+=0A=20= =09/*=0A=20=09=20*=20Per-backend=20data=20starts=20here.=20=20We=20have=20= two=20arrays=20stored=20in=20the=20area=0A=20=09=20*=20immediately=20= following=20the=20MultiXactStateData=20struct.=20Each=20is=20indexed=20= by=0A@@=20-871,6=20+879,14=20@@=20RecordNewMultiXact(MultiXactId=20= multi,=20MultiXactOffset=20offset,=0A=20=09/*=20Exchange=20our=20lock=20= */=0A=20=09LWLockRelease(MultiXactOffsetControlLock);=0A=20=0A+=09/*=0A+=09= =20*=20Let=20everybody=20know=20the=20offset=20of=20this=20mxid=20is=20= recorded=20now.=20=20The=0A+=09=20*=20waiters=20are=20waiting=20for=20= the=20offset=20of=20the=20mxid=20next=20of=20the=20target=20to=0A+=09=20= *=20know=20the=20number=20of=20members=20of=20the=20target=20mxid,=20so=20= we=20don't=20need=20to=20wait=0A+=09=20*=20for=20members=20of=20this=20= mxid=20are=20recorded.=0A+=09=20*/=0A+=09= ConditionVariableBroadcast(&MultiXactState->nextoffCV);=0A+=0A=20=09= LWLockAcquire(MultiXactMemberControlLock,=20LW_EXCLUSIVE);=0A=20=0A=20=09= prev_pageno=20=3D=20-1;=0A@@=20-1368,9=20+1384,23=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=0A+=09=09=09=20*=20offset.=20Wait=20= for=20the=20offset=20to=20be=20written.=0A+=09=09=09=20*/=0A+=09=09=09= ConditionVariablePrepareToSleep(&MultiXactState->nextoffCV);=0A+=0A+=09=09= =09/*=0A+=09=09=09=20*=20We=20don't=20have=20to=20recheck=20if=20= multixact=20was=20filled=20in=20during=0A+=09=09=09=20*=20= ConditionVariablePrepareToSleep(),=20because=20we=20were=20holding=0A+=09= =09=09=20*=20MultiXactOffsetSLRULock.=0A+=09=09=09=20*/=0A=20=09=09=09= LWLockRelease(MultiXactOffsetControlLock);=0A-=09=09=09= CHECK_FOR_INTERRUPTS();=0A-=09=09=09pg_usleep(1000L);=0A+=0A+=09=09=09= ConditionVariableSleep(&MultiXactState->nextoffCV,=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-1849,6=20+1879,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->nextoffCV);=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=204895354a28..8a8b9a4eef=20100644=0A---=20= a/src/backend/postmaster/pgstat.c=0A+++=20= b/src/backend/postmaster/pgstat.c=0A@@=20-3730,6=20+3730,9=20@@=20= pgstat_get_wait_ipc(WaitEventIPC=20w)=0A=20=09=09case=20= WAIT_EVENT_SYNC_REP:=0A=20=09=09=09event_name=20=3D=20"SyncRep";=0A=20=09= =09=09break;=0A+=09=09case=20WAIT_EVENT_WAIT_NEXT_MXMEMBERS:=0A+=09=09=09= event_name=20=3D=20"MultiXactWaitNextMembers";=0A+=09=09=09break;=0A=20=09= =09=09/*=20no=20default=20case,=20so=20that=20compiler=20will=20warn=20= */=0A=20=09}=0A=20=0Adiff=20--git=20a/src/include/pgstat.h=20= b/src/include/pgstat.h=0Aindex=2058e2e71c6f..e89d946669=20100644=0A---=20= a/src/include/pgstat.h=0A+++=20b/src/include/pgstat.h=0A@@=20-832,7=20= +832,8=20@@=20typedef=20enum=0A=20=09WAIT_EVENT_REPLICATION_ORIGIN_DROP,=0A= =20=09WAIT_EVENT_REPLICATION_SLOT_DROP,=0A=20=09= WAIT_EVENT_SAFE_SNAPSHOT,=0A-=09WAIT_EVENT_SYNC_REP=0A+=09= WAIT_EVENT_SYNC_REP,=0A+=09WAIT_EVENT_WAIT_NEXT_MXMEMBERS=0A=20}=20= WaitEventIPC;=0A=20=0A=20/*=20----------=0A--=20=0A2.24.3=20(Apple=20= Git-128)=0A=0A= --Apple-Mail=_1BE14139-94CF-42BD-8471-C104694C4222 Content-Disposition: attachment; filename=v1106-0004-Add-GUCs-to-tune-MultiXact-SLRUs.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v1106-0004-Add-GUCs-to-tune-MultiXact-SLRUs.patch" Content-Transfer-Encoding: quoted-printable =46rom=20e273a508592236dbf5c60417b5878961c2483bca=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Andrey=20Borodin=20=0ADate:=20= Sat,=209=20May=202020=2016:42:07=20+0500=0ASubject:=20[PATCH=20v1106=20= 4/4]=20Add=20GUCs=20to=20tune=20MultiXact=20SLRUs=0A=0A---=0A=20= doc/src/sgml/config.sgml=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20= 31=20++++++++++++++++++++++++++=0A=20= src/backend/access/transam/multixact.c=20|=20=208=20+++----=0A=20= src/backend/utils/init/globals.c=20=20=20=20=20=20=20|=20=202=20++=0A=20= src/backend/utils/misc/guc.c=20=20=20=20=20=20=20=20=20=20=20|=2022=20= ++++++++++++++++++=0A=20src/include/access/multixact.h=20=20=20=20=20=20=20= =20=20|=20=204=20----=0A=20src/include/miscadmin.h=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20|=20=202=20++=0A=206=20files=20changed,=2061=20= insertions(+),=208=20deletions(-)=0A=0Adiff=20--git=20= a/doc/src/sgml/config.sgml=20b/doc/src/sgml/config.sgml=0Aindex=20= 15fb2f2bde..44ebacc713=20100644=0A---=20a/doc/src/sgml/config.sgml=0A+++=20= b/doc/src/sgml/config.sgml=0A@@=20-1673,6=20+1673,37=20@@=20include_dir=20= 'conf.d'=0A=20=20=20=20=20=20=20=20=0A=20=20=20=20=20=20=20= =0A=20=20=20=20=20=20=0A+=20=20=20=20=20=0A+=20= =20=20=20=0A+=20=20=20=20=20=20= multixact_offsets_slru_buffers=20= (integer)=0A+=20=20=20=20=20=20=0A+=20=20=20=20=20= =20=20multixact_offsets_slru_buffers=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=20amount=20of=20= memory=20to=20be=20used=20for=20MultiXact=20offsets.=20MultiXact=20= offsets=0A+=20=20=20=20=20=20=20=20are=20used=20to=20store=20informaion=20= about=20offsets=20of=20multiple=20row=20lockers=20(caused=20by=20SELECT=20= FOR=20UPDATE=20and=20others).=0A+=20=20=20=20=20=20=20=20It=20defaults=20= to=2064=20kilobytes=20(64KB).=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=0A+=20=20=20=20=20=20= multixact_members_slru_buffers=20= (integer)=0A+=20=20=20=20=20=20=0A+=20=20=20=20=20= =20=20multixact_members_slru_buffers=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=20amount=20of=20= memory=20to=20be=20used=20for=20MultiXact=20members.=20MultiXact=20= members=0A+=20=20=20=20=20=20=20=20are=20used=20to=20store=20informaion=20= about=20XIDs=20of=20multiple=20row=20lockers.=20Tipically=20= multixact_members_slru_buffers=0A+=20=20=20=20=20=20=20= =20is=20twice=20more=20than=20= multixact_offsets_slru_buffers.=0A+=20=20=20=20=20=20=20= =20It=20defaults=20to=20128=20kilobytes=20(128KB).=0A= +=20=20=20=20=20=20=20=0A+=20=20=20=20=20=20=0A+=20=20=20= =20=20=0A=20=0A=20=20=20=20=20=20=0A=20=20=20=20= =20=20=20max_stack_depth=20= (integer)=0Adiff=20--git=20= a/src/backend/access/transam/multixact.c=20= b/src/backend/access/transam/multixact.c=0Aindex=20= 5d2bbb1ca6..31324714b8=20100644=0A---=20= a/src/backend/access/transam/multixact.c=0A+++=20= b/src/backend/access/transam/multixact.c=0A@@=20-1844,8=20+1844,8=20@@=20= MultiXactShmemSize(void)=0A=20=09=09=09=20mul_size(sizeof(MultiXactId)=20= *=202,=20MaxOldestSlot))=0A=20=0A=20=09size=20=3D=20= SHARED_MULTIXACT_STATE_SIZE;=0A-=09size=20=3D=20add_size(size,=20= SimpleLruShmemSize(NUM_MXACTOFFSET_BUFFERS,=200));=0A-=09size=20=3D=20= add_size(size,=20SimpleLruShmemSize(NUM_MXACTMEMBER_BUFFERS,=200));=0A+=09= size=20=3D=20add_size(size,=20= SimpleLruShmemSize(multixact_offsets_slru_buffers,=200));=0A+=09size=20=3D= =20add_size(size,=20SimpleLruShmemSize(multixact_members_slru_buffers,=20= 0));=0A=20=0A=20=09return=20size;=0A=20}=0A@@=20-1861,11=20+1861,11=20@@=20= MultiXactShmemInit(void)=0A=20=09MultiXactMemberCtl->PagePrecedes=20=3D=20= MultiXactMemberPagePrecedes;=0A=20=0A=20=09= SimpleLruInit(MultiXactOffsetCtl,=0A-=09=09=09=09=20=20= "multixact_offset",=20NUM_MXACTOFFSET_BUFFERS,=200,=0A+=09=09=09=09=20=20= "multixact_offset",=20multixact_offsets_slru_buffers,=200,=0A=20=09=09=09= =09=20=20MultiXactOffsetControlLock,=20"pg_multixact/offsets",=0A=20=09=09= =09=09=20=20LWTRANCHE_MXACTOFFSET_BUFFERS);=0A=20=09= SimpleLruInit(MultiXactMemberCtl,=0A-=09=09=09=09=20=20= "multixact_member",=20NUM_MXACTMEMBER_BUFFERS,=200,=0A+=09=09=09=09=20=20= "multixact_member",=20multixact_members_slru_buffers,=200,=0A=20=09=09=09= =09=20=20MultiXactMemberControlLock,=20"pg_multixact/members",=0A=20=09=09= =09=09=20=20LWTRANCHE_MXACTMEMBER_BUFFERS);=0A=20=0Adiff=20--git=20= a/src/backend/utils/init/globals.c=20b/src/backend/utils/init/globals.c=0A= index=2022af834150..5a8517f8eb=20100644=0A---=20= a/src/backend/utils/init/globals.c=0A+++=20= b/src/backend/utils/init/globals.c=0A@@=20-149,3=20+149,5=20@@=20bool=09=09= VacuumCostActive=20=3D=20false;=0A=20double=09=09= vacuum_cleanup_index_scale_factor;=0A=20=0A=20int=20=20=20=20=20=20=20=20= =20multixact_local_cache_entries=20=3D=20256;=0A+int=09=09=09= multixact_offsets_slru_buffers=20=3D=208;=0A+int=09=09=09= multixact_members_slru_buffers=20=3D=2016;=0Adiff=20--git=20= a/src/backend/utils/misc/guc.c=20b/src/backend/utils/misc/guc.c=0Aindex=20= b54a063782..578452d757=20100644=0A---=20a/src/backend/utils/misc/guc.c=0A= +++=20b/src/backend/utils/misc/guc.c=0A@@=20-2036,6=20+2036,28=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_offsets_slru_buffers",=20PGC_POSTMASTER,=20RESOURCES_MEM,=0A= +=09=09=09gettext_noop("Sets=20the=20number=20of=20shared=20memory=20= buffers=20used=20for=20MultiXact=20offsets=20SLRU."),=0A+=09=09=09NULL,=0A= +=09=09=09GUC_UNIT_BLOCKS=0A+=09=09},=0A+=09=09= &multixact_offsets_slru_buffers,=0A+=09=098,=202,=20INT_MAX=20/=202,=0A+=09= =09NULL,=20NULL,=20NULL=0A+=09},=0A+=0A+=09{=0A+=09=09= {"multixact_members_slru_buffers",=20PGC_POSTMASTER,=20RESOURCES_MEM,=0A= +=09=09=09gettext_noop("Sets=20the=20number=20of=20shared=20memory=20= buffers=20used=20for=20MultiXact=20members=20SLRU."),=0A+=09=09=09NULL,=0A= +=09=09=09GUC_UNIT_BLOCKS=0A+=09=09},=0A+=09=09= &multixact_members_slru_buffers,=0A+=09=0916,=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/access/multixact.h=20b/src/include/access/multixact.h=0A= index=2018fe380c5f..6e14fb7b29=20100644=0A---=20= a/src/include/access/multixact.h=0A+++=20= b/src/include/access/multixact.h=0A@@=20-28,10=20+28,6=20@@=0A=20=0A=20= #define=20MaxMultiXactOffset=09((MultiXactOffset)=200xFFFFFFFF)=0A=20=0A= -/*=20Number=20of=20SLRU=20buffers=20to=20use=20for=20multixact=20*/=0A= -#define=20NUM_MXACTOFFSET_BUFFERS=09=098=0A-#define=20= NUM_MXACTMEMBER_BUFFERS=09=0916=0A-=0A=20/*=0A=20=20*=20Possible=20= multixact=20lock=20modes=20("status").=20=20The=20first=20four=20modes=20= are=20for=0A=20=20*=20tuple=20locks=20(FOR=20KEY=20SHARE,=20FOR=20SHARE,=20= FOR=20NO=20KEY=20UPDATE,=20FOR=20UPDATE);=20the=0Adiff=20--git=20= a/src/include/miscadmin.h=20b/src/include/miscadmin.h=0Aindex=20= 11c3c8e6c5..e3fd0a264d=20100644=0A---=20a/src/include/miscadmin.h=0A+++=20= b/src/include/miscadmin.h=0A@@=20-160,6=20+160,8=20@@=20extern=20= PGDLLIMPORT=20int=20MaxBackends;=0A=20extern=20PGDLLIMPORT=20int=20= MaxConnections;=0A=20extern=20PGDLLIMPORT=20int=20max_worker_processes;=0A= =20extern=20PGDLLIMPORT=20int=20max_parallel_workers;=0A+extern=20= PGDLLIMPORT=20int=20multixact_offsets_slru_buffers;=0A+extern=20= PGDLLIMPORT=20int=20multixact_members_slru_buffers;=0A=20=0A=20extern=20= PGDLLIMPORT=20int=20multixact_local_cache_entries;=0A=20=0A--=20=0A= 2.24.3=20(Apple=20Git-128)=0A=0A= --Apple-Mail=_1BE14139-94CF-42BD-8471-C104694C4222--