Re: Proposal: PqSendBuffer removal - Mailing list pgsql-hackers

From Andres Freund
Subject Re: Proposal: PqSendBuffer removal
Date
Msg-id 20200307183345.2sozssvtuh5bt6ri@alap3.anarazel.de
Whole thread Raw
In response to Re: Proposal: PqSendBuffer removal  (Aleksei Ivanov <iv.alekseii@gmail.com>)
Responses Re: Proposal: PqSendBuffer removal  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
Hi,

On 2020-03-06 11:09:23 -0800, Aleksei Ivanov wrote:
> *>Then we could get a StringInfo pointing directly to the current insertion
> point in the send buffer.  To support growing it, enlargeStringInfo would
> first subtract the offset to the start of the allocation, and then
> reallocate that*.
>
> I thought about it yesterday and one issue with this approach is how would
> you known the length of the packet to be sent. As we can’t returned back in
> PqSendBuffer. Also realloc is quite expensive operation.

Could you expand a bit on what you see as the problem? Because I'm not
following?

What does any of this have to do with realloc performance? I mean, the
buffer would just scale up once, so the cost of that would be very
quickly amortized?

What I'm thinking is that we'd have pg_beginmessage() (potentially a
different named version) initialize the relevant StringInfo basically as

(StringInfoData){
    .data = PqSendPointer,
    .len = 0,
    .alloc_offset = PqSendBuffer - PqSendBuffer
}

and that pq_endmessage would then advance the equivalent (see below [1]) of
what today is PqSendPointer to be PqSendPointer += StringInfo->len;

That'd mean that we'd never need to copy data in/out the send buffer
anymore, because we'd directly construct the message in the send
buffer. Pretty much all important FE/BE communication goes through
pq_beginmessage[_reuse()].

We'd have to add some defenses against building multiple messages at the
same time. But neither do I think that is common, nor does it seem hard
to defend againt: A simple counter should do the trick?

Regards,
Andres


[1] Obviously the above sketch doesn't quite work that way. We can't
just have stringinfo reallocate the buffer. Feels quite solvable though.



pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: More tests to stress directly checksum_impl.h
Next
From: Tom Lane
Date:
Subject: Re: ccache is required by postgresql12-devel RPM