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

Commit9cc8c84

Browse files
committed
Improve logging in VACUUM FULL VERBOSE and CLUSTER VERBOSE.
This patch resurrects some of the information that could be logged by theold, now-dead implementation of VACUUM FULL, in particular counts of liveand dead tuples and the time taken for the table rebuild proper. There'sstill no logging about the ensuing index rebuilds, though.Itagaki Takahiro
1 parent26a7b48 commit9cc8c84

File tree

3 files changed

+65
-24
lines changed

3 files changed

+65
-24
lines changed

‎src/backend/access/heap/rewriteheap.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -254,8 +254,6 @@ end_heap_rewrite(RewriteState state)
254254
/*
255255
* Write any remaining tuples in the UnresolvedTups table. If we have any
256256
* left, they should in fact be dead, but let's err on the safe side.
257-
*
258-
* XXX this really is a waste of code no?
259257
*/
260258
hash_seq_init(&seq_status,state->rs_unresolved_tups);
261259

@@ -502,8 +500,12 @@ rewrite_heap_tuple(RewriteState state,
502500
* Register a dead tuple with an ongoing rewrite. Dead tuples are not
503501
* copied to the new table, but we still make note of them so that we
504502
* can release some resources earlier.
503+
*
504+
* Returns true if a tuple was removed from the unresolved_tups table.
505+
* This indicates that that tuple, previously thought to be "recently dead",
506+
* is now known really dead and won't be written to the output.
505507
*/
506-
void
508+
bool
507509
rewrite_heap_dead_tuple(RewriteStatestate,HeapTupleold_tuple)
508510
{
509511
/*
@@ -539,7 +541,10 @@ rewrite_heap_dead_tuple(RewriteState state, HeapTuple old_tuple)
539541
hash_search(state->rs_unresolved_tups,&hashkey,
540542
HASH_REMOVE,&found);
541543
Assert(found);
544+
return true;
542545
}
546+
547+
return false;
543548
}
544549

545550
/*

‎src/backend/commands/cluster.c

Lines changed: 56 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
#include"utils/inval.h"
4646
#include"utils/lsyscache.h"
4747
#include"utils/memutils.h"
48+
#include"utils/pg_rusage.h"
4849
#include"utils/relcache.h"
4950
#include"utils/relmapper.h"
5051
#include"utils/snapmgr.h"
@@ -66,9 +67,9 @@ typedef struct
6667

6768

6869
staticvoidrebuild_relation(RelationOldHeap,OidindexOid,
69-
intfreeze_min_age,intfreeze_table_age);
70+
intfreeze_min_age,intfreeze_table_age,boolverbose);
7071
staticvoidcopy_heap_data(OidOIDNewHeap,OidOIDOldHeap,OidOIDOldIndex,
71-
intfreeze_min_age,intfreeze_table_age,
72+
intfreeze_min_age,intfreeze_table_age,boolverbose,
7273
bool*pSwapToastByContent,TransactionId*pFreezeXid);
7374
staticList*get_tables_to_cluster(MemoryContextcluster_context);
7475
staticvoidreform_and_rewrite_tuple(HeapTupletuple,
@@ -383,20 +384,9 @@ cluster_rel(Oid tableOid, Oid indexOid, bool recheck, bool verbose,
383384
if (OidIsValid(indexOid))
384385
check_index_is_clusterable(OldHeap,indexOid,recheck,AccessExclusiveLock);
385386

386-
/* Log what we're doing (this could use more effort) */
387-
if (OidIsValid(indexOid))
388-
ereport(verbose ?INFO :DEBUG2,
389-
(errmsg("clustering \"%s.%s\"",
390-
get_namespace_name(RelationGetNamespace(OldHeap)),
391-
RelationGetRelationName(OldHeap))));
392-
else
393-
ereport(verbose ?INFO :DEBUG2,
394-
(errmsg("vacuuming \"%s.%s\"",
395-
get_namespace_name(RelationGetNamespace(OldHeap)),
396-
RelationGetRelationName(OldHeap))));
397-
398387
/* rebuild_relation does all the dirty work */
399-
rebuild_relation(OldHeap,indexOid,freeze_min_age,freeze_table_age);
388+
rebuild_relation(OldHeap,indexOid,freeze_min_age,freeze_table_age,
389+
verbose);
400390

401391
/* NB: rebuild_relation does heap_close() on OldHeap */
402392
}
@@ -580,7 +570,7 @@ mark_index_clustered(Relation rel, Oid indexOid)
580570
*/
581571
staticvoid
582572
rebuild_relation(RelationOldHeap,OidindexOid,
583-
intfreeze_min_age,intfreeze_table_age)
573+
intfreeze_min_age,intfreeze_table_age,boolverbose)
584574
{
585575
OidtableOid=RelationGetRelid(OldHeap);
586576
OidtableSpace=OldHeap->rd_rel->reltablespace;
@@ -604,7 +594,7 @@ rebuild_relation(Relation OldHeap, Oid indexOid,
604594

605595
/* Copy the heap data into the new table in the desired order */
606596
copy_heap_data(OIDNewHeap,tableOid,indexOid,
607-
freeze_min_age,freeze_table_age,
597+
freeze_min_age,freeze_table_age,verbose,
608598
&swap_toast_by_content,&frozenXid);
609599

610600
/*
@@ -746,7 +736,7 @@ make_new_heap(Oid OIDOldHeap, Oid NewTableSpace)
746736
*/
747737
staticvoid
748738
copy_heap_data(OidOIDNewHeap,OidOIDOldHeap,OidOIDOldIndex,
749-
intfreeze_min_age,intfreeze_table_age,
739+
intfreeze_min_age,intfreeze_table_age,boolverbose,
750740
bool*pSwapToastByContent,TransactionId*pFreezeXid)
751741
{
752742
RelationNewHeap,
@@ -766,6 +756,13 @@ copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex,
766756
RewriteStaterwstate;
767757
booluse_sort;
768758
Tuplesortstate*tuplesort;
759+
doublenum_tuples=0,
760+
tups_vacuumed=0,
761+
tups_recently_dead=0;
762+
intelevel=verbose ?INFO :DEBUG2;
763+
PGRUsageru0;
764+
765+
pg_rusage_init(&ru0);
769766

770767
/*
771768
* Open the relations we need.
@@ -887,6 +884,24 @@ copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex,
887884
indexScan=NULL;
888885
}
889886

887+
/* Log what we're doing */
888+
if (indexScan!=NULL)
889+
ereport(elevel,
890+
(errmsg("clustering \"%s.%s\" using index scan on \"%s\"",
891+
get_namespace_name(RelationGetNamespace(OldHeap)),
892+
RelationGetRelationName(OldHeap),
893+
RelationGetRelationName(OldIndex))));
894+
elseif (tuplesort!=NULL)
895+
ereport(elevel,
896+
(errmsg("clustering \"%s.%s\" using sequential scan and sort",
897+
get_namespace_name(RelationGetNamespace(OldHeap)),
898+
RelationGetRelationName(OldHeap))));
899+
else
900+
ereport(elevel,
901+
(errmsg("vacuuming \"%s.%s\"",
902+
get_namespace_name(RelationGetNamespace(OldHeap)),
903+
RelationGetRelationName(OldHeap))));
904+
890905
/*
891906
* Scan through the OldHeap, either in OldIndex order or sequentially;
892907
* copy each tuple into the NewHeap, or transiently to the tuplesort
@@ -930,8 +945,10 @@ copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex,
930945
/* Definitely dead */
931946
isdead= true;
932947
break;
933-
caseHEAPTUPLE_LIVE:
934948
caseHEAPTUPLE_RECENTLY_DEAD:
949+
tups_recently_dead+=1;
950+
/* fall through */
951+
caseHEAPTUPLE_LIVE:
935952
/* Live or recently dead, must copy it */
936953
isdead= false;
937954
break;
@@ -963,6 +980,7 @@ copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex,
963980
elog(WARNING,"concurrent delete in progress within table \"%s\"",
964981
RelationGetRelationName(OldHeap));
965982
/* treat as recently dead */
983+
tups_recently_dead+=1;
966984
isdead= false;
967985
break;
968986
default:
@@ -975,11 +993,18 @@ copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex,
975993

976994
if (isdead)
977995
{
996+
tups_vacuumed+=1;
978997
/* heap rewrite module still needs to see it... */
979-
rewrite_heap_dead_tuple(rwstate,tuple);
998+
if (rewrite_heap_dead_tuple(rwstate,tuple))
999+
{
1000+
/* A previous recently-dead tuple is now known dead */
1001+
tups_vacuumed+=1;
1002+
tups_recently_dead-=1;
1003+
}
9801004
continue;
9811005
}
9821006

1007+
num_tuples+=1;
9831008
if (tuplesort!=NULL)
9841009
tuplesort_putheaptuple(tuplesort,tuple);
9851010
else
@@ -1031,6 +1056,17 @@ copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex,
10311056
/* Reset rd_toastoid just to be tidy --- it shouldn't be looked at again */
10321057
NewHeap->rd_toastoid=InvalidOid;
10331058

1059+
/* Log what we did */
1060+
ereport(elevel,
1061+
(errmsg("\"%s\": found %.0f removable, %.0f nonremovable row versions in %u pages",
1062+
RelationGetRelationName(OldHeap),
1063+
tups_vacuumed,num_tuples,
1064+
RelationGetNumberOfBlocks(OldHeap)),
1065+
errdetail("%.0f dead row versions cannot be removed yet.\n"
1066+
"%s.",
1067+
tups_recently_dead,
1068+
pg_rusage_show(&ru0))));
1069+
10341070
/* Clean up */
10351071
pfree(values);
10361072
pfree(isnull);

‎src/include/access/rewriteheap.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,6 @@ extern RewriteState begin_heap_rewrite(Relation NewHeap,
2525
externvoidend_heap_rewrite(RewriteStatestate);
2626
externvoidrewrite_heap_tuple(RewriteStatestate,HeapTupleoldTuple,
2727
HeapTuplenewTuple);
28-
externvoidrewrite_heap_dead_tuple(RewriteStatestate,HeapTupleoldTuple);
28+
externboolrewrite_heap_dead_tuple(RewriteStatestate,HeapTupleoldTuple);
2929

3030
#endif/* REWRITE_HEAP_H */

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp