On 23 February 2015 at 16:53, Andres Freund <and...@2ndquadrant.com> wrote:

> On 2015-02-23 15:48:25 +0000, Thom Brown wrote:
> > On 23 February 2015 at 15:42, Andres Freund <and...@2ndquadrant.com>
> wrote:
> >
> > > On 2015-02-23 16:38:44 +0100, Andres Freund wrote:
> > > > I unfortunately don't remember enough of the thread to reference it
> > > > here.
> > >
> > > Found the right keywords. The threads below
> > >
> > >
> http://archives.postgresql.org/message-id/369698E947874884A77849D8FE3680C2%40maumau
> > > and
> > >
> > >
> http://www.postgresql.org/message-id/5CF4ABBA67674088B3941894E22A0D25@maumau
> > >
> >
> > Yes, this seems to be virtually the same issue reported.  The trace looks
> > the same except for RecordTransactionCommit.
>
> So, I proposed in
>
> http://www.postgresql.org/message-id/20140707155113.gb1...@alap3.anarazel.de
> that we make sequences assign a xid and only wait for syncrep when a xid
> is assigned. The biggest blocker was that somebody would have to do some
> code reviewing to find other locations that might need similar
> treatment.
>
> I did a, quick, grep for XLogInsert() and I think we're otherwise
> fine. There's some debatable cases:
>
> * XLOG_STANDBY_LOCK  doesn't force a xid to be assigned. I think it's
>   harmless though, as we really only need to wait for that to be
>   replicated if the transaction did something relevant (i.e. catalog
>   changes). And those will force xid assignment.
> * 2pc records don't assign a xid. But twophase.c does it's own waiting,
>   so that's fine.
> * Plain vacuums will not trigger waits. But I think that's good. There's
>   really no need to wait if all that's been done is some cleanup without
>   visible consequences.
> * Fujii brought up that we might want to wait for XLOG_SWITCH - I don't
>   really see why.
> * XLOG_RESTORE_POINT is a similar candidate - I don't see really valid
>   arguments for making 2pc wait.
>
>
> The attached, untested, patch changes things so that we
> a) only wait for syncrep if we both wrote WAL and had a xid assigned
> b) use an async commit if we just had a xid assigned, without having
>    written WAL, even if synchronous_commit = off
> c) acquire a xid when WAL logging sequence changes (arguable at least
>    one of the xid assignments is redundant, but it doesn't cost
>    anything, so ...)
>
> I think it makes sense to change a) and b) that way because there's no
> need to wait for WAL flushes/syncrep waits when all that happened is
> manipulations of temporary/unlogged tables or HOT pruning. It's slightly
> wierd that the on-disk flush and the syncrep wait essentially used two
> different mechanisms for deciding when to flush.
>
> Comments? This is obviously just a POC, but I think something like this
> does make a great deal of sense.
>
> Thom, does that help?


Yeah, this appears to eliminate the problem, at least in the case I
reported.

Thanks

-- 
Thom

Reply via email to