Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

From: Dilip Kumar <dilipbalaut(at)gmail(dot)com>
To: Andres Freund <andres(at)anarazel(dot)de>
Cc: Justin Pryzby <pryzby(at)telsasoft(dot)com>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Robert Haas <robertmhaas(at)gmail(dot)com>, Ashutosh Sharma <ashu(dot)coek88(at)gmail(dot)com>, Maciek Sakrejda <m(dot)sakrejda(at)gmail(dot)com>, Bruce Momjian <bruce(at)momjian(dot)us>, Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>, Andrew Dunstan <andrew(at)dunslane(dot)net>, Heikki Linnakangas <hlinnaka(at)iki(dot)fi>, pgsql-hackers(at)lists(dot)postgresql(dot)org
Subject: Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints
Date: 2022-08-03 06:30:16
Message-ID: CAFiTN-sL8M+Z6nongs=rSqfP26Vr0O_EYLfcwbO-Emz1GYxtxA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Wed, Aug 3, 2022 at 11:28 AM Dilip Kumar <dilipbalaut(at)gmail(dot)com> wrote:
>
> On Wed, Aug 3, 2022 at 3:53 AM Andres Freund <andres(at)anarazel(dot)de> wrote:
> >
> > On 2022-08-02 17:04:16 -0500, Justin Pryzby wrote:
> > > I got this interesting looking thing.
> > >
> > > ==11628== Invalid write of size 8
> > > ==11628== at 0x1D12B3A: smgrsetowner (smgr.c:213)
> > > ==11628== by 0x1C7C224: RelationGetSmgr (rel.h:572)
> > > ==11628== by 0x1C7C224: RelationCopyStorageUsingBuffer (bufmgr.c:3725)
> > > ==11628== by 0x1C7C7A6: CreateAndCopyRelationData (bufmgr.c:3817)
> > > ==11628== by 0x14A4518: CreateDatabaseUsingWalLog (dbcommands.c:221)
> > > ==11628== by 0x14AB009: createdb (dbcommands.c:1393)
> > > ==11628== by 0x1D2B9AF: standard_ProcessUtility (utility.c:776)
> > > ==11628== by 0x1D2C46A: ProcessUtility (utility.c:530)
> > > ==11628== by 0x1D265F5: PortalRunUtility (pquery.c:1158)
> > > ==11628== by 0x1D27089: PortalRunMulti (pquery.c:1315)
> > > ==11628== by 0x1D27A7C: PortalRun (pquery.c:791)
> > > ==11628== by 0x1D1E33D: exec_simple_query (postgres.c:1243)
> > > ==11628== by 0x1D218BC: PostgresMain (postgres.c:4505)
> > > ==11628== Address 0x1025bc18 is 2,712 bytes inside a block of size 8,192 free'd
> > > ==11628== at 0x4033A3F: free (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
> > > ==11628== by 0x217D7C2: AllocSetReset (aset.c:608)
> > > ==11628== by 0x219B57A: MemoryContextResetOnly (mcxt.c:181)
> > > ==11628== by 0x217DBD5: AllocSetDelete (aset.c:654)
> > > ==11628== by 0x219C1EC: MemoryContextDelete (mcxt.c:252)
> > > ==11628== by 0x21A109F: PortalDrop (portalmem.c:596)
> > > ==11628== by 0x21A269C: AtCleanup_Portals (portalmem.c:907)
> > > ==11628== by 0x11FEAB1: CleanupTransaction (xact.c:2890)
> > > ==11628== by 0x120A74C: AbortCurrentTransaction (xact.c:3328)
> > > ==11628== by 0x1D2158C: PostgresMain (postgres.c:4232)
> > > ==11628== by 0x1B15DB5: BackendRun (postmaster.c:4490)
> > > ==11628== by 0x1B1D799: BackendStartup (postmaster.c:4218)
> > > ==11628== Block was alloc'd at
> > > ==11628== at 0x40327F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
> > > ==11628== by 0x217F0DC: AllocSetAlloc (aset.c:920)
> > > ==11628== by 0x219E4D2: palloc (mcxt.c:1082)
> > > ==11628== by 0x14A14BE: ScanSourceDatabasePgClassTuple (dbcommands.c:444)
> > > ==11628== by 0x14A1CD8: ScanSourceDatabasePgClassPage (dbcommands.c:384)
> > > ==11628== by 0x14A20BF: ScanSourceDatabasePgClass (dbcommands.c:322)
> > > ==11628== by 0x14A4348: CreateDatabaseUsingWalLog (dbcommands.c:177)
> > > ==11628== by 0x14AB009: createdb (dbcommands.c:1393)
> > > ==11628== by 0x1D2B9AF: standard_ProcessUtility (utility.c:776)
> > > ==11628== by 0x1D2C46A: ProcessUtility (utility.c:530)
> > > ==11628== by 0x1D265F5: PortalRunUtility (pquery.c:1158)
> > > ==11628== by 0x1D27089: PortalRunMulti (pquery.c:1315)
> >
> > Ick. That looks like somehow we end up with smgr entries still pointing to
> > fake relcache entries, created in a prior attempt at create database.
>
> The surprising thing is how the smgr entry survived the transaction
> abort, I mean AtEOXact_SMgr should have closed the smgr and should
> have removed from the
> smgr cache.
>

Okay, so AtEOXact_SMgr will only get rid of unowned smgr and ours are
owned by a fake relcache and whose lifetime is just portal memory
context which will go away at the transaction end. So as Andres
suggested options could be that a) we catch the error and do
FreeFakeRelcacheEntry. b) directly use smgropen instead of
RelationGetSmgr because actually, we do not want the owner to be set
for these smgrs.

I think option b) looks better to me, I will prepare a patch and test
whether the error goes away with that or not.

--
Regards,
Dilip Kumar
EnterpriseDB: http://www.enterprisedb.com

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Masahiko Sawada 2022-08-03 06:46:02 Re: Introduce wait_for_subscription_sync for TAP tests
Previous Message Kyotaro Horiguchi 2022-08-03 06:27:53 Re: [BUG] Logical replication failure "ERROR: could not map filenode "base/13237/442428" to relation OID" with catalog modifying txns