Enhancing pgbench parameter checking

Поиск
Список
Период
Сортировка
От Tatsuo Ishii
Тема Enhancing pgbench parameter checking
Дата
Msg-id 20140806.184901.2099813628929345278.t-ishii@sraoss.co.jp
обсуждение исходный текст
Ответы Re: Enhancing pgbench parameter checking  (Fabien COELHO <coelho@cri.ensmp.fr>)
Список 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 по дате отправления:

Предыдущее
От:
Дата:
Сообщение: Re: pg_receivexlog add synchronous mode
Следующее
От: Amit Kapila
Дата:
Сообщение: Re: Scaling shared buffer eviction