Add new "-q" logging option (quiet mode) while in initialize mode

(-i), producing only one progress message per 5 seconds along with
elapsed time and estimated remaining time.  Also add elapsed time and
estimated remaining time to the default logging(prints one message
each 100000 rows).
Patch contributed by Tomas Vondra, reviewed by Jeevan Chalke and
Tatsuo Ishii.
This commit is contained in:
Tatsuo Ishii 2013-01-07 11:13:44 +09:00
parent 5aec9ccafe
commit cf03ff6c4e
2 changed files with 69 additions and 5 deletions

View File

@ -39,6 +39,7 @@
#include "portability/instr_time.h"
#include <ctype.h>
#include <math.h>
#ifndef WIN32
#include <sys/time.h>
@ -102,6 +103,7 @@ extern int optind;
#define MAXCLIENTS 1024
#endif
#define LOG_STEP_SECONDS 5 /* seconds between log messages */
#define DEFAULT_NXACTS 10 /* default nxacts */
int nxacts = 0; /* number of transactions per client */
@ -150,6 +152,7 @@ char *index_tablespace = NULL;
#define naccounts 100000
bool use_log; /* log transaction latencies to a file */
bool use_quiet; /* quiet logging onto stderr */
bool is_connect; /* establish connection for each transaction */
bool is_latencies; /* report per-command latencies */
int main_pid; /* main process id used in log filename */
@ -359,6 +362,7 @@ usage(void)
" -n do not run VACUUM after initialization\n"
" -F NUM fill factor\n"
" -s NUM scaling factor\n"
" -q quiet logging (one message each 5 seconds)\n"
" --foreign-keys\n"
" create foreign key constraints between tables\n"
" --index-tablespace=TABLESPACE\n"
@ -1362,6 +1366,11 @@ init(bool is_no_vacuum)
char sql[256];
int i;
/* used to track elapsed time and estimate of the remaining time */
instr_time start, diff;
double elapsed_sec, remaining_sec;
int log_interval = 1;
if ((con = doConnect()) == NULL)
exit(1);
@ -1430,6 +1439,8 @@ init(bool is_no_vacuum)
}
PQclear(res);
INSTR_TIME_SET_CURRENT(start);
for (i = 0; i < naccounts * scale; i++)
{
int j = i + 1;
@ -1441,10 +1452,42 @@ init(bool is_no_vacuum)
exit(1);
}
if (j % 100000 == 0)
fprintf(stderr, "%d of %d tuples (%d%%) done.\n",
j, naccounts * scale,
(int) (((int64) j * 100) / (naccounts * scale)));
/* If we want to stick with the original logging, print a message each
* 100k inserted rows. */
if ((! use_quiet) && (j % 100000 == 0))
{
INSTR_TIME_SET_CURRENT(diff);
INSTR_TIME_SUBTRACT(diff, start);
elapsed_sec = INSTR_TIME_GET_DOUBLE(diff);
remaining_sec = (scale * naccounts - j) * elapsed_sec / j;
fprintf(stderr, "%d of %d tuples (%d%%) done (elapsed %.2f s, remaining %.2f s).\n",
j, naccounts * scale,
(int) (((int64) j * 100) / (naccounts * scale)),
elapsed_sec, remaining_sec);
}
/* let's not call the timing for each row, but only each 100 rows */
else if (use_quiet && (j % 100 == 0))
{
INSTR_TIME_SET_CURRENT(diff);
INSTR_TIME_SUBTRACT(diff, start);
elapsed_sec = INSTR_TIME_GET_DOUBLE(diff);
remaining_sec = (scale * naccounts - j) * elapsed_sec / j;
/* have we reached the next interval (or end)? */
if ((j == scale * naccounts) || (elapsed_sec >= log_interval * LOG_STEP_SECONDS)) {
fprintf(stderr, "%d of %d tuples (%d%%) done (elapsed %.2f s, remaining %.2f s).\n",
j, naccounts * scale,
(int) (((int64) j * 100) / (naccounts * scale)), elapsed_sec, remaining_sec);
/* skip to the next interval */
log_interval = (int)ceil(elapsed_sec/LOG_STEP_SECONDS);
}
}
}
if (PQputline(con, "\\.\n"))
{
@ -1987,7 +2030,7 @@ main(int argc, char **argv)
state = (CState *) pg_malloc(sizeof(CState));
memset(state, 0, sizeof(CState));
while ((c = getopt_long(argc, argv, "ih:nvp:dSNc:j:Crs:t:T:U:lf:D:F:M:", long_options, &optindex)) != -1)
while ((c = getopt_long(argc, argv, "ih:nvp:dqSNc:j:Crs:t:T:U:lf:D:F:M:", long_options, &optindex)) != -1)
{
switch (c)
{
@ -2095,6 +2138,9 @@ main(int argc, char **argv)
case 'l':
use_log = true;
break;
case 'q':
use_quiet = true;
break;
case 'f':
ttype = 3;
filename = pg_strdup(optarg);
@ -2198,6 +2244,13 @@ main(int argc, char **argv)
exit(1);
}
/* -q may be used only with -i */
if (use_quiet && !is_init_mode)
{
fprintf(stderr, "quiet-logging is allowed only in initialization mode (-i)\n");
exit(1);
}
/*
* is_latencies only works with multiple threads in thread-based
* implementations, not fork-based ones, because it supposes that the

View File

@ -189,6 +189,17 @@ pgbench <optional> <replaceable>options</> </optional> <replaceable>dbname</>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-q</option></term>
<listitem>
<para>
Switch logging to quiet mode, producing only one progress message per 5
seconds. The default logging prints one message each 100000 rows, which
often outputs many lines per second (especially on good hardware).
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--foreign-keys</option></term>
<listitem>