Re: [POC] Faster processing at Gather node

From: Robert Haas <robertmhaas(at)gmail(dot)com>
To: Amit Kapila <amit(dot)kapila16(at)gmail(dot)com>
Cc: Andres Freund <andres(at)anarazel(dot)de>, Rafia Sabih <rafia(dot)sabih(at)enterprisedb(dot)com>, PostgreSQL Developers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: [POC] Faster processing at Gather node
Date: 2017-11-10 15:09:37
Views: Raw Message | Whole Thread | Download mbox
Lists: pgsql-hackers

On Fri, Nov 10, 2017 at 5:44 AM, Amit Kapila <amit(dot)kapila16(at)gmail(dot)com> wrote:
> I am seeing the assertion failure as below on executing the above
> mentioned Create statement:
> TRAP: FailedAssertion("!(!(tup->t_data->t_infomask & 0x0008))", File:
> "heapam.c", Line: 2634)
> server closed the connection unexpectedly
> This probably means the server terminated abnormally

OK, I see it now. Not sure why I couldn't reproduce this before.

I think the problem is not actually with the code that I just wrote.
What I'm seeing is that the slot descriptor's tdhasoid value is false
for both the funnel slot and the result slot; therefore, we conclude
that no projection is needed to remove the OIDs. That seems to make
sense: if the funnel slot doesn't have OIDs and the result slot
doesn't have OIDs either, then we don't need to remove them.
Unfortunately, even though the funnel slot descriptor is marked
tdhashoid = false, the tuples being stored there actually do have
OIDs. And that is because they are coming from the underlying
sequential scan, which *also* has OIDs despite the fact that tdhasoid
for it's slot is false.

This had me really confused until I realized that there are two
processes involved. The problem is that we don't pass eflags down to
the child process -- so in the user backend, everybody agrees that
there shouldn't be OIDs anywhere, because EXEC_FLAG_WITHOUT_OIDS is
set. In the parallel worker, however, it's not set, so the worker
feels free to do whatever comes naturally, and in this test case that
happens to be returning tuples with OIDs. Patch for this attached.

I also noticed that the code that initializes the funnel slot is using
its own PlanState rather than the outer plan's PlanState to call
ExecContextForcesOids. I think that's formally incorrect, because the
goal is to end up with a slot that is the same as the outer plan's
slot. It doesn't matter because ExecContextForcesOids doesn't care
which PlanState it gets passed, but the comments in
ExecContextForcesOids imply that somebody it might, so perhaps it's
best to clean that up. Patch for this attached, too.

And here are the other patches again, too.

Robert Haas
The Enterprise PostgreSQL Company

Attachment Content-Type Size
0001-pass-eflags-to-worker-v1.patch application/octet-stream 1.4 KB
0002-forces-oids-neatnikism-v1.patch application/octet-stream 937 bytes
0003-skip-gather-project-v2.patch application/octet-stream 10.4 KB
0004-shm-mq-less-spinlocks-v2.patch application/octet-stream 13.6 KB
0005-shm-mq-reduce-receiver-latch-set-v1.patch application/octet-stream 7.5 KB
0006-remove-memory-leak-protection-v1.patch application/octet-stream 4.4 KB

In response to


Browse pgsql-hackers by date

  From Date Subject
Next Message Mark Dilger 2017-11-10 15:17:15 Re: PATCH: multivariate histograms and MCV lists
Previous Message Pavel Stehule 2017-11-10 14:49:28 Re: Variable substitution in psql backtick expansion