Re: [PATCH] Logical decoding of TRUNCATE - Mailing list pgsql-hackers

From Alvaro Herrera
Subject Re: [PATCH] Logical decoding of TRUNCATE
Date
Msg-id 20180405170712.av633jvnnizmd5sn@alvherre.pgsql
Whole thread Raw
In response to Re: [PATCH] Logical decoding of TRUNCATE  (Peter Eisentraut <peter.eisentraut@2ndquadrant.com>)
Responses Re: [PATCH] Logical decoding of TRUNCATE
List pgsql-hackers
This sounds like a good approach.

> +static void
> +pg_decode_truncate(LogicalDecodingContext *ctx, ReorderBufferTXN *txn,
> +                   int nrelations, Relation relations[], ReorderBufferChange *change)
> +{

> +    for (i = 0; i < nrelations; i++)
> +    {
> +        Oid            relid = RelationGetRelid(relations[i]);
> +
> +        if (i > 0)
> +            appendStringInfoString(ctx->out, ", ");
> +
> +        appendStringInfoString(ctx->out,
> +                               quote_qualified_identifier(
> +                                   get_namespace_name(get_rel_namespace(relid)),
> +                                   get_rel_name(relid)));

Note that you start the loop having the Relation; yet you go extra
length to grab the relnamespace and relname from syscache instead of
just relations[i]->rd_rel->relname etc.

pgoutput doesn't do it that way, so it doesn't affect logical
replication, but I think it's best not to create awkward code in
test_decoding, since it's so widely copied.


> +    else if (info == XLOG_HEAP_TRUNCATE)
> +    {
> +        xl_heap_truncate *xlrec = (xl_heap_truncate *) rec;
> +
> +        if (xlrec->flags & XLH_TRUNCATE_CASCADE)
> +            appendStringInfo(buf, "cascade ");
> +        if (xlrec->flags & XLH_TRUNCATE_RESTART_SEQS)
> +            appendStringInfo(buf, "restart_seqs ");
> +        appendStringInfo(buf, "nrelids %u", xlrec->nrelids);
> +        /* skip the list of relids */
> +    }

Maybe not a big deal, but for future pg_waldump users I'm sure it'll be
nice to have the OIDs here.

> +void
> +ExecuteTruncateGuts(List *explicit_rels, List *relids, List *relids_logged,
> +                            DropBehavior behavior, bool restart_seqs)
> +{

Please add a comment atop this function.

  
> +    /*
> +     * Write a WAL record to allow this set of actions to be logically decoded.
> +     *
> +     * Assemble an array of relids so we can write a single WAL record for the
> +     * whole action.
> +     */
> +    if (list_length(relids_logged) > 0)
> +    {
> +        xl_heap_truncate xlrec;
> +        int            i = 0;

I wonder if this should happen only if logical decoding?  (Maybe it
already occurs because relids_logged would be empty?  Worth a comment in
that case)

-- 
Álvaro Herrera                https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services


pgsql-hackers by date:

Previous
From: Magnus Hagander
Date:
Subject: Re: Allow workers to override datallowconn
Next
From: Tom Lane
Date:
Subject: Re: WIP: a way forward on bootstrap data