Re: Binary support for pgoutput plugin

From: Petr Jelinek <petr(at)2ndquadrant(dot)com>
To: Dave Cramer <davecramer(at)gmail(dot)com>
Cc: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Michael Paquier <michael(at)paquier(dot)xyz>, Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>, Dmitry Dolgov <9erthalion6(at)gmail(dot)com>, Thomas Munro <thomas(dot)munro(at)gmail(dot)com>, Tomas Vondra <tomas(dot)vondra(at)2ndquadrant(dot)com>, Petr Jelinek <petr(dot)jelinek(at)2ndquadrant(dot)com>, Andres Freund <andres(at)anarazel(dot)de>, PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Binary support for pgoutput plugin
Date: 2020-04-03 07:42:57
Message-ID: a7b64770-1346-c672-d328-50582d6b8e1f@2ndquadrant.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi,

On 08/03/2020 00:18, Dave Cramer wrote:
> On Fri, 6 Mar 2020 at 08:54, Petr Jelinek <petr(at)2ndquadrant(dot)com
> <mailto:petr(at)2ndquadrant(dot)com>> wrote:
>
> Hi Dave,
>
> On 29/02/2020 18:44, Dave Cramer wrote:
> >
> >
> > rebased and removed the catversion bump.
>
> Looked into this and it generally seems okay, but I do have one
> gripe here:
>
> > +                                     tuple->values[i].data =
> palloc(len + 1);
> > +                                     /* and data */
> > +
> > +                                     pq_copymsgbytes(in,
> tuple->values[i].data, len);
> > +                                     tuple->values[i].len = len;
> > +                                     tuple->values[i].cursor = 0;
> > +                                     tuple->values[i].maxlen = len;
> > +                                     /* not strictly necessary
> but the docs say it is required */
> > +                                     tuple->values[i].data[len]
> = '\0';
> > +                                     break;
> > +                             }
> > +                     case 't':                       /* text
> formatted value */
> > +                             {
> > +                                     tuple->changed[i] = true;
> > +                                     int len = pq_getmsgint(in,
> 4);  /* read length */
> >
> >                                       /* and data */
> > -                                     tuple->values[i] =
> palloc(len + 1);
> > -                                     pq_copymsgbytes(in,
> tuple->values[i], len);
> > -                                     tuple->values[i][len] = '\0';
> > +                                     tuple->values[i].data =
> palloc(len + 1);
> > +                                     pq_copymsgbytes(in,
> tuple->values[i].data, len);
> > +                                     tuple->values[i].data[len]
> = '\0';
> > +                                     tuple->values[i].len = len;
>
> The cursor should be set to 0 in the text formatted case too if this is
> how we chose to encode data.
>
> However I am not quite convinced I like the StringInfoData usage here.
> Why not just change the struct to include additional array of lengths
> rather than replacing the existing values array with StringInfoData
> array, that seems generally both simpler and should have smaller memory
> footprint too, no?
>
>
> Can you explain this a bit more? I don't really see a huge difference in
> memory usage.
> We still need length and the data copied into LogicalRepTupleData when
> sending the data in binary, no?
>

Yes but we don't need to have fixed sized array of 1600 elements that
contains maxlen and cursor positions of the StringInfoData struct which
we don't use for anything AFAICS.

--
Petr Jelinek
2ndQuadrant - PostgreSQL Solutions for the Enterprise
https://www.2ndQuadrant.com/

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Petr Jelinek 2020-04-03 07:52:07 Re: adding partitioned tables to publications
Previous Message Julien Rouhaud 2020-04-03 07:26:28 Re: Planning counters in pg_stat_statements (using pgss_store)