Enhancing pgbench parameter checking - Mailing list pgsql-hackers

From Tatsuo Ishii
Subject Enhancing pgbench parameter checking
Date
Msg-id 20140806.184901.2099813628929345278.t-ishii@sraoss.co.jp
Whole thread Raw
Responses Re: Enhancing pgbench parameter checking
List pgsql-hackers
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
ratelimit: %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
supportedon 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);    }

pgsql-hackers by date:

Previous
From:
Date:
Subject: Re: pg_receivexlog add synchronous mode
Next
From: Amit Kapila
Date:
Subject: Re: Scaling shared buffer eviction