Re: Error: dsa_area could not attach to a segment that has been freed

From: Craig Ringer <craig(at)2ndquadrant(dot)com>
To: Thomas Munro <thomas(dot)munro(at)enterprisedb(dot)com>
Cc: Gaddam Sai Ram <gaddamsairam(dot)n(at)zohocorp(dot)com>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Error: dsa_area could not attach to a segment that has been freed
Date: 2017-09-20 09:52:30
Message-ID: CAMsr+YFXusTcm2waoczSr2KF+6MO_5uUsdD1_jR7cgOAJbJU-A@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 20 September 2017 at 16:55, Thomas Munro <thomas(dot)munro(at)enterprisedb(dot)com>
wrote:

> On Wed, Sep 20, 2017 at 6:14 PM, Gaddam Sai Ram
> <gaddamsairam(dot)n(at)zohocorp(dot)com> wrote:
> > Thank you very much! That fixed my issue! :)
> > I was in an assumption that pinning the area will increase its lifetime
> but
> > yeah after taking memory context into consideration its working fine!
>
> So far the success rate in confusing people who first try to make
> long-lived DSA areas and DSM segments is 100%. Basically, this is all
> designed to ensure automatic cleanup of resources in short-lived
> scopes.
>

90% ;)

I got it working with no significant issues for a long lived segment used
to store a pool of shm_mq pairs used for a sort of "connection listener"
bgworker. Though I only used DSM+ToC, not DSA. But TBH that may well be
luck, as I tend to routinely use memory contexts scoped to the operational
lifetime of a subsystem, making most problems like this just vanish without
my realising they were there in the first place. Usually.

I pretty much shamelessly cribbed from test_shm_mq for the ToC stuff
though. It's simple enough when you read it in use, but I'd be lucky to do
it without an example.

I had lots more problems with shm_mq than DSM. shm_mq is very obviously
designed for short-lived scopes, and falls down badly if you have a pool of
queues you want to re-use after the peer detaches. You have to track "in
use" flags separately to the shm_mq's own, because it doesn't clear its
stored PGPROC entries for receiver/sender on detach. Once you know neither
sender nor receiver is still attached, you can memset() the area and create
a new queue in it.

You can't just reset the queue for a new peer, and have to do quite a dance
to make sure it's safe detach from, overwrite, re-create and re-attach to.

> Good luck for your graph project. I think you're going to have to
> expend a lot of energy trying to avoid memory leaks if your DSA lives
> as long as the database cluster, since error paths won't automatically
> free any memory you allocated in it.

Yeah, that's going to be hard. You might land up having lots and lots of
little DSM segments.

> There is a kind of garbage collection for palloc'd memory and
> also for other resources like file handles, but if you're using a big
> long lived DSA area you have nothing like that.

We need, IMO, a DSA-backed heirachical MemoryContext system.

We can't use the exact MemoryContext API as-is due to the need for far
pointers though :(

--
Craig Ringer http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Craig Ringer 2017-09-20 09:54:09 Re: Error: dsa_area could not attach to a segment that has been freed
Previous Message Alvaro Herrera 2017-09-20 09:50:46 Re: src/test/subscription/t/002_types.pl hanging on particular environment