From 12992ab37a05dbcbff5e0629a037f86f5dbb2964 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
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 9813183cb95..4f9eb192123 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 88ff2d4da46..8a109237efc 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 afa3216558a..5153366b281 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 00000000000..a4a6d9e586d
--- /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 <unistd.h>
+
+#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 71ec0580229..db954fff2d3 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 <sys/time.h>
-
-#ifdef HAVE_GETRUSAGE
-#include <sys/resource.h>
-#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 00000000000..2ee33f752c9
--- /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 <sys/time.h>
+
+#ifdef HAVE_GETRUSAGE
+#include <sys/resource.h>
+#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 */
-- 
GitLab