diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2003-01-26 23:09:37 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2003-01-26 23:09:37 +0000 |
commit | 12fa07750e47411e092f31e2a68bcaa36e4a3c78 (patch) | |
tree | e6540d16bdad213ec29da345084562df780db109 | |
parent | 3c877e57f39ed5c4e7302cadf94debd3458c054f (diff) | |
download | postgresql-12fa07750e47411e092f31e2a68bcaa36e4a3c78.tar.gz |
Back-patch fixes to ensure t_ctid always has correct value (prevents
some instances of 'No one parent tuple' VACUUM error, and perhaps
worse things).
-rw-r--r-- | src/backend/access/heap/heapam.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 336539f74d..0ab2c08f30 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.129.2.1 2002/05/01 01:27:31 inoue Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.129.2.2 2003/01/26 23:09:37 tgl Exp $ * * * INTERFACE ROUTINES @@ -1231,6 +1231,9 @@ l1: tp.t_data->t_cmax = GetCurrentCommandId(); tp.t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED | HEAP_XMAX_INVALID | HEAP_MARKED_FOR_UPDATE); + /* Make sure there is no forward chain link in t_ctid */ + tp.t_data->t_ctid = tp.t_self; + /* XLOG stuff */ { xl_heap_delete xlrec; @@ -1724,6 +1727,8 @@ l3: tuple->t_data->t_cmax = GetCurrentCommandId(); tuple->t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED | HEAP_XMAX_INVALID); tuple->t_data->t_infomask |= HEAP_MARKED_FOR_UPDATE; + /* Make sure there is no forward chain link in t_ctid */ + tuple->t_data->t_ctid = *tid; LockBuffer(*buffer, BUFFER_LOCK_UNLOCK); @@ -1992,6 +1997,9 @@ heap_xlog_clean(bool redo, XLogRecPtr lsn, XLogRecord *record) } PageRepairFragmentation(page, NULL); + + PageSetLSN(page, lsn); + PageSetSUI(page, ThisStartUpID); /* prev sui */ UnlockAndWriteBuffer(buffer); } @@ -2048,6 +2056,8 @@ heap_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record) htup->t_cmax = FirstCommandId; htup->t_infomask &= ~(HEAP_XMAX_COMMITTED | HEAP_XMAX_INVALID | HEAP_MARKED_FOR_UPDATE); + /* Make sure there is no forward chain link in t_ctid */ + htup->t_ctid = xlrec->target.tid; PageSetLSN(page, lsn); PageSetSUI(page, ThisStartUpID); UnlockAndWriteBuffer(buffer); @@ -2124,6 +2134,7 @@ heap_xlog_insert(bool redo, XLogRecPtr lsn, XLogRecord *record) htup->t_xmax = InvalidTransactionId; htup->t_cmax = FirstCommandId; htup->t_infomask = HEAP_XMAX_INVALID | xlhdr.mask; + htup->t_ctid = xlrec->target.tid; offnum = PageAddItem(page, (Item) htup, newlen, offnum, LP_USED | OverwritePageMode); @@ -2208,6 +2219,8 @@ heap_xlog_update(bool redo, XLogRecPtr lsn, XLogRecord *record, bool move) htup->t_infomask &= ~(HEAP_XMIN_COMMITTED | HEAP_XMIN_INVALID | HEAP_MOVED_IN); htup->t_infomask |= HEAP_MOVED_OFF; + /* Make sure there is no forward chain link in t_ctid */ + htup->t_ctid = xlrec->target.tid; } else { @@ -2215,6 +2228,8 @@ heap_xlog_update(bool redo, XLogRecPtr lsn, XLogRecord *record, bool move) htup->t_cmax = FirstCommandId; htup->t_infomask &= ~(HEAP_XMAX_COMMITTED | HEAP_XMAX_INVALID | HEAP_MARKED_FOR_UPDATE); + /* Set forward chain link in t_ctid */ + htup->t_ctid = xlrec->newtid; } if (samepage) goto newsame; @@ -2311,6 +2326,8 @@ newsame:; htup->t_cmax = FirstCommandId; htup->t_infomask = HEAP_XMAX_INVALID | xlhdr.mask; } + /* Make sure there is no forward chain link in t_ctid */ + htup->t_ctid = xlrec->newtid; offnum = PageAddItem(page, (Item) htup, newlen, offnum, LP_USED | OverwritePageMode); |