Skip to content

Commit dd23a88

Browse files
committed
>> If a transaction marks a tuple for update and later commits without
>> actually having updated the tuple, [...] can we simply >> set the HEAP_XMAX_INVALID hint bit of the tuple? > >AFAICS this is a reasonable thing to do. Thanks for the confirmation. Here's a patch which also contains some more noncritical changes to tqual.c: . make code more readable by introducing local variables for xvac . no longer two separate branches for aborted and crashed. The actions were the same in all cases. Manfred Koizar
1 parent fce529e commit dd23a88

File tree

2 files changed

+84
-69
lines changed

2 files changed

+84
-69
lines changed

src/backend/utils/adt/inet_net_ntop.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
*/
1717

1818
#if defined(LIBC_SCCS) && !defined(lint)
19-
static const char rcsid[] = "$Id: inet_net_ntop.c,v 1.14 2003/06/24 22:42:42 momjian Exp $";
19+
static const char rcsid[] = "$Id: inet_net_ntop.c,v 1.15 2003/06/25 01:08:13 momjian Exp $";
2020
#endif
2121

2222
#include "postgres.h"
@@ -270,9 +270,9 @@ inet_cidr_ntop_ipv6(const u_char *src, int bits, char *dst, size_t size)
270270

271271
if (!double_colon) {
272272
if (bits < 128 - 32)
273-
cp += SPRINTF((cp, "::%d", bits));
273+
cp += SPRINTF((cp, "::"));
274274
else if (bits < 128 - 16)
275-
cp += SPRINTF((cp, ":0%d", bits));
275+
cp += SPRINTF((cp, ":0"));
276276
}
277277

278278
/* Format CIDR /width. */

src/backend/utils/time/tqual.c

Lines changed: 81 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
* Portions Copyright (c) 1994, Regents of the University of California
1717
*
1818
* IDENTIFICATION
19-
* $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.63 2003/06/12 01:42:20 momjian Exp $
19+
* $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.64 2003/06/25 01:08:13 momjian Exp $
2020
*
2121
*-------------------------------------------------------------------------
2222
*/
@@ -76,11 +76,12 @@ HeapTupleSatisfiesItself(HeapTupleHeader tuple)
7676

7777
if (tuple->t_infomask & HEAP_MOVED_OFF)
7878
{
79-
if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple)))
79+
TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
80+
if (TransactionIdIsCurrentTransactionId(xvac))
8081
return false;
81-
if (!TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple)))
82+
if (!TransactionIdIsInProgress(xvac))
8283
{
83-
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple)))
84+
if (TransactionIdDidCommit(xvac))
8485
{
8586
tuple->t_infomask |= HEAP_XMIN_INVALID;
8687
return false;
@@ -90,11 +91,12 @@ HeapTupleSatisfiesItself(HeapTupleHeader tuple)
9091
}
9192
else if (tuple->t_infomask & HEAP_MOVED_IN)
9293
{
93-
if (!TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple)))
94+
TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
95+
if (!TransactionIdIsCurrentTransactionId(xvac))
9496
{
95-
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple)))
97+
if (TransactionIdIsInProgress(xvac))
9698
return false;
97-
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple)))
99+
if (TransactionIdDidCommit(xvac))
98100
tuple->t_infomask |= HEAP_XMIN_COMMITTED;
99101
else
100102
{
@@ -152,11 +154,14 @@ HeapTupleSatisfiesItself(HeapTupleHeader tuple)
152154
}
153155

154156
/* xmax transaction committed */
155-
tuple->t_infomask |= HEAP_XMAX_COMMITTED;
156157

157158
if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)
159+
{
160+
tuple->t_infomask |= HEAP_XMAX_INVALID;
158161
return true;
162+
}
159163

164+
tuple->t_infomask |= HEAP_XMAX_COMMITTED;
160165
return false;
161166
}
162167

@@ -212,11 +217,12 @@ HeapTupleSatisfiesNow(HeapTupleHeader tuple)
212217

213218
if (tuple->t_infomask & HEAP_MOVED_OFF)
214219
{
215-
if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple)))
220+
TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
221+
if (TransactionIdIsCurrentTransactionId(xvac))
216222
return false;
217-
if (!TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple)))
223+
if (!TransactionIdIsInProgress(xvac))
218224
{
219-
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple)))
225+
if (TransactionIdDidCommit(xvac))
220226
{
221227
tuple->t_infomask |= HEAP_XMIN_INVALID;
222228
return false;
@@ -226,11 +232,12 @@ HeapTupleSatisfiesNow(HeapTupleHeader tuple)
226232
}
227233
else if (tuple->t_infomask & HEAP_MOVED_IN)
228234
{
229-
if (!TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple)))
235+
TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
236+
if (!TransactionIdIsCurrentTransactionId(xvac))
230237
{
231-
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple)))
238+
if (TransactionIdIsInProgress(xvac))
232239
return false;
233-
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple)))
240+
if (TransactionIdDidCommit(xvac))
234241
tuple->t_infomask |= HEAP_XMIN_COMMITTED;
235242
else
236243
{
@@ -297,11 +304,14 @@ HeapTupleSatisfiesNow(HeapTupleHeader tuple)
297304
}
298305

299306
/* xmax transaction committed */
300-
tuple->t_infomask |= HEAP_XMAX_COMMITTED;
301307

302308
if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)
309+
{
310+
tuple->t_infomask |= HEAP_XMAX_INVALID;
303311
return true;
312+
}
304313

314+
tuple->t_infomask |= HEAP_XMAX_COMMITTED;
305315
return false;
306316
}
307317

@@ -329,11 +339,12 @@ HeapTupleSatisfiesToast(HeapTupleHeader tuple)
329339

330340
if (tuple->t_infomask & HEAP_MOVED_OFF)
331341
{
332-
if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple)))
342+
TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
343+
if (TransactionIdIsCurrentTransactionId(xvac))
333344
return false;
334-
if (!TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple)))
345+
if (!TransactionIdIsInProgress(xvac))
335346
{
336-
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple)))
347+
if (TransactionIdDidCommit(xvac))
337348
{
338349
tuple->t_infomask |= HEAP_XMIN_INVALID;
339350
return false;
@@ -343,11 +354,12 @@ HeapTupleSatisfiesToast(HeapTupleHeader tuple)
343354
}
344355
else if (tuple->t_infomask & HEAP_MOVED_IN)
345356
{
346-
if (!TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple)))
357+
TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
358+
if (!TransactionIdIsCurrentTransactionId(xvac))
347359
{
348-
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple)))
360+
if (TransactionIdIsInProgress(xvac))
349361
return false;
350-
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple)))
362+
if (TransactionIdDidCommit(xvac))
351363
tuple->t_infomask |= HEAP_XMIN_COMMITTED;
352364
else
353365
{
@@ -382,11 +394,12 @@ HeapTupleSatisfiesUpdate(HeapTuple htuple, CommandId curcid)
382394

383395
if (tuple->t_infomask & HEAP_MOVED_OFF)
384396
{
385-
if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple)))
397+
TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
398+
if (TransactionIdIsCurrentTransactionId(xvac))
386399
return HeapTupleInvisible;
387-
if (!TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple)))
400+
if (!TransactionIdIsInProgress(xvac))
388401
{
389-
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple)))
402+
if (TransactionIdDidCommit(xvac))
390403
{
391404
tuple->t_infomask |= HEAP_XMIN_INVALID;
392405
return HeapTupleInvisible;
@@ -396,11 +409,12 @@ HeapTupleSatisfiesUpdate(HeapTuple htuple, CommandId curcid)
396409
}
397410
else if (tuple->t_infomask & HEAP_MOVED_IN)
398411
{
399-
if (!TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple)))
412+
TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
413+
if (!TransactionIdIsCurrentTransactionId(xvac))
400414
{
401-
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple)))
415+
if (TransactionIdIsInProgress(xvac))
402416
return HeapTupleInvisible;
403-
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple)))
417+
if (TransactionIdDidCommit(xvac))
404418
tuple->t_infomask |= HEAP_XMIN_COMMITTED;
405419
else
406420
{
@@ -475,11 +489,14 @@ HeapTupleSatisfiesUpdate(HeapTuple htuple, CommandId curcid)
475489
}
476490

477491
/* xmax transaction committed */
478-
tuple->t_infomask |= HEAP_XMAX_COMMITTED;
479492

480493
if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)
494+
{
495+
tuple->t_infomask |= HEAP_XMAX_INVALID;
481496
return HeapTupleMayBeUpdated;
497+
}
482498

499+
tuple->t_infomask |= HEAP_XMAX_COMMITTED;
483500
return HeapTupleUpdated; /* updated by other */
484501
}
485502

@@ -513,11 +530,12 @@ HeapTupleSatisfiesDirty(HeapTupleHeader tuple)
513530

514531
if (tuple->t_infomask & HEAP_MOVED_OFF)
515532
{
516-
if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple)))
533+
TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
534+
if (TransactionIdIsCurrentTransactionId(xvac))
517535
return false;
518-
if (!TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple)))
536+
if (!TransactionIdIsInProgress(xvac))
519537
{
520-
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple)))
538+
if (TransactionIdDidCommit(xvac))
521539
{
522540
tuple->t_infomask |= HEAP_XMIN_INVALID;
523541
return false;
@@ -527,11 +545,12 @@ HeapTupleSatisfiesDirty(HeapTupleHeader tuple)
527545
}
528546
else if (tuple->t_infomask & HEAP_MOVED_IN)
529547
{
530-
if (!TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple)))
548+
TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
549+
if (!TransactionIdIsCurrentTransactionId(xvac))
531550
{
532-
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple)))
551+
if (TransactionIdIsInProgress(xvac))
533552
return false;
534-
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple)))
553+
if (TransactionIdDidCommit(xvac))
535554
tuple->t_infomask |= HEAP_XMIN_COMMITTED;
536555
else
537556
{
@@ -600,11 +619,14 @@ HeapTupleSatisfiesDirty(HeapTupleHeader tuple)
600619
}
601620

602621
/* xmax transaction committed */
603-
tuple->t_infomask |= HEAP_XMAX_COMMITTED;
604622

605623
if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)
624+
{
625+
tuple->t_infomask |= HEAP_XMAX_INVALID;
606626
return true;
627+
}
607628

629+
tuple->t_infomask |= HEAP_XMAX_COMMITTED;
608630
SnapshotDirty->tid = tuple->t_ctid;
609631
return false; /* updated by other */
610632
}
@@ -644,11 +666,12 @@ HeapTupleSatisfiesSnapshot(HeapTupleHeader tuple, Snapshot snapshot)
644666

645667
if (tuple->t_infomask & HEAP_MOVED_OFF)
646668
{
647-
if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple)))
669+
TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
670+
if (TransactionIdIsCurrentTransactionId(xvac))
648671
return false;
649-
if (!TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple)))
672+
if (!TransactionIdIsInProgress(xvac))
650673
{
651-
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple)))
674+
if (TransactionIdDidCommit(xvac))
652675
{
653676
tuple->t_infomask |= HEAP_XMIN_INVALID;
654677
return false;
@@ -658,11 +681,12 @@ HeapTupleSatisfiesSnapshot(HeapTupleHeader tuple, Snapshot snapshot)
658681
}
659682
else if (tuple->t_infomask & HEAP_MOVED_IN)
660683
{
661-
if (!TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple)))
684+
TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
685+
if (!TransactionIdIsCurrentTransactionId(xvac))
662686
{
663-
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple)))
687+
if (TransactionIdIsInProgress(xvac))
664688
return false;
665-
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple)))
689+
if (TransactionIdDidCommit(xvac))
666690
tuple->t_infomask |= HEAP_XMIN_COMMITTED;
667691
else
668692
{
@@ -802,11 +826,12 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
802826
return HEAPTUPLE_DEAD;
803827
else if (tuple->t_infomask & HEAP_MOVED_OFF)
804828
{
805-
if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple)))
829+
TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
830+
if (TransactionIdIsCurrentTransactionId(xvac))
806831
return HEAPTUPLE_DELETE_IN_PROGRESS;
807-
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple)))
832+
if (TransactionIdIsInProgress(xvac))
808833
return HEAPTUPLE_DELETE_IN_PROGRESS;
809-
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple)))
834+
if (TransactionIdDidCommit(xvac))
810835
{
811836
tuple->t_infomask |= HEAP_XMIN_INVALID;
812837
return HEAPTUPLE_DEAD;
@@ -815,11 +840,12 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
815840
}
816841
else if (tuple->t_infomask & HEAP_MOVED_IN)
817842
{
818-
if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple)))
843+
TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
844+
if (TransactionIdIsCurrentTransactionId(xvac))
819845
return HEAPTUPLE_INSERT_IN_PROGRESS;
820-
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple)))
846+
if (TransactionIdIsInProgress(xvac))
821847
return HEAPTUPLE_INSERT_IN_PROGRESS;
822-
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple)))
848+
if (TransactionIdDidCommit(xvac))
823849
tuple->t_infomask |= HEAP_XMIN_COMMITTED;
824850
else
825851
{
@@ -831,16 +857,10 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
831857
return HEAPTUPLE_INSERT_IN_PROGRESS;
832858
else if (TransactionIdDidCommit(HeapTupleHeaderGetXmin(tuple)))
833859
tuple->t_infomask |= HEAP_XMIN_COMMITTED;
834-
else if (TransactionIdDidAbort(HeapTupleHeaderGetXmin(tuple)))
835-
{
836-
tuple->t_infomask |= HEAP_XMIN_INVALID;
837-
return HEAPTUPLE_DEAD;
838-
}
839860
else
840861
{
841862
/*
842-
* Not in Progress, Not Committed, Not Aborted - so it's from
843-
* crashed process. - vadim 11/26/96
863+
* Not in Progress, Not Committed, so either Aborted or crashed
844864
*/
845865
tuple->t_infomask |= HEAP_XMIN_INVALID;
846866
return HEAPTUPLE_DEAD;
@@ -868,11 +888,12 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
868888
{
869889
if (TransactionIdIsInProgress(HeapTupleHeaderGetXmax(tuple)))
870890
return HEAPTUPLE_LIVE;
871-
if (TransactionIdDidCommit(HeapTupleHeaderGetXmax(tuple)))
872-
tuple->t_infomask |= HEAP_XMAX_COMMITTED;
873-
else
874-
/* it's either aborted or crashed */
875-
tuple->t_infomask |= HEAP_XMAX_INVALID;
891+
/*
892+
* We don't really care whether xmax did commit, abort or crash.
893+
* We know that xmax did mark the tuple for update, but it did not
894+
* and will never actually update it.
895+
*/
896+
tuple->t_infomask |= HEAP_XMAX_INVALID;
876897
}
877898
return HEAPTUPLE_LIVE;
878899
}
@@ -883,16 +904,10 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
883904
return HEAPTUPLE_DELETE_IN_PROGRESS;
884905
else if (TransactionIdDidCommit(HeapTupleHeaderGetXmax(tuple)))
885906
tuple->t_infomask |= HEAP_XMAX_COMMITTED;
886-
else if (TransactionIdDidAbort(HeapTupleHeaderGetXmax(tuple)))
887-
{
888-
tuple->t_infomask |= HEAP_XMAX_INVALID;
889-
return HEAPTUPLE_LIVE;
890-
}
891907
else
892908
{
893909
/*
894-
* Not in Progress, Not Committed, Not Aborted - so it's from
895-
* crashed process. - vadim 06/02/97
910+
* Not in Progress, Not Committed, so either Aborted or crashed
896911
*/
897912
tuple->t_infomask |= HEAP_XMAX_INVALID;
898913
return HEAPTUPLE_LIVE;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy