mirror of
https://github.com/postgres/postgres.git
synced 2025-10-28 11:55:03 +03:00
Improve frontend error logging style.
Get rid of the separate "FATAL" log level, as it was applied so inconsistently as to be meaningless. This mostly involves s/pg_log_fatal/pg_log_error/g. Create a macro pg_fatal() to handle the common use-case of pg_log_error() immediately followed by exit(1). Various modules had already invented either this or equivalent macros; standardize on pg_fatal() and apply it where possible. Invent the ability to add "detail" and "hint" messages to a frontend message, much as we have long had in the backend. Except where rewording was needed to convert existing coding to detail/hint style, I have (mostly) resisted the temptation to change existing message wording. Patch by me. Design and patch reviewed at various stages by Robert Haas, Kyotaro Horiguchi, Peter Eisentraut and Daniel Gustafsson. Discussion: https://postgr.es/m/1363732.1636496441@sss.pgh.pa.us
This commit is contained in:
@@ -1502,8 +1502,7 @@ accumStats(StatsData *stats, bool skipped, double lat, double lag,
|
||||
break;
|
||||
default:
|
||||
/* internal error which should never occur */
|
||||
pg_log_fatal("unexpected error status: %d", estatus);
|
||||
exit(1);
|
||||
pg_fatal("unexpected error status: %d", estatus);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1516,8 +1515,8 @@ executeStatement(PGconn *con, const char *sql)
|
||||
res = PQexec(con, sql);
|
||||
if (PQresultStatus(res) != PGRES_COMMAND_OK)
|
||||
{
|
||||
pg_log_fatal("query failed: %s", PQerrorMessage(con));
|
||||
pg_log_info("query was: %s", sql);
|
||||
pg_log_error("query failed: %s", PQerrorMessage(con));
|
||||
pg_log_error_detail("Query was: %s", sql);
|
||||
exit(1);
|
||||
}
|
||||
PQclear(res);
|
||||
@@ -1533,7 +1532,7 @@ tryExecuteStatement(PGconn *con, const char *sql)
|
||||
if (PQresultStatus(res) != PGRES_COMMAND_OK)
|
||||
{
|
||||
pg_log_error("%s", PQerrorMessage(con));
|
||||
pg_log_info("(ignoring this error and continuing anyway)");
|
||||
pg_log_error_detail("(ignoring this error and continuing anyway)");
|
||||
}
|
||||
PQclear(res);
|
||||
}
|
||||
@@ -2878,8 +2877,7 @@ evaluateExpr(CState *st, PgBenchExpr *expr, PgBenchValue *retval)
|
||||
|
||||
default:
|
||||
/* internal error which should never occur */
|
||||
pg_log_fatal("unexpected enode type in evaluation: %d", expr->etype);
|
||||
exit(1);
|
||||
pg_fatal("unexpected enode type in evaluation: %d", expr->etype);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4447,8 +4445,7 @@ getResultString(bool skipped, EStatus estatus)
|
||||
return "deadlock";
|
||||
default:
|
||||
/* internal error which should never occur */
|
||||
pg_log_fatal("unexpected error status: %d", estatus);
|
||||
exit(1);
|
||||
pg_fatal("unexpected error status: %d", estatus);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -4901,10 +4898,7 @@ initGenerateDataClientSide(PGconn *con)
|
||||
res = PQexec(con, copy_statement);
|
||||
|
||||
if (PQresultStatus(res) != PGRES_COPY_IN)
|
||||
{
|
||||
pg_log_fatal("unexpected copy in result: %s", PQerrorMessage(con));
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("unexpected copy in result: %s", PQerrorMessage(con));
|
||||
PQclear(res);
|
||||
|
||||
start = pg_time_now();
|
||||
@@ -4918,10 +4912,7 @@ initGenerateDataClientSide(PGconn *con)
|
||||
INT64_FORMAT "\t" INT64_FORMAT "\t%d\t\n",
|
||||
j, k / naccounts + 1, 0);
|
||||
if (PQputline(con, sql.data))
|
||||
{
|
||||
pg_log_fatal("PQputline failed");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("PQputline failed");
|
||||
|
||||
if (CancelRequested)
|
||||
break;
|
||||
@@ -4963,15 +4954,9 @@ initGenerateDataClientSide(PGconn *con)
|
||||
fputc('\n', stderr); /* Need to move to next line */
|
||||
|
||||
if (PQputline(con, "\\.\n"))
|
||||
{
|
||||
pg_log_fatal("very last PQputline failed");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("very last PQputline failed");
|
||||
if (PQendcopy(con))
|
||||
{
|
||||
pg_log_fatal("PQendcopy failed");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("PQendcopy failed");
|
||||
|
||||
termPQExpBuffer(&sql);
|
||||
|
||||
@@ -5111,17 +5096,14 @@ static void
|
||||
checkInitSteps(const char *initialize_steps)
|
||||
{
|
||||
if (initialize_steps[0] == '\0')
|
||||
{
|
||||
pg_log_fatal("no initialization steps specified");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("no initialization steps specified");
|
||||
|
||||
for (const char *step = initialize_steps; *step != '\0'; step++)
|
||||
{
|
||||
if (strchr(ALL_INIT_STEPS " ", *step) == NULL)
|
||||
{
|
||||
pg_log_fatal("unrecognized initialization step \"%c\"", *step);
|
||||
pg_log_info("Allowed step characters are: \"" ALL_INIT_STEPS "\".");
|
||||
pg_log_error("unrecognized initialization step \"%c\"", *step);
|
||||
pg_log_error_detail("Allowed step characters are: \"" ALL_INIT_STEPS "\".");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
@@ -5142,10 +5124,7 @@ runInitSteps(const char *initialize_steps)
|
||||
initPQExpBuffer(&stats);
|
||||
|
||||
if ((con = doConnect()) == NULL)
|
||||
{
|
||||
pg_log_fatal("could not create connection for initialization");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("could not create connection for initialization");
|
||||
|
||||
setup_cancel_handler(NULL);
|
||||
SetCancelConn(con);
|
||||
@@ -5188,7 +5167,7 @@ runInitSteps(const char *initialize_steps)
|
||||
case ' ':
|
||||
break; /* ignore */
|
||||
default:
|
||||
pg_log_fatal("unrecognized initialization step \"%c\"", *step);
|
||||
pg_log_error("unrecognized initialization step \"%c\"", *step);
|
||||
PQfinish(con);
|
||||
exit(1);
|
||||
}
|
||||
@@ -5232,21 +5211,18 @@ GetTableInfo(PGconn *con, bool scale_given)
|
||||
{
|
||||
char *sqlState = PQresultErrorField(res, PG_DIAG_SQLSTATE);
|
||||
|
||||
pg_log_fatal("could not count number of branches: %s", PQerrorMessage(con));
|
||||
pg_log_error("could not count number of branches: %s", PQerrorMessage(con));
|
||||
|
||||
if (sqlState && strcmp(sqlState, ERRCODE_UNDEFINED_TABLE) == 0)
|
||||
pg_log_info("Perhaps you need to do initialization (\"pgbench -i\") in database \"%s\"",
|
||||
PQdb(con));
|
||||
pg_log_error_hint("Perhaps you need to do initialization (\"pgbench -i\") in database \"%s\".",
|
||||
PQdb(con));
|
||||
|
||||
exit(1);
|
||||
}
|
||||
scale = atoi(PQgetvalue(res, 0, 0));
|
||||
if (scale < 0)
|
||||
{
|
||||
pg_log_fatal("invalid count(*) from pgbench_branches: \"%s\"",
|
||||
PQgetvalue(res, 0, 0));
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("invalid count(*) from pgbench_branches: \"%s\"",
|
||||
PQgetvalue(res, 0, 0));
|
||||
PQclear(res);
|
||||
|
||||
/* warn if we override user-given -s switch */
|
||||
@@ -5293,8 +5269,8 @@ GetTableInfo(PGconn *con, bool scale_given)
|
||||
* This case is unlikely as pgbench already found "pgbench_branches"
|
||||
* above to compute the scale.
|
||||
*/
|
||||
pg_log_fatal("no pgbench_accounts table found in search_path");
|
||||
pg_log_info("Perhaps you need to do initialization (\"pgbench -i\") in database \"%s\".", PQdb(con));
|
||||
pg_log_error("no pgbench_accounts table found in search_path");
|
||||
pg_log_error_hint("Perhaps you need to do initialization (\"pgbench -i\") in database \"%s\".", PQdb(con));
|
||||
exit(1);
|
||||
}
|
||||
else /* PQntupes(res) == 1 */
|
||||
@@ -5316,8 +5292,7 @@ GetTableInfo(PGconn *con, bool scale_given)
|
||||
else
|
||||
{
|
||||
/* possibly a newer version with new partition method */
|
||||
pg_log_fatal("unexpected partition method: \"%s\"", ps);
|
||||
exit(1);
|
||||
pg_fatal("unexpected partition method: \"%s\"", ps);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5409,7 +5384,7 @@ syntax_error(const char *source, int lineno,
|
||||
if (command != NULL)
|
||||
appendPQExpBuffer(&buf, " in command \"%s\"", command);
|
||||
|
||||
pg_log_fatal("%s", buf.data);
|
||||
pg_log_error("%s", buf.data);
|
||||
|
||||
termPQExpBuffer(&buf);
|
||||
|
||||
@@ -5759,9 +5734,8 @@ process_backslash_command(PsqlScanState sstate, const char *source)
|
||||
static void
|
||||
ConditionError(const char *desc, int cmdn, const char *msg)
|
||||
{
|
||||
pg_log_fatal("condition error in script \"%s\" command %d: %s",
|
||||
desc, cmdn, msg);
|
||||
exit(1);
|
||||
pg_fatal("condition error in script \"%s\" command %d: %s",
|
||||
desc, cmdn, msg);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -5997,18 +5971,12 @@ process_file(const char *filename, int weight)
|
||||
if (strcmp(filename, "-") == 0)
|
||||
fd = stdin;
|
||||
else if ((fd = fopen(filename, "r")) == NULL)
|
||||
{
|
||||
pg_log_fatal("could not open file \"%s\": %m", filename);
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("could not open file \"%s\": %m", filename);
|
||||
|
||||
buf = read_file_contents(fd);
|
||||
|
||||
if (ferror(fd))
|
||||
{
|
||||
pg_log_fatal("could not read file \"%s\": %m", filename);
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("could not read file \"%s\": %m", filename);
|
||||
|
||||
if (fd != stdin)
|
||||
fclose(fd);
|
||||
@@ -6061,9 +6029,9 @@ findBuiltin(const char *name)
|
||||
|
||||
/* error cases */
|
||||
if (found == 0)
|
||||
pg_log_fatal("no builtin script found for name \"%s\"", name);
|
||||
pg_log_error("no builtin script found for name \"%s\"", name);
|
||||
else /* found > 1 */
|
||||
pg_log_fatal("ambiguous builtin name: %d builtin scripts found for prefix \"%s\"", found, name);
|
||||
pg_log_error("ambiguous builtin name: %d builtin scripts found for prefix \"%s\"", found, name);
|
||||
|
||||
listAvailableScripts();
|
||||
exit(1);
|
||||
@@ -6095,16 +6063,10 @@ parseScriptWeight(const char *option, char **script)
|
||||
errno = 0;
|
||||
wtmp = strtol(sep + 1, &badp, 10);
|
||||
if (errno != 0 || badp == sep + 1 || *badp != '\0')
|
||||
{
|
||||
pg_log_fatal("invalid weight specification: %s", sep);
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("invalid weight specification: %s", sep);
|
||||
if (wtmp > INT_MAX || wtmp < 0)
|
||||
{
|
||||
pg_log_fatal("weight specification out of range (0 .. %d): %lld",
|
||||
INT_MAX, (long long) wtmp);
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("weight specification out of range (0 .. %d): %lld",
|
||||
INT_MAX, (long long) wtmp);
|
||||
weight = wtmp;
|
||||
}
|
||||
else
|
||||
@@ -6121,16 +6083,10 @@ static void
|
||||
addScript(const ParsedScript *script)
|
||||
{
|
||||
if (script->commands == NULL || script->commands[0] == NULL)
|
||||
{
|
||||
pg_log_fatal("empty command list for script \"%s\"", script->desc);
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("empty command list for script \"%s\"", script->desc);
|
||||
|
||||
if (num_scripts >= MAX_SCRIPTS)
|
||||
{
|
||||
pg_log_fatal("at most %d SQL scripts are allowed", MAX_SCRIPTS);
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("at most %d SQL scripts are allowed", MAX_SCRIPTS);
|
||||
|
||||
CheckConditional(script);
|
||||
|
||||
@@ -6530,7 +6486,7 @@ set_random_seed(const char *seed)
|
||||
if (sscanf(seed, "%lu%c", &ulseed, &garbage) != 1)
|
||||
{
|
||||
pg_log_error("unrecognized random seed option \"%s\"", seed);
|
||||
pg_log_info("Expecting an unsigned integer, \"time\" or \"rand\"");
|
||||
pg_log_error_detail("Expecting an unsigned integer, \"time\" or \"rand\".");
|
||||
return false;
|
||||
}
|
||||
iseed = (uint64) ulseed;
|
||||
@@ -6664,10 +6620,7 @@ main(int argc, char **argv)
|
||||
|
||||
/* set random seed early, because it may be used while parsing scripts. */
|
||||
if (!set_random_seed(getenv("PGBENCH_RANDOM_SEED")))
|
||||
{
|
||||
pg_log_fatal("error while setting random seed from PGBENCH_RANDOM_SEED environment variable");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("error while setting random seed from PGBENCH_RANDOM_SEED environment variable");
|
||||
|
||||
while ((c = getopt_long(argc, argv, "iI:h:nvp:dqb:SNc:j:Crs:t:T:U:lf:D:F:M:P:R:L:", long_options, &optindex)) != -1)
|
||||
{
|
||||
@@ -6714,15 +6667,12 @@ main(int argc, char **argv)
|
||||
#else /* but BSD doesn't ... */
|
||||
if (getrlimit(RLIMIT_OFILE, &rlim) == -1)
|
||||
#endif /* RLIMIT_NOFILE */
|
||||
{
|
||||
pg_log_fatal("getrlimit failed: %m");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("getrlimit failed: %m");
|
||||
if (rlim.rlim_cur < nclients + 3)
|
||||
{
|
||||
pg_log_fatal("need at least %d open files, but system limit is %ld",
|
||||
pg_log_error("need at least %d open files, but system limit is %ld",
|
||||
nclients + 3, (long) rlim.rlim_cur);
|
||||
pg_log_info("Reduce number of clients, or use limit/ulimit to increase the system limit.");
|
||||
pg_log_error_hint("Reduce number of clients, or use limit/ulimit to increase the system limit.");
|
||||
exit(1);
|
||||
}
|
||||
#endif /* HAVE_GETRLIMIT */
|
||||
@@ -6736,10 +6686,7 @@ main(int argc, char **argv)
|
||||
}
|
||||
#ifndef ENABLE_THREAD_SAFETY
|
||||
if (nthreads != 1)
|
||||
{
|
||||
pg_log_fatal("threads are not supported on this platform; use -j1");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("threads are not supported on this platform; use -j1");
|
||||
#endif /* !ENABLE_THREAD_SAFETY */
|
||||
break;
|
||||
case 'C':
|
||||
@@ -6812,10 +6759,7 @@ main(int argc, char **argv)
|
||||
benchmarking_option_set = true;
|
||||
|
||||
if ((p = strchr(optarg, '=')) == NULL || p == optarg || *(p + 1) == '\0')
|
||||
{
|
||||
pg_log_fatal("invalid variable definition: \"%s\"", optarg);
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("invalid variable definition: \"%s\"", optarg);
|
||||
|
||||
*p++ = '\0';
|
||||
if (!putVariable(&state[0].variables, "option", optarg, p))
|
||||
@@ -6834,10 +6778,7 @@ main(int argc, char **argv)
|
||||
if (strcmp(optarg, QUERYMODE[querymode]) == 0)
|
||||
break;
|
||||
if (querymode >= NUM_QUERYMODE)
|
||||
{
|
||||
pg_log_fatal("invalid query mode (-M): \"%s\"", optarg);
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("invalid query mode (-M): \"%s\"", optarg);
|
||||
break;
|
||||
case 'P':
|
||||
benchmarking_option_set = true;
|
||||
@@ -6853,10 +6794,7 @@ main(int argc, char **argv)
|
||||
benchmarking_option_set = true;
|
||||
|
||||
if (throttle_value <= 0.0)
|
||||
{
|
||||
pg_log_fatal("invalid rate limit: \"%s\"", optarg);
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("invalid rate limit: \"%s\"", optarg);
|
||||
/* Invert rate limit into per-transaction delay in usec */
|
||||
throttle_delay = 1000000.0 / throttle_value;
|
||||
}
|
||||
@@ -6866,10 +6804,7 @@ main(int argc, char **argv)
|
||||
double limit_ms = atof(optarg);
|
||||
|
||||
if (limit_ms <= 0.0)
|
||||
{
|
||||
pg_log_fatal("invalid latency limit: \"%s\"", optarg);
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("invalid latency limit: \"%s\"", optarg);
|
||||
benchmarking_option_set = true;
|
||||
latency_limit = (int64) (limit_ms * 1000);
|
||||
}
|
||||
@@ -6890,10 +6825,7 @@ main(int argc, char **argv)
|
||||
benchmarking_option_set = true;
|
||||
sample_rate = atof(optarg);
|
||||
if (sample_rate <= 0.0 || sample_rate > 1.0)
|
||||
{
|
||||
pg_log_fatal("invalid sampling rate: \"%s\"", optarg);
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("invalid sampling rate: \"%s\"", optarg);
|
||||
break;
|
||||
case 5: /* aggregate-interval */
|
||||
benchmarking_option_set = true;
|
||||
@@ -6916,10 +6848,7 @@ main(int argc, char **argv)
|
||||
case 9: /* random-seed */
|
||||
benchmarking_option_set = true;
|
||||
if (!set_random_seed(optarg))
|
||||
{
|
||||
pg_log_fatal("error while setting random seed from --random-seed option");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("error while setting random seed from --random-seed option");
|
||||
break;
|
||||
case 10: /* list */
|
||||
{
|
||||
@@ -6942,11 +6871,8 @@ main(int argc, char **argv)
|
||||
else if (pg_strcasecmp(optarg, "hash") == 0)
|
||||
partition_method = PART_HASH;
|
||||
else
|
||||
{
|
||||
pg_log_fatal("invalid partition method, expecting \"range\" or \"hash\", got: \"%s\"",
|
||||
optarg);
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("invalid partition method, expecting \"range\" or \"hash\", got: \"%s\"",
|
||||
optarg);
|
||||
break;
|
||||
case 13: /* failures-detailed */
|
||||
benchmarking_option_set = true;
|
||||
@@ -6957,10 +6883,7 @@ main(int argc, char **argv)
|
||||
int32 max_tries_arg = atoi(optarg);
|
||||
|
||||
if (max_tries_arg < 0)
|
||||
{
|
||||
pg_log_fatal("invalid number of maximum tries: \"%s\"", optarg);
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("invalid number of maximum tries: \"%s\"", optarg);
|
||||
|
||||
benchmarking_option_set = true;
|
||||
max_tries = (uint32) max_tries_arg;
|
||||
@@ -6971,9 +6894,9 @@ main(int argc, char **argv)
|
||||
verbose_errors = true;
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
|
||||
/* getopt_long already emitted a complaint */
|
||||
pg_log_error_hint("Try \"%s --help\" for more information.", progname);
|
||||
exit(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6999,10 +6922,7 @@ main(int argc, char **argv)
|
||||
}
|
||||
|
||||
if (total_weight == 0 && !is_init_mode)
|
||||
{
|
||||
pg_log_fatal("total script weight must not be zero");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("total script weight must not be zero");
|
||||
|
||||
/* show per script stats if several scripts are used */
|
||||
if (num_scripts > 1)
|
||||
@@ -7037,25 +6957,19 @@ main(int argc, char **argv)
|
||||
|
||||
if (optind < argc)
|
||||
{
|
||||
pg_log_fatal("too many command-line arguments (first is \"%s\")",
|
||||
pg_log_error("too many command-line arguments (first is \"%s\")",
|
||||
argv[optind]);
|
||||
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
|
||||
pg_log_error_hint("Try \"%s --help\" for more information.", progname);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (is_init_mode)
|
||||
{
|
||||
if (benchmarking_option_set)
|
||||
{
|
||||
pg_log_fatal("some of the specified options cannot be used in initialization (-i) mode");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("some of the specified options cannot be used in initialization (-i) mode");
|
||||
|
||||
if (partitions == 0 && partition_method != PART_NONE)
|
||||
{
|
||||
pg_log_fatal("--partition-method requires greater than zero --partitions");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("--partition-method requires greater than zero --partitions");
|
||||
|
||||
/* set default method */
|
||||
if (partitions > 0 && partition_method == PART_NONE)
|
||||
@@ -7091,17 +7005,11 @@ main(int argc, char **argv)
|
||||
else
|
||||
{
|
||||
if (initialization_option_set)
|
||||
{
|
||||
pg_log_fatal("some of the specified options cannot be used in benchmarking mode");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("some of the specified options cannot be used in benchmarking mode");
|
||||
}
|
||||
|
||||
if (nxacts > 0 && duration > 0)
|
||||
{
|
||||
pg_log_fatal("specify either a number of transactions (-t) or a duration (-T), not both");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("specify either a number of transactions (-t) or a duration (-T), not both");
|
||||
|
||||
/* Use DEFAULT_NXACTS if neither nxacts nor duration is specified. */
|
||||
if (nxacts <= 0 && duration <= 0)
|
||||
@@ -7109,55 +7017,31 @@ main(int argc, char **argv)
|
||||
|
||||
/* --sampling-rate may be used only with -l */
|
||||
if (sample_rate > 0.0 && !use_log)
|
||||
{
|
||||
pg_log_fatal("log sampling (--sampling-rate) is allowed only when logging transactions (-l)");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("log sampling (--sampling-rate) is allowed only when logging transactions (-l)");
|
||||
|
||||
/* --sampling-rate may not be used with --aggregate-interval */
|
||||
if (sample_rate > 0.0 && agg_interval > 0)
|
||||
{
|
||||
pg_log_fatal("log sampling (--sampling-rate) and aggregation (--aggregate-interval) cannot be used at the same time");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("log sampling (--sampling-rate) and aggregation (--aggregate-interval) cannot be used at the same time");
|
||||
|
||||
if (agg_interval > 0 && !use_log)
|
||||
{
|
||||
pg_log_fatal("log aggregation is allowed only when actually logging transactions");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("log aggregation is allowed only when actually logging transactions");
|
||||
|
||||
if (!use_log && logfile_prefix)
|
||||
{
|
||||
pg_log_fatal("log file prefix (--log-prefix) is allowed only when logging transactions (-l)");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("log file prefix (--log-prefix) is allowed only when logging transactions (-l)");
|
||||
|
||||
if (duration > 0 && agg_interval > duration)
|
||||
{
|
||||
pg_log_fatal("number of seconds for aggregation (%d) must not be higher than test duration (%d)", agg_interval, duration);
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("number of seconds for aggregation (%d) must not be higher than test duration (%d)", agg_interval, duration);
|
||||
|
||||
if (duration > 0 && agg_interval > 0 && duration % agg_interval != 0)
|
||||
{
|
||||
pg_log_fatal("duration (%d) must be a multiple of aggregation interval (%d)", duration, agg_interval);
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("duration (%d) must be a multiple of aggregation interval (%d)", duration, agg_interval);
|
||||
|
||||
if (progress_timestamp && progress == 0)
|
||||
{
|
||||
pg_log_fatal("--progress-timestamp is allowed only under --progress");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("--progress-timestamp is allowed only under --progress");
|
||||
|
||||
if (!max_tries)
|
||||
{
|
||||
if (!latency_limit && duration <= 0)
|
||||
{
|
||||
pg_log_fatal("an unlimited number of transaction tries can only be used with --latency-limit or a duration (-T)");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("an unlimited number of transaction tries can only be used with --latency-limit or a duration (-T)");
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -7207,10 +7091,7 @@ main(int argc, char **argv)
|
||||
/* opening connection... */
|
||||
con = doConnect();
|
||||
if (con == NULL)
|
||||
{
|
||||
pg_log_fatal("could not create connection for setup");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("could not create connection for setup");
|
||||
|
||||
/* report pgbench and server versions */
|
||||
printVersion(con);
|
||||
@@ -7318,10 +7199,7 @@ main(int argc, char **argv)
|
||||
|
||||
errno = THREAD_BARRIER_INIT(&barrier, nthreads);
|
||||
if (errno != 0)
|
||||
{
|
||||
pg_log_fatal("could not initialize barrier: %m");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("could not initialize barrier: %m");
|
||||
|
||||
#ifdef ENABLE_THREAD_SAFETY
|
||||
/* start all threads but thread 0 which is executed directly later */
|
||||
@@ -7333,10 +7211,7 @@ main(int argc, char **argv)
|
||||
errno = THREAD_CREATE(&thread->thread, threadRun, thread);
|
||||
|
||||
if (errno != 0)
|
||||
{
|
||||
pg_log_fatal("could not create thread: %m");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("could not create thread: %m");
|
||||
}
|
||||
#else
|
||||
Assert(nthreads == 1);
|
||||
@@ -7404,7 +7279,7 @@ main(int argc, char **argv)
|
||||
THREAD_BARRIER_DESTROY(&barrier);
|
||||
|
||||
if (exit_code != 0)
|
||||
pg_log_fatal("Run was aborted; the above results are incomplete.");
|
||||
pg_log_error("Run was aborted; the above results are incomplete.");
|
||||
|
||||
return exit_code;
|
||||
}
|
||||
@@ -7438,10 +7313,7 @@ threadRun(void *arg)
|
||||
thread->logfile = fopen(logpath, "w");
|
||||
|
||||
if (thread->logfile == NULL)
|
||||
{
|
||||
pg_log_fatal("could not open logfile \"%s\": %m", logpath);
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("could not open logfile \"%s\": %m", logpath);
|
||||
}
|
||||
|
||||
/* explicitly initialize the state machines */
|
||||
@@ -7466,9 +7338,8 @@ threadRun(void *arg)
|
||||
if ((state[i].con = doConnect()) == NULL)
|
||||
{
|
||||
/* coldly abort on initial connection failure */
|
||||
pg_log_fatal("could not create connection for client %d",
|
||||
state[i].id);
|
||||
exit(1);
|
||||
pg_fatal("could not create connection for client %d",
|
||||
state[i].id);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7738,10 +7609,7 @@ setalarm(int seconds)
|
||||
!CreateTimerQueueTimer(&timer, queue,
|
||||
win32_timer_callback, NULL, seconds * 1000, 0,
|
||||
WT_EXECUTEINTIMERTHREAD | WT_EXECUTEONLYONCE))
|
||||
{
|
||||
pg_log_fatal("failed to set timer");
|
||||
exit(1);
|
||||
}
|
||||
pg_fatal("failed to set timer");
|
||||
}
|
||||
|
||||
#endif /* WIN32 */
|
||||
@@ -7885,8 +7753,7 @@ add_socket_to_set(socket_set *sa, int fd, int idx)
|
||||
* Doing a hard exit here is a bit grotty, but it doesn't seem worth
|
||||
* complicating the API to make it less grotty.
|
||||
*/
|
||||
pg_log_fatal("too many client connections for select()");
|
||||
exit(1);
|
||||
pg_fatal("too many client connections for select()");
|
||||
}
|
||||
FD_SET(fd, &sa->fds);
|
||||
if (fd > sa->maxfd)
|
||||
|
||||
Reference in New Issue
Block a user