From 12992ab37a05dbcbff5e0629a037f86f5dbb2964 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 3 Oct 2005 22:52:26 +0000 Subject: [PATCH] Separate out the VacRUsage stuff as an independent module, in preparation for using it for other things besides VACUUM. --- src/backend/commands/vacuum.c | 89 ++++++------------------------ src/backend/commands/vacuumlazy.c | 43 ++++++++------- src/backend/utils/misc/Makefile | 4 +- src/backend/utils/misc/pg_rusage.c | 75 +++++++++++++++++++++++++ src/include/commands/vacuum.h | 19 +------ src/include/utils/pg_rusage.h | 37 +++++++++++++ 6 files changed, 155 insertions(+), 112 deletions(-) create mode 100644 src/backend/utils/misc/pg_rusage.c create mode 100644 src/include/utils/pg_rusage.h diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 9813183cb9..4f9eb19212 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -13,7 +13,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.315 2005/09/22 17:32:58 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.316 2005/10/03 22:52:21 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -46,6 +46,7 @@ #include "utils/inval.h" #include "utils/lsyscache.h" #include "utils/memutils.h" +#include "utils/pg_rusage.h" #include "utils/relcache.h" #include "utils/syscache.h" #include "pgstat.h" @@ -1233,9 +1234,9 @@ scan_heap(VRelStats *vacrelstats, Relation onerel, VTupleLink vtlinks = (VTupleLink) palloc(100 * sizeof(VTupleLinkData)); int num_vtlinks = 0; int free_vtlinks = 100; - VacRUsage ru0; + PGRUsage ru0; - vac_init_rusage(&ru0); + pg_rusage_init(&ru0); relname = RelationGetRelationName(onerel); ereport(elevel, @@ -1592,14 +1593,14 @@ scan_heap(VRelStats *vacrelstats, Relation onerel, "Total free space (including removable row versions) is %.0f bytes.\n" "%u pages are or will become empty, including %u at the end of the table.\n" "%u pages containing %.0f free bytes are potential move destinations.\n" - "%s", + "%s.", nkeep, (unsigned long) min_tlen, (unsigned long) max_tlen, nunused, free_space, empty_pages, empty_end_pages, fraged_pages->num_pages, usable_free_space, - vac_show_rusage(&ru0)))); + pg_rusage_show(&ru0)))); } @@ -1636,9 +1637,9 @@ repair_frag(VRelStats *vacrelstats, Relation onerel, num_fraged_pages, vacuumed_pages; int keep_tuples = 0; - VacRUsage ru0; + PGRUsage ru0; - vac_init_rusage(&ru0); + pg_rusage_init(&ru0); ExecContext_Init(&ec, onerel); @@ -2362,8 +2363,8 @@ repair_frag(VRelStats *vacrelstats, Relation onerel, (errmsg("\"%s\": moved %u row versions, truncated %u to %u pages", RelationGetRelationName(onerel), num_moved, nblocks, blkno), - errdetail("%s", - vac_show_rusage(&ru0)))); + errdetail("%s.", + pg_rusage_show(&ru0)))); /* * Reflect the motion of system tuples to catalog cache here. @@ -2950,9 +2951,9 @@ scan_index(Relation indrel, double num_tuples) { IndexBulkDeleteResult *stats; IndexVacuumCleanupInfo vcinfo; - VacRUsage ru0; + PGRUsage ru0; - vac_init_rusage(&ru0); + pg_rusage_init(&ru0); /* * Even though we're not planning to delete anything, we use the @@ -2982,9 +2983,9 @@ scan_index(Relation indrel, double num_tuples) stats->num_index_tuples, stats->num_pages), errdetail("%u index pages have been deleted, %u are currently reusable.\n" - "%s", + "%s.", stats->pages_deleted, stats->pages_free, - vac_show_rusage(&ru0)))); + pg_rusage_show(&ru0)))); /* * Check for tuple count mismatch. If the index is partial, then it's @@ -3022,9 +3023,9 @@ vacuum_index(VacPageList vacpagelist, Relation indrel, { IndexBulkDeleteResult *stats; IndexVacuumCleanupInfo vcinfo; - VacRUsage ru0; + PGRUsage ru0; - vac_init_rusage(&ru0); + pg_rusage_init(&ru0); /* Do bulk deletion */ stats = index_bulk_delete(indrel, tid_reaped, (void *) vacpagelist); @@ -3050,10 +3051,10 @@ vacuum_index(VacPageList vacpagelist, Relation indrel, stats->num_pages), errdetail("%.0f index row versions were removed.\n" "%u index pages have been deleted, %u are currently reusable.\n" - "%s", + "%s.", stats->tuples_removed, stats->pages_deleted, stats->pages_free, - vac_show_rusage(&ru0)))); + pg_rusage_show(&ru0)))); /* * Check for tuple count mismatch. If the index is partial, then it's @@ -3429,60 +3430,6 @@ enough_space(VacPage vacpage, Size len) } -/* - * Initialize usage snapshot. - */ -void -vac_init_rusage(VacRUsage *ru0) -{ - struct timezone tz; - - getrusage(RUSAGE_SELF, &ru0->ru); - gettimeofday(&ru0->tv, &tz); -} - -/* - * Compute elapsed time since ru0 usage snapshot, and format into - * a displayable string. Result is in a static string, which is - * tacky, but no one ever claimed that the Postgres backend is - * threadable... - */ -const char * -vac_show_rusage(VacRUsage *ru0) -{ - static char result[100]; - VacRUsage ru1; - - vac_init_rusage(&ru1); - - if (ru1.tv.tv_usec < ru0->tv.tv_usec) - { - ru1.tv.tv_sec--; - ru1.tv.tv_usec += 1000000; - } - if (ru1.ru.ru_stime.tv_usec < ru0->ru.ru_stime.tv_usec) - { - ru1.ru.ru_stime.tv_sec--; - ru1.ru.ru_stime.tv_usec += 1000000; - } - if (ru1.ru.ru_utime.tv_usec < ru0->ru.ru_utime.tv_usec) - { - ru1.ru.ru_utime.tv_sec--; - ru1.ru.ru_utime.tv_usec += 1000000; - } - - snprintf(result, sizeof(result), - "CPU %d.%02ds/%d.%02du sec elapsed %d.%02d sec.", - (int) (ru1.ru.ru_stime.tv_sec - ru0->ru.ru_stime.tv_sec), - (int) (ru1.ru.ru_stime.tv_usec - ru0->ru.ru_stime.tv_usec) / 10000, - (int) (ru1.ru.ru_utime.tv_sec - ru0->ru.ru_utime.tv_sec), - (int) (ru1.ru.ru_utime.tv_usec - ru0->ru.ru_utime.tv_usec) / 10000, - (int) (ru1.tv.tv_sec - ru0->tv.tv_sec), - (int) (ru1.tv.tv_usec - ru0->tv.tv_usec) / 10000); - - return result; -} - /* * vacuum_delay_point --- check for interrupts and cost-based delay. * diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c index 88ff2d4da4..8a109237ef 100644 --- a/src/backend/commands/vacuumlazy.c +++ b/src/backend/commands/vacuumlazy.c @@ -31,7 +31,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.59 2005/09/22 17:32:58 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.60 2005/10/03 22:52:22 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -48,6 +48,7 @@ #include "storage/freespace.h" #include "storage/smgr.h" #include "utils/lsyscache.h" +#include "utils/pg_rusage.h" /* @@ -209,9 +210,9 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats, BlockNumber *index_pages_removed; bool did_vacuum_index = false; int i; - VacRUsage ru0; + PGRUsage ru0; - vac_init_rusage(&ru0); + pg_rusage_init(&ru0); relname = RelationGetRelationName(onerel); ereport(elevel, @@ -478,11 +479,11 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats, errdetail("%.0f dead row versions cannot be removed yet.\n" "There were %.0f unused item pointers.\n" "%u pages are entirely empty.\n" - "%s", + "%s.", nkeep, nunused, empty_pages, - vac_show_rusage(&ru0)))); + pg_rusage_show(&ru0)))); } @@ -502,9 +503,9 @@ lazy_vacuum_heap(Relation onerel, LVRelStats *vacrelstats) { int tupindex; int npages; - VacRUsage ru0; + PGRUsage ru0; - vac_init_rusage(&ru0); + pg_rusage_init(&ru0); npages = 0; tupindex = 0; @@ -533,8 +534,8 @@ lazy_vacuum_heap(Relation onerel, LVRelStats *vacrelstats) (errmsg("\"%s\": removed %d row versions in %d pages", RelationGetRelationName(onerel), tupindex, npages), - errdetail("%s", - vac_show_rusage(&ru0)))); + errdetail("%s.", + pg_rusage_show(&ru0)))); } /* @@ -602,9 +603,9 @@ lazy_scan_index(Relation indrel, LVRelStats *vacrelstats) { IndexBulkDeleteResult *stats; IndexVacuumCleanupInfo vcinfo; - VacRUsage ru0; + PGRUsage ru0; - vac_init_rusage(&ru0); + pg_rusage_init(&ru0); /* * Acquire appropriate type of lock on index: must be exclusive if @@ -652,9 +653,9 @@ lazy_scan_index(Relation indrel, LVRelStats *vacrelstats) stats->num_index_tuples, stats->num_pages), errdetail("%u index pages have been deleted, %u are currently reusable.\n" - "%s", + "%s.", stats->pages_deleted, stats->pages_free, - vac_show_rusage(&ru0)))); + pg_rusage_show(&ru0)))); pfree(stats); } @@ -679,9 +680,9 @@ lazy_vacuum_index(Relation indrel, { IndexBulkDeleteResult *stats; IndexVacuumCleanupInfo vcinfo; - VacRUsage ru0; + PGRUsage ru0; - vac_init_rusage(&ru0); + pg_rusage_init(&ru0); /* * Acquire appropriate type of lock on index: must be exclusive if @@ -729,10 +730,10 @@ lazy_vacuum_index(Relation indrel, stats->num_pages), errdetail("%.0f index row versions were removed.\n" "%u index pages have been deleted, %u are currently reusable.\n" - "%s", + "%s.", stats->tuples_removed, stats->pages_deleted, stats->pages_free, - vac_show_rusage(&ru0)))); + pg_rusage_show(&ru0)))); pfree(stats); } @@ -749,9 +750,9 @@ lazy_truncate_heap(Relation onerel, LVRelStats *vacrelstats) int n; int i, j; - VacRUsage ru0; + PGRUsage ru0; - vac_init_rusage(&ru0); + pg_rusage_init(&ru0); /* * We need full exclusive lock on the relation in order to do @@ -828,8 +829,8 @@ lazy_truncate_heap(Relation onerel, LVRelStats *vacrelstats) (errmsg("\"%s\": truncated %u to %u pages", RelationGetRelationName(onerel), old_rel_pages, new_rel_pages), - errdetail("%s", - vac_show_rusage(&ru0)))); + errdetail("%s.", + pg_rusage_show(&ru0)))); } /* diff --git a/src/backend/utils/misc/Makefile b/src/backend/utils/misc/Makefile index afa3216558..5153366b28 100644 --- a/src/backend/utils/misc/Makefile +++ b/src/backend/utils/misc/Makefile @@ -4,7 +4,7 @@ # Makefile for utils/misc # # IDENTIFICATION -# $PostgreSQL: pgsql/src/backend/utils/misc/Makefile,v 1.23 2005/02/26 18:43:33 tgl Exp $ +# $PostgreSQL: pgsql/src/backend/utils/misc/Makefile,v 1.24 2005/10/03 22:52:23 tgl Exp $ # #------------------------------------------------------------------------- @@ -14,7 +14,7 @@ include $(top_builddir)/src/Makefile.global override CPPFLAGS := -I$(srcdir) $(CPPFLAGS) -OBJS = guc.o help_config.o ps_status.o superuser.o +OBJS = guc.o help_config.o pg_rusage.o ps_status.o superuser.o # This location might depend on the installation directories. Therefore # we can't subsitute it into pg_config.h. diff --git a/src/backend/utils/misc/pg_rusage.c b/src/backend/utils/misc/pg_rusage.c new file mode 100644 index 0000000000..a4a6d9e586 --- /dev/null +++ b/src/backend/utils/misc/pg_rusage.c @@ -0,0 +1,75 @@ +/*------------------------------------------------------------------------- + * + * pg_rusage.c + * Resource usage measurement support routines. + * + * + * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * $PostgreSQL: pgsql/src/backend/utils/misc/pg_rusage.c,v 1.1 2005/10/03 22:52:23 tgl Exp $ + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include + +#include "utils/pg_rusage.h" + + +/* + * Initialize usage snapshot. + */ +void +pg_rusage_init(PGRUsage *ru0) +{ + struct timezone tz; + + getrusage(RUSAGE_SELF, &ru0->ru); + gettimeofday(&ru0->tv, &tz); +} + +/* + * Compute elapsed time since ru0 usage snapshot, and format into + * a displayable string. Result is in a static string, which is + * tacky, but no one ever claimed that the Postgres backend is + * threadable... + */ +const char * +pg_rusage_show(const PGRUsage *ru0) +{ + static char result[100]; + PGRUsage ru1; + + pg_rusage_init(&ru1); + + if (ru1.tv.tv_usec < ru0->tv.tv_usec) + { + ru1.tv.tv_sec--; + ru1.tv.tv_usec += 1000000; + } + if (ru1.ru.ru_stime.tv_usec < ru0->ru.ru_stime.tv_usec) + { + ru1.ru.ru_stime.tv_sec--; + ru1.ru.ru_stime.tv_usec += 1000000; + } + if (ru1.ru.ru_utime.tv_usec < ru0->ru.ru_utime.tv_usec) + { + ru1.ru.ru_utime.tv_sec--; + ru1.ru.ru_utime.tv_usec += 1000000; + } + + snprintf(result, sizeof(result), + "CPU %d.%02ds/%d.%02du sec elapsed %d.%02d sec", + (int) (ru1.ru.ru_stime.tv_sec - ru0->ru.ru_stime.tv_sec), + (int) (ru1.ru.ru_stime.tv_usec - ru0->ru.ru_stime.tv_usec) / 10000, + (int) (ru1.ru.ru_utime.tv_sec - ru0->ru.ru_utime.tv_sec), + (int) (ru1.ru.ru_utime.tv_usec - ru0->ru.ru_utime.tv_usec) / 10000, + (int) (ru1.tv.tv_sec - ru0->tv.tv_sec), + (int) (ru1.tv.tv_usec - ru0->tv.tv_usec) / 10000); + + return result; +} diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index 71ec058022..db954fff2d 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -7,21 +7,13 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/commands/vacuum.h,v 1.60 2005/07/14 05:13:43 tgl Exp $ + * $PostgreSQL: pgsql/src/include/commands/vacuum.h,v 1.61 2005/10/03 22:52:24 tgl Exp $ * *------------------------------------------------------------------------- */ #ifndef VACUUM_H #define VACUUM_H -#include - -#ifdef HAVE_GETRUSAGE -#include -#else -#include "rusagestub.h" -#endif - #include "access/htup.h" #include "catalog/pg_attribute.h" #include "catalog/pg_statistic.h" @@ -113,13 +105,6 @@ typedef struct VacAttrStats } VacAttrStats; -/* State structure for vac_init_rusage/vac_show_rusage */ -typedef struct VacRUsage -{ - struct timeval tv; - struct rusage ru; -} VacRUsage; - /* Default statistics target (GUC parameter) */ extern DLLIMPORT int default_statistics_target; /* DLLIMPORT for PostGIS */ @@ -137,8 +122,6 @@ extern void vacuum_set_xid_limits(VacuumStmt *vacstmt, bool sharedRel, TransactionId *oldestXmin, TransactionId *freezeLimit); extern bool vac_is_partial_index(Relation indrel); -extern void vac_init_rusage(VacRUsage *ru0); -extern const char *vac_show_rusage(VacRUsage *ru0); extern void vacuum_delay_point(void); /* in commands/vacuumlazy.c */ diff --git a/src/include/utils/pg_rusage.h b/src/include/utils/pg_rusage.h new file mode 100644 index 0000000000..2ee33f752c --- /dev/null +++ b/src/include/utils/pg_rusage.h @@ -0,0 +1,37 @@ +/*------------------------------------------------------------------------- + * + * pg_rusage.h + * header file for resource usage measurement support routines + * + * + * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * $PostgreSQL: pgsql/src/include/utils/pg_rusage.h,v 1.1 2005/10/03 22:52:26 tgl Exp $ + * + *------------------------------------------------------------------------- + */ +#ifndef PG_RUSAGE_H +#define PG_RUSAGE_H + +#include + +#ifdef HAVE_GETRUSAGE +#include +#else +#include "rusagestub.h" +#endif + + +/* State structure for pg_rusage_init/pg_rusage_show */ +typedef struct PGRUsage +{ + struct timeval tv; + struct rusage ru; +} PGRUsage; + + +extern void pg_rusage_init(PGRUsage *ru0); +extern const char *pg_rusage_show(const PGRUsage *ru0); + +#endif /* PG_RUSAGE_H */ -- 2.40.0