Hi,

It is pretty annoying that pgbench does not check parameter which
should not be used with -i. I often type like:

pgbench -c 10 -T 300 -S -i test

and accidentally initialize pgbench database. This is pretty
uncomfortable if the database is huge since initializing huge database
takes long time. Why don't we check the case? Included is the patch to
enhance the behavior of pgbench in this regard IMO. Here is a sample
session after patching:

$ ./pgbench -c 10 -T 300 -S -i test
some parameters cannot be used in initialize mode

Best regards,
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese:http://www.sraoss.co.jp
diff --git a/contrib/pgbench/pgbench.c b/contrib/pgbench/pgbench.c
index c0e5e24..d7a3f57 100644
--- a/contrib/pgbench/pgbench.c
+++ b/contrib/pgbench/pgbench.c
@@ -2520,6 +2520,8 @@ main(int argc, char **argv)
 	char	   *filename = NULL;
 	bool		scale_given = false;
 
+	bool		is_non_init_param_set = false;
+
 	CState	   *state;			/* status of clients */
 	TState	   *threads;		/* array of thread */
 
@@ -2599,12 +2601,14 @@ main(int argc, char **argv)
 				break;
 			case 'S':
 				ttype = 1;
+				is_non_init_param_set = true;
 				break;
 			case 'N':
 				ttype = 2;
+				is_non_init_param_set = true;
 				break;
 			case 'c':
-				nclients = atoi(optarg);
+				is_non_init_param_set = true;
 				if (nclients <= 0 || nclients > MAXCLIENTS)
 				{
 					fprintf(stderr, "invalid number of clients: %d\n", nclients);
@@ -2629,6 +2633,7 @@ main(int argc, char **argv)
 #endif   /* HAVE_GETRLIMIT */
 				break;
 			case 'j':			/* jobs */
+				is_non_init_param_set = true;
 				nthreads = atoi(optarg);
 				if (nthreads <= 0)
 				{
@@ -2637,9 +2642,11 @@ main(int argc, char **argv)
 				}
 				break;
 			case 'C':
+				is_non_init_param_set = true;
 				is_connect = true;
 				break;
 			case 'r':
+				is_non_init_param_set = true;
 				is_latencies = true;
 				break;
 			case 's':
@@ -2652,6 +2659,7 @@ main(int argc, char **argv)
 				}
 				break;
 			case 't':
+				is_non_init_param_set = true;
 				if (duration > 0)
 				{
 					fprintf(stderr, "specify either a number of transactions (-t) or a duration (-T), not both.\n");
@@ -2665,6 +2673,7 @@ main(int argc, char **argv)
 				}
 				break;
 			case 'T':
+				is_non_init_param_set = true;
 				if (nxacts > 0)
 				{
 					fprintf(stderr, "specify either a number of transactions (-t) or a duration (-T), not both.\n");
@@ -2681,12 +2690,14 @@ main(int argc, char **argv)
 				login = pg_strdup(optarg);
 				break;
 			case 'l':
+				is_non_init_param_set = true;
 				use_log = true;
 				break;
 			case 'q':
 				use_quiet = true;
 				break;
 			case 'f':
+				is_non_init_param_set = true;
 				ttype = 3;
 				filename = pg_strdup(optarg);
 				if (process_file(filename) == false || *sql_files[num_files - 1] == NULL)
@@ -2696,6 +2707,8 @@ main(int argc, char **argv)
 				{
 					char	   *p;
 
+					is_non_init_param_set = true;
+
 					if ((p = strchr(optarg, '=')) == NULL || p == optarg || *(p + 1) == '\0')
 					{
 						fprintf(stderr, "invalid variable definition: %s\n", optarg);
@@ -2716,6 +2729,7 @@ main(int argc, char **argv)
 				}
 				break;
 			case 'M':
+				is_non_init_param_set = true;
 				if (num_files > 0)
 				{
 					fprintf(stderr, "query mode (-M) should be specifiled before transaction scripts (-f)\n");
@@ -2731,6 +2745,7 @@ main(int argc, char **argv)
 				}
 				break;
 			case 'P':
+				is_non_init_param_set = true;
 				progress = atoi(optarg);
 				if (progress <= 0)
 				{
@@ -2745,6 +2760,8 @@ main(int argc, char **argv)
 					/* get a double from the beginning of option value */
 					double		throttle_value = atof(optarg);
 
+					is_non_init_param_set = true;
+
 					if (throttle_value <= 0.0)
 					{
 						fprintf(stderr, "invalid rate limit: %s\n", optarg);
@@ -2764,6 +2781,7 @@ main(int argc, char **argv)
 				index_tablespace = pg_strdup(optarg);
 				break;
 			case 4:
+				is_non_init_param_set = true;
 				sample_rate = atof(optarg);
 				if (sample_rate <= 0.0 || sample_rate > 1.0)
 				{
@@ -2776,6 +2794,7 @@ main(int argc, char **argv)
 				fprintf(stderr, "--aggregate-interval is not currently supported on Windows");
 				exit(1);
 #else
+				is_non_init_param_set = true;
 				agg_interval = atoi(optarg);
 				if (agg_interval <= 0)
 				{
@@ -2808,6 +2827,12 @@ main(int argc, char **argv)
 
 	if (is_init_mode)
 	{
+		if (is_non_init_param_set)
+		{
+			fprintf(stderr, "some parameters cannot be used in initialize mode\n");
+			exit(1);
+		}
+
 		init(is_no_vacuum);
 		exit(0);
 	}
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to