Fix tps calculation when -C supplied. Per Yoshiyuki Asaba.
authorTatsuo Ishii <ishii@postgresql.org>
Wed, 19 Mar 2008 00:29:35 +0000 (00:29 +0000)
committerTatsuo Ishii <ishii@postgresql.org>
Wed, 19 Mar 2008 00:29:35 +0000 (00:29 +0000)
Change Copyright owner from mine to PostgreSQL Global Development Group
Fix minor message typo

contrib/pgbench/pgbench.c

index 4dabe6f0ba104c272f6b443620c4ab8ac343bddf..260b52d571fcc10a091c64ad8becf682d6365916 100644 (file)
@@ -1,21 +1,30 @@
 /*
- * $PostgreSQL: pgsql/contrib/pgbench/pgbench.c,v 1.77 2008/03/12 02:18:33 tgl Exp $
+ * pgbench.c
  *
- * pgbench: a simple benchmark program for PostgreSQL
- * written by Tatsuo Ishii
+ * A simple benchmark program for PostgreSQL
+ * Originally written by Tatsuo Ishii and enhanced by many contributors.
  *
- * Copyright (c) 2000-2007 Tatsuo Ishii
+ * $PostgreSQL: pgsql/contrib/pgbench/pgbench.c,v 1.78 2008/03/19 00:29:35 ishii Exp $
+ * Copyright (c) 2000-2008, PostgreSQL Global Development Group
+ * ALL RIGHTS RESERVED;
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose, without fee, and without a written agreement
+ * is hereby granted, provided that the above copyright notice and this
+ * paragraph and the following two paragraphs appear in all copies.
+ *
+ * IN NO EVENT SHALL THE AUTHOR OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING
+ * LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS
+ * DOCUMENTATION, EVEN IF THE AUTHOR OR DISTRIBUTORS HAVE BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * THE AUTHOR AND DISTRIBUTORS SPECIFICALLY DISCLAIMS ANY WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE AUTHOR AND DISTRIBUTORS HAS NO OBLIGATIONS TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  *
- * Permission to use, copy, modify, and distribute this software and
- * its documentation for any purpose and without fee is hereby
- * granted, provided that the above copyright notice appear in all
- * copies and that both that copyright notice and this permission
- * notice appear in supporting documentation, and that the name of the
- * author not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission. The author makes no representations about the
- * suitability of this software for any purpose.  It is provided "as
- * is" without express or implied warranty.
  */
 #include "postgres_fe.h"
 
@@ -184,6 +193,39 @@ static char *select_only = {
    "SELECT abalance FROM accounts WHERE aid = :aid;\n"
 };
 
+/* Connection overhead time */
+static struct timeval conn_total_time = {0, 0};
+
+/* Calculate total time */
+static void
+addTime(struct timeval *t1, struct timeval *t2, struct timeval *result)
+{
+   int sec = t1->tv_sec + t2->tv_sec;
+   int usec = t1->tv_usec + t2->tv_usec;
+   if (usec >= 1000000)
+   {
+       usec -= 1000000;
+       sec++;
+   }
+   result->tv_sec = sec;
+   result->tv_usec = usec;
+}
+
+/* Calculate time difference */
+static void
+diffTime(struct timeval *t1, struct timeval *t2, struct timeval *result)
+{
+   int sec = t1->tv_sec - t2->tv_sec;
+   int usec = t1->tv_usec - t2->tv_usec;
+   if (usec < 0)
+   {
+       usec += 1000000;
+       sec--;
+   }
+   result->tv_sec = sec;
+   result->tv_usec = usec;
+}
+
 static void
 usage(void)
 {
@@ -564,6 +606,9 @@ top:
 
    if (st->con == NULL)
    {
+       struct timeval t1, t2, t3;
+
+       gettimeofday(&t1, NULL);
        if ((st->con = doConnect()) == NULL)
        {
            fprintf(stderr, "Client %d aborted in establishing connection.\n",
@@ -573,6 +618,9 @@ top:
            st->con = NULL;
            return;
        }
+       gettimeofday(&t2, NULL);
+       diffTime(&t2, &t1, &t3);
+       addTime(&conn_total_time, &t3, &conn_total_time);
    }
 
    if (use_log && st->state == 0)
@@ -1193,8 +1241,7 @@ process_builtin(char *tb)
 static void
 printResults(
             int ttype, CState * state,
-            struct timeval * tv1, struct timeval * tv2,
-            struct timeval * tv3)
+            struct timeval * start_time, struct timeval * end_time)
 {
    double      t1,
                t2;
@@ -1205,10 +1252,11 @@ printResults(
    for (i = 0; i < nclients; i++)
        normal_xacts += state[i].cnt;
 
-   t1 = (tv3->tv_sec - tv1->tv_sec) * 1000000.0 + (tv3->tv_usec - tv1->tv_usec);
+   t1 = (end_time->tv_sec - start_time->tv_sec) * 1000000.0 + (end_time->tv_usec - start_time->tv_usec);
    t1 = normal_xacts * 1000000.0 / t1;
 
-   t2 = (tv3->tv_sec - tv2->tv_sec) * 1000000.0 + (tv3->tv_usec - tv2->tv_usec);
+   t2 = (end_time->tv_sec - start_time->tv_sec - conn_total_time.tv_sec) * 1000000.0 +
+       (end_time->tv_usec - start_time->tv_usec - conn_total_time.tv_usec);
    t2 = normal_xacts * 1000000.0 / t2;
 
    if (ttype == 0)
@@ -1244,10 +1292,8 @@ main(int argc, char **argv)
 
    CState     *state;          /* status of clients */
 
-   struct timeval tv1;         /* start up time */
-   struct timeval tv2;         /* after establishing all connections to the
-                                * backend */
-   struct timeval tv3;         /* end time */
+   struct timeval start_time;          /* start up time */
+   struct timeval end_time;            /* end time */
 
    int         i;
 
@@ -1561,14 +1607,16 @@ main(int argc, char **argv)
    PQfinish(con);
 
    /* set random seed */
-   gettimeofday(&tv1, NULL);
-   srandom((unsigned int) tv1.tv_usec);
+   gettimeofday(&start_time, NULL);
+   srandom((unsigned int) start_time.tv_usec);
 
    /* get start up time */
-   gettimeofday(&tv1, NULL);
+   gettimeofday(&start_time, NULL);
 
    if (is_connect == 0)
    {
+       struct timeval t, now;
+
        /* make connections to the database */
        for (i = 0; i < nclients; i++)
        {
@@ -1576,11 +1624,12 @@ main(int argc, char **argv)
            if ((state[i].con = doConnect()) == NULL)
                exit(1);
        }
+       /* time after connections set up */
+       gettimeofday(&now, NULL);
+       diffTime(&now, &start_time, &t);
+       addTime(&conn_total_time, &t, &conn_total_time);
    }
 
-   /* time after connections set up */
-   gettimeofday(&tv2, NULL);
-
    /* process bultin SQL scripts */
    switch (ttype)
    {
@@ -1627,8 +1676,8 @@ main(int argc, char **argv)
        {                       /* all done ? */
            disconnect_all(state);
            /* get end time */
-           gettimeofday(&tv3, NULL);
-           printResults(ttype, state, &tv1, &tv2, &tv3);
+           gettimeofday(&end_time, NULL);
+           printResults(ttype, state, &start_time, &end_time);
            if (LOGFILE)
                fclose(LOGFILE);
            exit(0);
@@ -1728,7 +1777,7 @@ main(int argc, char **argv)
 
            if (state[i].ecnt > prev_ecnt && commands[state[i].state]->type == META_COMMAND)
            {
-               fprintf(stderr, "Client %d aborted in state %d. Execution meta-command failed.\n", i, state[i].state);
+               fprintf(stderr, "Client %d aborted in state %d. Execution of meta-command failed.\n", i, state[i].state);
                remains--;      /* I've aborted */
                PQfinish(state[i].con);
                state[i].con = NULL;