Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commite77054e

Browse files
committed
This patch fixes a regression caused by my recent changes to heap
tuple header. The fix is based on the thought that HEAP_MOVED_IN isnot needed any more as soon as HEAP_XMIN_COMMITTED has been set. Soin tqual.c and vacuum.c the HEAP_MOVED bits are cleared whenHEAP_XMIN_COMMITTED is set.Vacuum robustness is enhanced by rearranging ifs, so that we have achance to elog(ERROR, ...) before an assertion fails.A new regression test is included.Manfred Koizar
1 parentcdf4b9a commite77054e

File tree

4 files changed

+47
-16
lines changed

4 files changed

+47
-16
lines changed

‎src/backend/commands/vacuum.c

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
*
1414
*
1515
* IDENTIFICATION
16-
* $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.230 2002/06/2020:29:27 momjian Exp $
16+
* $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.231 2002/07/2004:57:13 momjian Exp $
1717
*
1818
*-------------------------------------------------------------------------
1919
*/
@@ -1533,8 +1533,6 @@ repair_frag(VRelStats *vacrelstats, Relation onerel,
15331533

15341534
if (!(tuple.t_data->t_infomask&HEAP_XMIN_COMMITTED))
15351535
{
1536-
if (HeapTupleHeaderGetXvac(tuple.t_data)!=myXID)
1537-
elog(ERROR,"Invalid XVAC in tuple header");
15381536
if (tuple.t_data->t_infomask&HEAP_MOVED_IN)
15391537
elog(ERROR,"HEAP_MOVED_IN was not expected");
15401538

@@ -1545,6 +1543,8 @@ repair_frag(VRelStats *vacrelstats, Relation onerel,
15451543
*/
15461544
if (tuple.t_data->t_infomask&HEAP_MOVED_OFF)
15471545
{
1546+
if (HeapTupleHeaderGetXvac(tuple.t_data)!=myXID)
1547+
elog(ERROR,"Invalid XVAC in tuple header");
15481548
if (keep_tuples==0)
15491549
continue;
15501550
if (chain_tuple_moved)/* some chains was moved
@@ -2008,7 +2008,7 @@ repair_frag(VRelStats *vacrelstats, Relation onerel,
20082008

20092009
/*
20102010
* Mark new tuple as moved_in by vacuum and store vacuum XID
2011-
* int_cmin !!!
2011+
* int_cid !!!
20122012
*/
20132013
newtup.t_data->t_infomask &=
20142014
~(HEAP_XMIN_COMMITTED |HEAP_XMIN_INVALID |HEAP_MOVED_OFF);
@@ -2034,7 +2034,7 @@ repair_frag(VRelStats *vacrelstats, Relation onerel,
20342034

20352035
/*
20362036
* Mark old tuple as moved_off by vacuum and store vacuum XID
2037-
* int_cmin !!!
2037+
* int_cid !!!
20382038
*/
20392039
tuple.t_data->t_infomask &=
20402040
~(HEAP_XMIN_COMMITTED |HEAP_XMIN_INVALID |HEAP_MOVED_IN);
@@ -2087,12 +2087,12 @@ repair_frag(VRelStats *vacrelstats, Relation onerel,
20872087
tuple.t_data= (HeapTupleHeader)PageGetItem(page,itemid);
20882088
if (tuple.t_data->t_infomask&HEAP_XMIN_COMMITTED)
20892089
continue;
2090-
if (HeapTupleHeaderGetXvac(tuple.t_data)!=myXID)
2091-
elog(ERROR,"Invalid XVAC in tuple header (4)");
20922090
if (tuple.t_data->t_infomask&HEAP_MOVED_IN)
20932091
elog(ERROR,"HEAP_MOVED_IN was not expected (2)");
20942092
if (tuple.t_data->t_infomask&HEAP_MOVED_OFF)
20952093
{
2094+
if (HeapTupleHeaderGetXvac(tuple.t_data)!=myXID)
2095+
elog(ERROR,"Invalid XVAC in tuple header (4)");
20962096
/* some chains was moved while */
20972097
if (chain_tuple_moved)
20982098
{/* cleaning this page */
@@ -2116,6 +2116,8 @@ repair_frag(VRelStats *vacrelstats, Relation onerel,
21162116
keep_tuples--;
21172117
}
21182118
}
2119+
else
2120+
elog(ERROR,"HEAP_MOVED_OFF was expected (2)");
21192121
}
21202122
}
21212123

@@ -2225,17 +2227,18 @@ repair_frag(VRelStats *vacrelstats, Relation onerel,
22252227
tuple.t_data= (HeapTupleHeader)PageGetItem(page,itemid);
22262228
if (!(tuple.t_data->t_infomask&HEAP_XMIN_COMMITTED))
22272229
{
2230+
if (!(tuple.t_data->t_infomask&HEAP_MOVED))
2231+
elog(ERROR,"HEAP_MOVED_OFF/HEAP_MOVED_IN was expected");
22282232
if (HeapTupleHeaderGetXvac(tuple.t_data)!=myXID)
22292233
elog(ERROR,"Invalid XVAC in tuple header (2)");
22302234
if (tuple.t_data->t_infomask&HEAP_MOVED_IN)
22312235
{
22322236
tuple.t_data->t_infomask |=HEAP_XMIN_COMMITTED;
2237+
tuple.t_data->t_infomask &= ~HEAP_MOVED;
22332238
num_tuples++;
22342239
}
2235-
elseif (tuple.t_data->t_infomask&HEAP_MOVED_OFF)
2236-
tuple.t_data->t_infomask |=HEAP_XMIN_INVALID;
22372240
else
2238-
elog(ERROR,"HEAP_MOVED_OFF/HEAP_MOVED_IN was expected");
2241+
tuple.t_data->t_infomask |=HEAP_XMIN_INVALID;
22392242
}
22402243
}
22412244
LockBuffer(buf,BUFFER_LOCK_UNLOCK);
@@ -2304,15 +2307,15 @@ repair_frag(VRelStats *vacrelstats, Relation onerel,
23042307

23052308
if (!(tuple.t_data->t_infomask&HEAP_XMIN_COMMITTED))
23062309
{
2307-
if (HeapTupleHeaderGetXvac(tuple.t_data)!=myXID)
2308-
elog(ERROR,"Invalid XVAC in tuple header (3)");
23092310
if (tuple.t_data->t_infomask&HEAP_MOVED_OFF)
23102311
{
2312+
if (HeapTupleHeaderGetXvac(tuple.t_data)!=myXID)
2313+
elog(ERROR,"Invalid XVAC in tuple header (3)");
23112314
itemid->lp_flags &= ~LP_USED;
23122315
num_tuples++;
23132316
}
23142317
else
2315-
elog(ERROR,"HEAP_MOVED_OFF was expected (2)");
2318+
elog(ERROR,"HEAP_MOVED_OFF was expected (3)");
23162319
}
23172320

23182321
}

‎src/backend/utils/time/tqual.c

Lines changed: 28 additions & 1 deletion
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.56 2002/06/2020:29:41 momjian Exp $
19+
* $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.57 2002/07/2004:57:13 momjian Exp $
2020
*
2121
*-------------------------------------------------------------------------
2222
*/
@@ -92,7 +92,10 @@ HeapTupleSatisfiesItself(HeapTupleHeader tuple)
9292
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple)))
9393
return false;
9494
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple)))
95+
{
9596
tuple->t_infomask |=HEAP_XMIN_COMMITTED;
97+
tuple->t_infomask &= ~HEAP_MOVED;
98+
}
9699
else
97100
{
98101
tuple->t_infomask |=HEAP_XMIN_INVALID;
@@ -219,6 +222,7 @@ HeapTupleSatisfiesNow(HeapTupleHeader tuple)
219222
return false;
220223
}
221224
tuple->t_infomask |=HEAP_XMIN_COMMITTED;
225+
tuple->t_infomask &= ~HEAP_MOVED;
222226
}
223227
}
224228
elseif (tuple->t_infomask&HEAP_MOVED_IN)
@@ -228,7 +232,10 @@ HeapTupleSatisfiesNow(HeapTupleHeader tuple)
228232
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple)))
229233
return false;
230234
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple)))
235+
{
231236
tuple->t_infomask |=HEAP_XMIN_COMMITTED;
237+
tuple->t_infomask &= ~HEAP_MOVED;
238+
}
232239
else
233240
{
234241
tuple->t_infomask |=HEAP_XMIN_INVALID;
@@ -336,6 +343,7 @@ HeapTupleSatisfiesToast(HeapTupleHeader tuple)
336343
return false;
337344
}
338345
tuple->t_infomask |=HEAP_XMIN_COMMITTED;
346+
tuple->t_infomask &= ~HEAP_MOVED;
339347
}
340348
}
341349
elseif (tuple->t_infomask&HEAP_MOVED_IN)
@@ -345,7 +353,10 @@ HeapTupleSatisfiesToast(HeapTupleHeader tuple)
345353
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple)))
346354
return false;
347355
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple)))
356+
{
348357
tuple->t_infomask |=HEAP_XMIN_COMMITTED;
358+
tuple->t_infomask &= ~HEAP_MOVED;
359+
}
349360
else
350361
{
351362
tuple->t_infomask |=HEAP_XMIN_INVALID;
@@ -389,6 +400,7 @@ HeapTupleSatisfiesUpdate(HeapTuple htuple, CommandId curcid)
389400
returnHeapTupleInvisible;
390401
}
391402
tuple->t_infomask |=HEAP_XMIN_COMMITTED;
403+
tuple->t_infomask &= ~HEAP_MOVED;
392404
}
393405
}
394406
elseif (tuple->t_infomask&HEAP_MOVED_IN)
@@ -398,7 +410,10 @@ HeapTupleSatisfiesUpdate(HeapTuple htuple, CommandId curcid)
398410
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple)))
399411
returnHeapTupleInvisible;
400412
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple)))
413+
{
401414
tuple->t_infomask |=HEAP_XMIN_COMMITTED;
415+
tuple->t_infomask &= ~HEAP_MOVED;
416+
}
402417
else
403418
{
404419
tuple->t_infomask |=HEAP_XMIN_INVALID;
@@ -520,6 +535,7 @@ HeapTupleSatisfiesDirty(HeapTupleHeader tuple)
520535
return false;
521536
}
522537
tuple->t_infomask |=HEAP_XMIN_COMMITTED;
538+
tuple->t_infomask &= ~HEAP_MOVED;
523539
}
524540
}
525541
elseif (tuple->t_infomask&HEAP_MOVED_IN)
@@ -529,7 +545,10 @@ HeapTupleSatisfiesDirty(HeapTupleHeader tuple)
529545
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple)))
530546
return false;
531547
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple)))
548+
{
532549
tuple->t_infomask |=HEAP_XMIN_COMMITTED;
550+
tuple->t_infomask &= ~HEAP_MOVED;
551+
}
533552
else
534553
{
535554
tuple->t_infomask |=HEAP_XMIN_INVALID;
@@ -651,6 +670,7 @@ HeapTupleSatisfiesSnapshot(HeapTupleHeader tuple, Snapshot snapshot)
651670
return false;
652671
}
653672
tuple->t_infomask |=HEAP_XMIN_COMMITTED;
673+
tuple->t_infomask &= ~HEAP_MOVED;
654674
}
655675
}
656676
elseif (tuple->t_infomask&HEAP_MOVED_IN)
@@ -660,7 +680,10 @@ HeapTupleSatisfiesSnapshot(HeapTupleHeader tuple, Snapshot snapshot)
660680
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple)))
661681
return false;
662682
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple)))
683+
{
663684
tuple->t_infomask |=HEAP_XMIN_COMMITTED;
685+
tuple->t_infomask &= ~HEAP_MOVED;
686+
}
664687
else
665688
{
666689
tuple->t_infomask |=HEAP_XMIN_INVALID;
@@ -809,6 +832,7 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
809832
returnHEAPTUPLE_DEAD;
810833
}
811834
tuple->t_infomask |=HEAP_XMIN_COMMITTED;
835+
tuple->t_infomask &= ~HEAP_MOVED;
812836
}
813837
elseif (tuple->t_infomask&HEAP_MOVED_IN)
814838
{
@@ -817,7 +841,10 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
817841
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple)))
818842
returnHEAPTUPLE_INSERT_IN_PROGRESS;
819843
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple)))
844+
{
820845
tuple->t_infomask |=HEAP_XMIN_COMMITTED;
846+
tuple->t_infomask &= ~HEAP_MOVED;
847+
}
821848
else
822849
{
823850
tuple->t_infomask |=HEAP_XMIN_INVALID;

‎src/test/regress/parallel_schedule

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ test: copy
3838
# ----------
3939
# The third group of parallel test
4040
# ----------
41-
test: constraints triggers create_misc create_aggregate create_operator create_index inherit
41+
test: constraints triggers create_misc create_aggregate create_operator create_index inherit vacuum
4242

4343
# Depends on the above
4444
test: create_view

‎src/test/regress/serial_schedule

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# $Header: /cvsroot/pgsql/src/test/regress/serial_schedule,v 1.11 2002/07/18 04:43:51 momjian Exp $
1+
# $Header: /cvsroot/pgsql/src/test/regress/serial_schedule,v 1.12 2002/07/20 04:57:13 momjian Exp $
22
# This should probably be in an order similar to parallel_schedule.
33
test: boolean
44
test: char
@@ -50,6 +50,7 @@ test: create_aggregate
5050
test: create_operator
5151
test: create_index
5252
test: inherit
53+
test: vacuum
5354
test: create_view
5455
test: sanity_check
5556
test: errors

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp