Commit 34f13cc4 authored by Alvaro Herrera's avatar Alvaro Herrera

pgbench: cleanup use of a "logfile" parameter

There is no reason to have the per-thread logfile file pointer as a
separate parameter in various functions: it's much simpler to put it in
the per-thread state struct instead, which is already being passed to
all functions that need the log file anyway.  Change the callsites in
which it was used as a boolean to test whether logging is active, so
that they use the use_log global variable instead.

No backpatch, even though this exists since commit a887c486 of March
2010, because this is just for cleanliness' sake and the surrounding
code has been modified a lot recently anyway.
parent db94419f
...@@ -256,6 +256,7 @@ typedef struct ...@@ -256,6 +256,7 @@ typedef struct
int nstate; /* length of state[] */ int nstate; /* length of state[] */
unsigned short random_state[3]; /* separate randomness for each thread */ unsigned short random_state[3]; /* separate randomness for each thread */
int64 throttle_trigger; /* previous/next throttling (us) */ int64 throttle_trigger; /* previous/next throttling (us) */
FILE *logfile; /* where to log, or NULL */
/* per thread collected stats */ /* per thread collected stats */
instr_time start_time; /* thread start time */ instr_time start_time; /* thread start time */
...@@ -366,8 +367,8 @@ static void setalarm(int seconds); ...@@ -366,8 +367,8 @@ static void setalarm(int seconds);
static void *threadRun(void *arg); static void *threadRun(void *arg);
static void processXactStats(TState *thread, CState *st, instr_time *now, static void processXactStats(TState *thread, CState *st, instr_time *now,
bool skipped, FILE *logfile, StatsData *agg); bool skipped, StatsData *agg);
static void doLog(TState *thread, CState *st, FILE *logfile, instr_time *now, static void doLog(TState *thread, CState *st, instr_time *now,
StatsData *agg, bool skipped, double latency, double lag); StatsData *agg, bool skipped, double latency, double lag);
...@@ -1246,7 +1247,7 @@ chooseScript(TState *thread) ...@@ -1246,7 +1247,7 @@ chooseScript(TState *thread)
/* return false iff client should be disconnected */ /* return false iff client should be disconnected */
static bool static bool
doCustom(TState *thread, CState *st, FILE *logfile, StatsData *agg) doCustom(TState *thread, CState *st, StatsData *agg)
{ {
PGresult *res; PGresult *res;
Command **commands; Command **commands;
...@@ -1300,7 +1301,7 @@ top: ...@@ -1300,7 +1301,7 @@ top:
now_us = INSTR_TIME_GET_MICROSEC(now); now_us = INSTR_TIME_GET_MICROSEC(now);
while (thread->throttle_trigger < now_us - latency_limit) while (thread->throttle_trigger < now_us - latency_limit)
{ {
processXactStats(thread, st, &now, true, logfile, agg); processXactStats(thread, st, &now, true, agg);
/* next rendez-vous */ /* next rendez-vous */
wait = getPoissonRand(thread, throttle_delay); wait = getPoissonRand(thread, throttle_delay);
thread->throttle_trigger += wait; thread->throttle_trigger += wait;
...@@ -1361,8 +1362,8 @@ top: ...@@ -1361,8 +1362,8 @@ top:
if (commands[st->state + 1] == NULL) if (commands[st->state + 1] == NULL)
{ {
if (progress || throttle_delay || latency_limit || if (progress || throttle_delay || latency_limit ||
per_script_stats || logfile) per_script_stats || use_log)
processXactStats(thread, st, &now, false, logfile, agg); processXactStats(thread, st, &now, false, agg);
else else
thread->stats.cnt++; thread->stats.cnt++;
} }
...@@ -1454,7 +1455,8 @@ top: ...@@ -1454,7 +1455,8 @@ top:
} }
/* Record transaction start time under logging, progress or throttling */ /* Record transaction start time under logging, progress or throttling */
if ((logfile || progress || throttle_delay || latency_limit || per_script_stats) && st->state == 0) if ((use_log || progress || throttle_delay || latency_limit ||
per_script_stats) && st->state == 0)
{ {
INSTR_TIME_SET_CURRENT(st->txn_begin); INSTR_TIME_SET_CURRENT(st->txn_begin);
...@@ -1794,9 +1796,13 @@ top: ...@@ -1794,9 +1796,13 @@ top:
* print log entry after completing one transaction. * print log entry after completing one transaction.
*/ */
static void static void
doLog(TState *thread, CState *st, FILE *logfile, instr_time *now, doLog(TState *thread, CState *st, instr_time *now,
StatsData *agg, bool skipped, double latency, double lag) StatsData *agg, bool skipped, double latency, double lag)
{ {
FILE *logfile = thread->logfile;
Assert(use_log);
/* /*
* Skip the log entry if sampling is enabled and this row doesn't belong * Skip the log entry if sampling is enabled and this row doesn't belong
* to the random sample. * to the random sample.
...@@ -1879,7 +1885,7 @@ doLog(TState *thread, CState *st, FILE *logfile, instr_time *now, ...@@ -1879,7 +1885,7 @@ doLog(TState *thread, CState *st, FILE *logfile, instr_time *now,
*/ */
static void static void
processXactStats(TState *thread, CState *st, instr_time *now, processXactStats(TState *thread, CState *st, instr_time *now,
bool skipped, FILE *logfile, StatsData *agg) bool skipped, StatsData *agg)
{ {
double latency = 0.0, double latency = 0.0,
lag = 0.0; lag = 0.0;
...@@ -1906,7 +1912,7 @@ processXactStats(TState *thread, CState *st, instr_time *now, ...@@ -1906,7 +1912,7 @@ processXactStats(TState *thread, CState *st, instr_time *now,
thread->stats.cnt++; thread->stats.cnt++;
if (use_log) if (use_log)
doLog(thread, st, logfile, now, agg, skipped, latency, lag); doLog(thread, st, now, agg, skipped, latency, lag);
/* XXX could use a mutex here, but we choose not to */ /* XXX could use a mutex here, but we choose not to */
if (per_script_stats) if (per_script_stats)
...@@ -3289,7 +3295,7 @@ main(int argc, char **argv) ...@@ -3289,7 +3295,7 @@ main(int argc, char **argv)
exit(1); exit(1);
} }
/* --sampling-rate may must not be used with --aggregate-interval */ /* --sampling-rate may not be used with --aggregate-interval */
if (sample_rate > 0.0 && agg_interval > 0) if (sample_rate > 0.0 && agg_interval > 0)
{ {
fprintf(stderr, "log sampling (--sampling-rate) and aggregation (--aggregate-interval) cannot be used at the same time\n"); fprintf(stderr, "log sampling (--sampling-rate) and aggregation (--aggregate-interval) cannot be used at the same time\n");
...@@ -3460,6 +3466,7 @@ main(int argc, char **argv) ...@@ -3460,6 +3466,7 @@ main(int argc, char **argv)
thread->random_state[0] = random(); thread->random_state[0] = random();
thread->random_state[1] = random(); thread->random_state[1] = random();
thread->random_state[2] = random(); thread->random_state[2] = random();
thread->logfile = NULL; /* filled in later */
thread->latency_late = 0; thread->latency_late = 0;
initStats(&thread->stats, 0.0); initStats(&thread->stats, 0.0);
...@@ -3555,7 +3562,6 @@ threadRun(void *arg) ...@@ -3555,7 +3562,6 @@ threadRun(void *arg)
{ {
TState *thread = (TState *) arg; TState *thread = (TState *) arg;
CState *state = thread->state; CState *state = thread->state;
FILE *logfile = NULL; /* per-thread log file */
instr_time start, instr_time start,
end; end;
int nstate = thread->nstate; int nstate = thread->nstate;
...@@ -3589,9 +3595,9 @@ threadRun(void *arg) ...@@ -3589,9 +3595,9 @@ threadRun(void *arg)
snprintf(logpath, sizeof(logpath), "pgbench_log.%d", main_pid); snprintf(logpath, sizeof(logpath), "pgbench_log.%d", main_pid);
else else
snprintf(logpath, sizeof(logpath), "pgbench_log.%d.%d", main_pid, thread->tid); snprintf(logpath, sizeof(logpath), "pgbench_log.%d.%d", main_pid, thread->tid);
logfile = fopen(logpath, "w"); thread->logfile = fopen(logpath, "w");
if (logfile == NULL) if (thread->logfile == NULL)
{ {
fprintf(stderr, "could not open logfile \"%s\": %s\n", fprintf(stderr, "could not open logfile \"%s\": %s\n",
logpath, strerror(errno)); logpath, strerror(errno));
...@@ -3628,7 +3634,7 @@ threadRun(void *arg) ...@@ -3628,7 +3634,7 @@ threadRun(void *arg)
if (debug) if (debug)
fprintf(stderr, "client %d executing script \"%s\"\n", st->id, fprintf(stderr, "client %d executing script \"%s\"\n", st->id,
sql_script[st->use_file].name); sql_script[st->use_file].name);
if (!doCustom(thread, st, logfile, &aggs)) if (!doCustom(thread, st, &aggs))
remains--; /* I've aborted */ remains--; /* I've aborted */
if (st->ecnt > prev_ecnt && commands[st->state]->type == META_COMMAND) if (st->ecnt > prev_ecnt && commands[st->state]->type == META_COMMAND)
...@@ -3767,7 +3773,7 @@ threadRun(void *arg) ...@@ -3767,7 +3773,7 @@ threadRun(void *arg)
if (st->con && (FD_ISSET(PQsocket(st->con), &input_mask) if (st->con && (FD_ISSET(PQsocket(st->con), &input_mask)
|| commands[st->state]->type == META_COMMAND)) || commands[st->state]->type == META_COMMAND))
{ {
if (!doCustom(thread, st, logfile, &aggs)) if (!doCustom(thread, st, &aggs))
remains--; /* I've aborted */ remains--; /* I've aborted */
} }
...@@ -3871,14 +3877,14 @@ done: ...@@ -3871,14 +3877,14 @@ done:
disconnect_all(state, nstate); disconnect_all(state, nstate);
INSTR_TIME_SET_CURRENT(end); INSTR_TIME_SET_CURRENT(end);
INSTR_TIME_ACCUM_DIFF(thread->conn_time, end, start); INSTR_TIME_ACCUM_DIFF(thread->conn_time, end, start);
if (logfile) if (thread->logfile)
{ {
if (agg_interval) if (agg_interval)
{ {
/* log aggregated but not yet reported transactions */ /* log aggregated but not yet reported transactions */
doLog(thread, state, logfile, &end, &aggs, false, 0, 0); doLog(thread, state, &end, &aggs, false, 0, 0);
} }
fclose(logfile); fclose(thread->logfile);
} }
return NULL; return NULL;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment