On 04/13/14 08:27, Marko Kreen wrote:
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().


Thanks,

yes on both issues. Will create another patch.


Jan

--
Jan Wieck
Senior Software Engineer
http://slony.info


--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to