More heap tuple header fixes

Поиск
Список
Период
Сортировка
От Manfred Koizar
Тема More heap tuple header fixes
Дата
Msg-id 6a9jjugghnmphrjk7i3h51rokfl268e5hi@4ax.com
обсуждение исходный текст
Ответы Re: More heap tuple header fixes  (Tom Lane <tgl@sss.pgh.pa.us>)
Re: More heap tuple header fixes  (Bruce Momjian <pgman@candle.pha.pa.us>)
Re: More heap tuple header fixes  (Bruce Momjian <pgman@candle.pha.pa.us>)
Список pgsql-patches
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)

В списке pgsql-patches по дате отправления:

Предыдущее
От: nconway@klamath.dyndns.org (Neil Conway)
Дата:
Сообщение: Re: default attstattarget
Следующее
От: Tom Lane
Дата:
Сообщение: Re: More heap tuple header fixes