Re: uptime function to postmaster - Mailing list pgsql-patches

From Euler Taveira de Oliveira
Subject Re: uptime function to postmaster
Date
Msg-id 20050121035417.76235.qmail@web52603.mail.yahoo.com
Whole thread Raw
In response to uptime function to postmaster  (Euler Taveira de Oliveira <eulerto@yahoo.com.br>)
Responses Re: uptime function to postmaster
Re: uptime function to postmaster
List pgsql-patches
Bruce Momjian wrote:
>
> This has been saved for the 8.1 release:
>
>     http:/momjian.postgresql.org/cgi-bin/pgpatches2
>
>
---------------------------------------------------------------------------
>

Hi,

I redo this patch adding the funcionality that Matthias implemented
(starttime). Basically I changed the uptime()'s return type to
'interval' (more funcional now, uh?) and rework in the Matthias
function (start_time()). The last one return type is 'timestamp with
time zone'. The docs are attached to, but maybe need some
work on it.

Comments?



=====
Euler Taveira de Oliveira
euler[at]yahoo_com_br





_______________________________________________________
Yahoo! Acesso Grátis - Instale o discador do Yahoo! agora. http://br.acesso.yahoo.com/ - Internet rápida e grátis***
./doc/src/sgml/func.sgml.orig   2005-01-20 18:23:48.000000000 -0200 
--- ./doc/src/sgml/func.sgml    2005-01-20 16:44:52.000000000 -0200
***************
*** 8060,8065 ****
--- 8060,8077 ----
        </row>

        <row>
+        <entry><function>start_time()</function></entry>
+        <entry><type>timestamp with time zone</type></entry>
+        <entry>PostgreSQL startup date and time</entry>
+       </row>
+
+       <row>
+        <entry><function>uptime()</function></entry>
+        <entry><type>interval</type></entry>
+        <entry>PostgreSQL uptime information</entry>
+       </row>
+
+       <row>
         <entry><function>user</function></entry>
         <entry><type>name</type></entry>
         <entry>equivalent to <function>current_user</function></entry>
***************
*** 8157,8162 ****
--- 8169,8192 ----
     </para>

     <indexterm zone="functions-info">
+     <primary>start_time</primary>
+    </indexterm>
+
+    <para>
+      <function>start_time()</function> returns the timestamp with time zone
+      which the <productname>PostgreSQL</productname> was started.
+    </para>
+
+    <indexterm zone="functions-info">
+     <primary>uptime</primary>
+    </indexterm>
+
+    <para>
+      <function>uptime()</function> returns the <productname>PostgreSQL</>
+      uptime information.
+    </para>
+
+    <indexterm zone="functions-info">
      <primary>version</primary>
     </indexterm>

*** ./src/backend/postmaster/postmaster.c.orig    2005-01-20 18:24:36.000000000 -0200
--- ./src/backend/postmaster/postmaster.c    2005-01-20 16:44:52.000000000 -0200
***************
*** 221,226 ****
--- 221,229 ----
  bool        ClientAuthInProgress = false;        /* T during new-client
                                                   * authentication */

+ /* Backend startup time */
+ TimestampTz    StartTime;
+
  /*
   * State for assigning random salts and cancel keys.
   * Also, the global MyCancelKey passes the cancel key assigned to a given
***************
*** 329,334 ****
--- 332,338 ----
      InheritableSocket pgStatPipe0;
      InheritableSocket pgStatPipe1;
      pid_t PostmasterPid;
+     TimestampTz StartTime;
  #ifdef WIN32
      HANDLE PostmasterHandle;
      HANDLE initial_signal_pipe;
***************
*** 371,376 ****
--- 375,383 ----
      char       *userDoption = NULL;
      int            i;

+     AbsoluteTime        StartTimeSec;    /* integer part */
+     int            StartTimeUSec;    /* microsecond part */
+
      /* This will call exit() if strdup() fails. */
      progname = get_progname(argv[0]);

***************
*** 915,920 ****
--- 922,933 ----
       */
      StartupPID = StartupDataBase();

+     /*
+      * Get start up time
+      */
+     StartTimeSec = GetCurrentAbsoluteTimeUsec(&StartTimeUSec);
+     StartTime = AbsoluteTimeUsecToTimestampTz(StartTimeSec, StartTimeUSec);
+
      status = ServerLoop();

      /*
***************
*** 3669,3674 ****
--- 3682,3688 ----
      write_inheritable_socket(¶m->pgStatPipe1, pgStatPipe[1], childPid);

      param->PostmasterPid = PostmasterPid;
+     param->StartTime = StartTime;

  #ifdef WIN32
      param->PostmasterHandle = PostmasterHandle;
***************
*** 3871,3876 ****
--- 3885,3891 ----
      read_inheritable_socket(&pgStatPipe[1], ¶m->pgStatPipe1);

      PostmasterPid = param->PostmasterPid;
+     StartTime = param->StartTime;

  #ifdef WIN32
      PostmasterHandle = param->PostmasterHandle;
*** ./src/backend/tcop/postgres.c.orig    2005-01-20 18:39:18.000000000 -0200
--- ./src/backend/tcop/postgres.c    2005-01-20 18:15:07.000000000 -0200
***************
*** 144,149 ****
--- 144,152 ----
  #endif   /* TCOP_DONTUSENEWLINE */


+ /* Backend startup time */
+ TimestampTz    StartTime;
+
  /* ----------------------------------------------------------------
   *        decls for routines only used in this file
   * ----------------------------------------------------------------
***************
*** 2217,2222 ****
--- 2220,2228 ----
      sigjmp_buf    local_sigjmp_buf;
      volatile bool send_rfq = true;

+     AbsoluteTime            StartTimeSec;   /* integer part */
+     int                     StartTimeUSec;  /* microsecond part */
+
  #define PendingConfigOption(name,val) \
      (guc_names = lappend(guc_names, pstrdup(name)), \
       guc_values = lappend(guc_values, pstrdup(val)))
***************
*** 2896,2901 ****
--- 2902,2916 ----
          send_rfq = true;        /* initially, or after error */

      /*
+      * Get stand-alone backend startup time
+      */
+     if (!IsUnderPostmaster)
+     {
+         StartTimeSec = GetCurrentAbsoluteTimeUsec(&StartTimeUSec);
+         StartTime = AbsoluteTimeUsecToTimestampTz(StartTimeSec, StartTimeUSec);
+     }
+
+     /*
       * Non-error queries loop here.
       */

*** ./src/backend/utils/adt/timestamp.c.orig    2005-01-20 18:42:00.000000000 -0200
--- ./src/backend/utils/adt/timestamp.c    2005-01-20 16:44:52.000000000 -0200
***************
*** 941,946 ****
--- 941,967 ----
      PG_RETURN_TIMESTAMPTZ(result);
  }

+ Datum
+ pgsql_start_time(PG_FUNCTION_ARGS)
+ {
+     PG_RETURN_TIMESTAMPTZ(StartTime);
+ }
+
+ Datum
+ pgsql_uptime(PG_FUNCTION_ARGS)
+ {
+     TimestampTz    tznow;
+     AbsoluteTime    sec;
+     int        usec;
+
+     sec = GetCurrentTransactionStartTimeUsec(&usec);
+     tznow = AbsoluteTimeUsecToTimestampTz(sec, usec);
+
+     PG_RETURN_DATUM(DirectFunctionCall2(timestamptz_age,
+             TimestampTzGetDatum(tznow),
+             TimestampTzGetDatum(StartTime)));
+ }
+
  void
  dt2time(Timestamp jd, int *hour, int *min, int *sec, fsec_t *fsec)
  {
*** ./src/include/catalog/pg_proc.h.orig    2005-01-20 18:43:28.000000000 -0200
--- ./src/include/catalog/pg_proc.h    2005-01-20 16:44:52.000000000 -0200
***************
*** 3604,3609 ****
--- 3604,3615 ----
  DATA(insert OID = 2556 ( pg_tablespace_databases    PGNSP PGUID 12 f f t t s 1 26 "26" _null_ pg_tablespace_databases
-_null_)); 
  DESCR("returns database oids in a tablespace");

+ /* startuptime/uptime functions */
+ DATA(insert OID = 2557 (  start_time PGNSP PGUID 12 f f t f s 0 1184 "" _null_    pgsql_start_time - _null_ ));
+ DESCR("PostgreSQL start time");
+ DATA(insert OID = 2558 (  uptime PGNSP PGUID 12 f f t f s 0 1186 "" _null_    pgsql_uptime - _null_ ));
+ DESCR("PostgreSQL uptime");
+

  /*
   * Symbolic values for provolatile column: these indicate whether the result
*** ./src/include/utils/timestamp.h.orig    2005-01-20 18:45:58.000000000 -0200
--- ./src/include/utils/timestamp.h    2005-01-20 16:44:52.000000000 -0200
***************
*** 249,254 ****
--- 249,259 ----

  extern Datum now(PG_FUNCTION_ARGS);

+ extern Datum pgsql_start_time(PG_FUNCTION_ARGS);
+ extern Datum pgsql_uptime(PG_FUNCTION_ARGS);
+
+ extern TimestampTz StartTime;
+
  /* Internal routines (not fmgr-callable) */

  extern int    tm2timestamp(struct pg_tm * tm, fsec_t fsec, int *tzp, Timestamp *dt);

pgsql-patches by date:

Previous
From: Neil Conway
Date:
Subject: Re: WIP: pl/pgsql cleanup
Next
From: Neil Conway
Date:
Subject: Re: WIP: pl/pgsql cleanup