Re: POC: Sharing record typmods between backends

From: Thomas Munro <thomas(dot)munro(at)enterprisedb(dot)com>
To: Andres Freund <andres(at)anarazel(dot)de>
Cc: Robert Haas <robertmhaas(at)gmail(dot)com>, Dilip Kumar <dilipbalaut(at)gmail(dot)com>, Pg Hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: POC: Sharing record typmods between backends
Date: 2017-08-23 11:58:04
Message-ID: CAEepm=3wiFVqhm0zUAbzbzg6um3Wc+=w8bM=shr-NqJSdJj=dg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Wed, Aug 23, 2017 at 5:46 PM, Andres Freund <andres(at)anarazel(dot)de> wrote:
> Committing 0003. This'll probably need further adjustment, but I think
> it's good to make progress here.

Thanks!

> Changes:
> - pgindent'ed after adding the necessary typedefs to typedefs.list
> - replaced INT64CONST w UINT64CONST
> - moved count assertion in delete_item to before decrementing - as count
> is unsigned, it'd just wrap around on underflow not triggering the assertion.
> - documented and asserted resize is called without partition lock held
> - removed reference to iterator in dshash_find comments
> - removed stray references to dshash_release (rather than dshash_release_lock)
> - reworded dshash_find_or_insert reference to dshash_find to also
> mention error handling.

Doh. Thanks.

> Notes for possible followup commits of the dshash API:
> - nontrivial portions of dsahash are essentially critical sections lest
> dynamic shared memory is leaked. Should we, short term, introduce
> actual critical section markers to make that more obvious? Should we,
> longer term, make this more failsafe / easier to use, by
> extending/emulating memory contexts for dsa memory?

Hmm. I will look into this.

> - I'm very unconvinced of supporting both {compare,hash}_arg_function
> and the non-arg version. Why not solely support the _arg_ version, but
> add the size argument? On all relevant platforms that should still be
> register arg callable, and the branch isn't free either.

Well, the idea was that both versions were compatible with existing
functions: one with DynaHash's hash and compare functions and the
other with qsort_arg's compare function type. In the attached version
I've done as you suggested in 0001. Since I guess many users will
finish up wanting raw memory compare and hash I've provided
dshash_memcmp() and dshash_memhash(). Thoughts?

Since there is no attempt to be compatible with anything else, I was
slightly tempted to make equal functions return true for a match,
rather than the memcmp-style return value but figured it was still
better to be consistent.

> - might be worthwhile to try to reduce duplication between
> delete_item_from_bucket, delete_key_from_bucket, delete_item
> dshash_delete_key.

Yeah. I will try this and send a separate refactoring patch.

> For later commits in the series:
> - Afaict the whole shared tupledesc stuff, as tqueue.c before, is
> entirely untested. This baffles me. See also [1]. I can force the code
> to be reached with force_parallel_mode=regress/1, but this absolutely
> really totally needs to be reached by the default tests. Robert?

A fair point. 0002 is a simple patch to push some blessed records
through a TupleQueue in select_parallel.sql. It doesn't do ranges and
arrays (special cases in the tqueue.c code that 0004 rips out), but
for exercising the new shared code I believe this is enough. If you
apply just 0002 and 0004 then this test fails with a strange confused
record decoding error as expected.

> - gcc wants static before const (0004).

Fixed.

> - Afaict GetSessionDsmHandle() uses the current rather than
> TopMemoryContext. Try running the regression tests under
> force_parallel_mode - crashes immediately for me without fixing that.

Gah, right. Fixed.

> - SharedRecordTypmodRegistryInit() is called from GetSessionDsmHandle()
> which calls EnsureCurrentSession(), but
> SharedRecordTypmodRegistryInit() does so again - sprinkling those
> around liberally seems like it could hide bugs.

Yeah. Will look into this.

--
Thomas Munro
http://www.enterprisedb.com

Attachment Content-Type Size
shared-record-typmods-v7.patchset.tgz application/x-gzip 23.5 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Thomas Munro 2017-08-23 12:04:42 Re: POC: Sharing record typmods between backends
Previous Message Amit Kapila 2017-08-23 11:38:10 Re: Page Scan Mode in Hash Index