Re: Adding REPACK [concurrently]
От | Antonin Houska |
---|---|
Тема | Re: Adding REPACK [concurrently] |
Дата | |
Msg-id | 24483.1756142534@localhost обсуждение исходный текст |
Ответ на | Re: Adding REPACK [concurrently] (Mihail Nikalayeu <mihailnikalayeu@gmail.com>) |
Ответы |
Re: Adding REPACK [concurrently]
|
Список | pgsql-hackers |
Mihail Nikalayeu <mihailnikalayeu@gmail.com> wrote: > Hi, Antonin > > > How does HeapTupleSatisfiesSelf() recognize the status of any XID w/o using a > > snapshot? Do you mean by checking the commit log (TransactionIdDidCommit) ? > > Yes, TransactionIdDidCommit. I think the problem is that HeapTupleSatisfiesSelf() uses TransactionIdIsInProgress() instead of checking the snapshot: ... else if (TransactionIdIsInProgress(HeapTupleHeaderGetRawXmin(tuple))) return false; else if (TransactionIdDidCommit(HeapTupleHeaderGetRawXmin(tuple))) ... When decoding (and replaying) data changes, you deal with the database state as it was (far) in the past. However TransactionIdIsInProgress() is not suitable for this purpose. And since CommitTransaction() updates the commit log before removing the transaction from ProcArray, I can even imagine race conditions: if a transaction is committed and decoded fast enough, TransactionIdIsInProgress() might still return true. In such a case, HeapTupleSatisfiesSelf() returns false instead of calling TransactionIdDidCommit(). > Another option is just invent a new > snapshot type - SnapshotBelieveEverythingCommitted - for that > particular case it should work - because all xmin/xmax written into > the new table are committed by design. I'd prefer optimization of the logical decoding for REPACK CONCURRENTLY, and using the MVCC snapshots. -- Antonin Houska Web: https://www.cybertec-postgresql.com
В списке pgsql-hackers по дате отправления: