Re: More heap tuple header fixes - Mailing list pgsql-patches
| From | Bruce Momjian |
|---|---|
| Subject | Re: More heap tuple header fixes |
| Date | |
| Msg-id | 200207301608.g6UG8Wh02564@candle.pha.pa.us Whole thread Raw |
| In response to | More heap tuple header fixes (Manfred Koizar <mkoi-pg@aon.at>) |
| List | pgsql-patches |
Patch applied. Thanks.
---------------------------------------------------------------------------
Manfred Koizar wrote:
> This patch fixes one serious bug (runaway INSERT) and a few rare (and
> hard to reproduce) error conditions.
>
> Servus
> Manfred
> diff -ruN ../base/src/backend/access/heap/heapam.c src/backend/access/heap/heapam.c
> --- ../base/src/backend/access/heap/heapam.c 2002-07-20 17:27:18.000000000 +0200
> +++ src/backend/access/heap/heapam.c 2002-07-20 19:43:19.000000000 +0200
> @@ -1123,11 +1123,14 @@
> CheckMaxObjectId(HeapTupleGetOid(tup));
> }
>
> + tup->t_data->t_infomask &= ~(HEAP_XACT_MASK);
> HeapTupleHeaderSetXmin(tup->t_data, GetCurrentTransactionId());
> HeapTupleHeaderSetCmin(tup->t_data, cid);
> HeapTupleHeaderSetXmaxInvalid(tup->t_data);
> - HeapTupleHeaderSetCmax(tup->t_data, FirstCommandId);
> - tup->t_data->t_infomask &= ~(HEAP_XACT_MASK);
> + /*
> + * Do *not* set Cmax! This would overwrite Cmin.
> + */
> + /* HeapTupleHeaderSetCmax(tup->t_data, FirstCommandId); */
> tup->t_data->t_infomask |= HEAP_XMAX_INVALID;
> tup->t_tableOid = relation->rd_id;
>
> @@ -2147,7 +2150,11 @@
>
> if (redo)
> {
> - htup->t_infomask &= ~(HEAP_XMAX_COMMITTED |
> + /*
> + * On redo from WAL we cannot rely on a tqual-routine
> + * to have reset HEAP_MOVED.
> + */
> + htup->t_infomask &= ~(HEAP_MOVED | HEAP_XMAX_COMMITTED |
> HEAP_XMAX_INVALID | HEAP_MARKED_FOR_UPDATE);
> HeapTupleHeaderSetXmax(htup, record->xl_xid);
> HeapTupleHeaderSetCmax(htup, FirstCommandId);
> @@ -2320,7 +2327,11 @@
> }
> else
> {
> - htup->t_infomask &= ~(HEAP_XMAX_COMMITTED |
> + /*
> + * On redo from WAL we cannot rely on a tqual-routine
> + * to have reset HEAP_MOVED.
> + */
> + htup->t_infomask &= ~(HEAP_MOVED | HEAP_XMAX_COMMITTED |
> HEAP_XMAX_INVALID | HEAP_MARKED_FOR_UPDATE);
> HeapTupleHeaderSetXmax(htup, record->xl_xid);
> HeapTupleHeaderSetCmax(htup, FirstCommandId);
> diff -ruN ../base/src/backend/utils/time/tqual.c src/backend/utils/time/tqual.c
> --- ../base/src/backend/utils/time/tqual.c 2002-07-20 17:27:19.000000000 +0200
> +++ src/backend/utils/time/tqual.c 2002-07-20 19:27:03.000000000 +0200
> @@ -83,6 +83,7 @@
> return false;
> }
> tuple->t_infomask |= HEAP_XMIN_COMMITTED;
> + tuple->t_infomask &= ~HEAP_MOVED;
> }
> }
> else if (tuple->t_infomask & HEAP_MOVED_IN)
>
> ---------------------------(end of broadcast)---------------------------
> TIP 5: Have you checked our extensive FAQ?
>
> http://www.postgresql.org/users-lounge/docs/faq.html
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026
pgsql-patches by date: