diff options
Diffstat (limited to 'src/backend/commands')
-rw-r--r-- | src/backend/commands/sequence.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index 622ccf75184..0070c4f34ef 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -17,6 +17,7 @@ #include "access/htup_details.h" #include "access/multixact.h" #include "access/transam.h" +#include "access/xact.h" #include "access/xlog.h" #include "access/xloginsert.h" #include "access/xlogutils.h" @@ -358,6 +359,10 @@ fill_seq_with_data(Relation rel, HeapTuple tuple) tuple->t_data->t_infomask |= HEAP_XMAX_INVALID; ItemPointerSet(&tuple->t_data->t_ctid, 0, FirstOffsetNumber); + /* check the comment above nextval_internal()'s equivalent call. */ + if (RelationNeedsWAL(rel)) + GetTopTransactionId(); + START_CRIT_SECTION(); MarkBufferDirty(buf); @@ -438,6 +443,10 @@ AlterSequence(AlterSeqStmt *stmt) /* Note that we do not change the currval() state */ elm->cached = elm->last; + /* check the comment above nextval_internal()'s equivalent call. */ + if (RelationNeedsWAL(seqrel)) + GetTopTransactionId(); + /* Now okay to update the on-disk tuple */ START_CRIT_SECTION(); @@ -679,6 +688,16 @@ nextval_internal(Oid relid) last_used_seq = elm; + /* + * If something needs to be WAL logged, acquire an xid, so this + * transaction's commit will trigger a WAL flush and wait for + * syncrep. It's sufficient to ensure the toplevel transaction has a xid, + * no need to assign xids subxacts, that'll already trigger a appropriate + * wait. (Have to do that here, so we're outside the critical section) + */ + if (logit && RelationNeedsWAL(seqrel)) + GetTopTransactionId(); + /* ready to change the on-disk (or really, in-buffer) tuple */ START_CRIT_SECTION(); @@ -867,6 +886,10 @@ do_setval(Oid relid, int64 next, bool iscalled) /* In any case, forget any future cached numbers */ elm->cached = elm->last; + /* check the comment above nextval_internal()'s equivalent call. */ + if (RelationNeedsWAL(seqrel)) + GetTopTransactionId(); + /* ready to change the on-disk (or really, in-buffer) tuple */ START_CRIT_SECTION(); |