Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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)