Re: Problem with txid_snapshot_in/out() functionality

From: Marko Kreen <markokr(at)gmail(dot)com>
To: Jan Wieck <jan(at)wi3ck(dot)info>
Cc: Andres Freund <andres(at)2ndquadrant(dot)com>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Heikki Linnakangas <hlinnakangas(at)vmware(dot)com>, PostgreSQL Development <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Problem with txid_snapshot_in/out() functionality
Date: 2014-04-13 12:27:24
Message-ID: 20140413122724.GA12792@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Sat, Apr 12, 2014 at 02:10:13PM -0400, Jan Wieck wrote:
> Since it doesn't seem to produce any side effects, I'd think that
> making the snapshot unique within txid_current_snapshot() and
> filtering duplicates on input should be sufficient and eligible for
> backpatching.

Agreed.

> The attached patch adds a unique loop to the internal
> sort_snapshot() function and skips duplicates on input. The git
> commit is here:
>
> https://github.com/wieck/postgres/commit/a88a2b2c25b856478d7e2b012fc718106338fe00

> static void
> sort_snapshot(TxidSnapshot *snap)
> {
> + txid last = 0;
> + int nxip, idx1, idx2;
> +
> if (snap->nxip > 1)
> + {
> qsort(snap->xip, snap->nxip, sizeof(txid), cmp_txid);
> + nxip = snap->nxip;
> + idx1 = idx2 = 0;
> + while (idx1 < nxip)
> + {
> + if (snap->xip[idx1] != last)
> + last = snap->xip[idx2++] = snap->xip[idx1];
> + else
> + snap->nxip--;
> + idx1++;
> + }
> + }
> }

I think you need to do SET_VARSIZE also here. Alternative is to
move SET_VARSIZE after sort_snapshot().

And it seems the drop-double-txid logic should be added also to
txid_snapshot_recv(). It seems weird to have it behave differently
from txid_snapshot_in().

--
marko

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Christian Ullrich 2014-04-13 12:29:13 Re: PostgreSQL in Windows console and Ctrl-C
Previous Message Simon Riggs 2014-04-13 12:13:16 Re: integrate pg_upgrade analyze_new_cluster.sh into vacuumdb