]> granicus.if.org Git - postgresql/blobdiff - src/backend/postmaster/pgstat.c
Avoid counting transaction stats for parallel worker cooperating
[postgresql] / src / backend / postmaster / pgstat.c
index d50351547fa488d1ba8766941cbbf6ebf65fc5b1..7c0b24a16fa6b15dcae035677ea2e9ec3154f84e 100644 (file)
@@ -36,6 +36,7 @@
 
 #include "access/heapam.h"
 #include "access/htup_details.h"
+#include "access/tableam.h"
 #include "access/transam.h"
 #include "access/twophase_rmgr.h"
 #include "access/xact.h"
@@ -67,7 +68,6 @@
 #include "utils/rel.h"
 #include "utils/snapmgr.h"
 #include "utils/timestamp.h"
-#include "utils/tqual.h"
 
 
 /* ----------
@@ -335,6 +335,7 @@ static void pgstat_recv_funcstat(PgStat_MsgFuncstat *msg, int len);
 static void pgstat_recv_funcpurge(PgStat_MsgFuncpurge *msg, int len);
 static void pgstat_recv_recoveryconflict(PgStat_MsgRecoveryConflict *msg, int len);
 static void pgstat_recv_deadlock(PgStat_MsgDeadlock *msg, int len);
+static void pgstat_recv_checksum_failure(PgStat_MsgChecksumFailure *msg, int len);
 static void pgstat_recv_tempfile(PgStat_MsgTempFile *msg, int len);
 
 /* ------------------------------------------------------------
@@ -1206,7 +1207,7 @@ pgstat_collect_oids(Oid catalogid, AttrNumber anum_oid)
        HTAB       *htab;
        HASHCTL         hash_ctl;
        Relation        rel;
-       HeapScanDesc scan;
+       TableScanDesc scan;
        HeapTuple       tup;
        Snapshot        snapshot;
 
@@ -1219,9 +1220,9 @@ pgstat_collect_oids(Oid catalogid, AttrNumber anum_oid)
                                           &hash_ctl,
                                           HASH_ELEM | HASH_BLOBS | HASH_CONTEXT);
 
-       rel = heap_open(catalogid, AccessShareLock);
+       rel = table_open(catalogid, AccessShareLock);
        snapshot = RegisterSnapshot(GetLatestSnapshot());
-       scan = heap_beginscan(rel, snapshot, 0, NULL);
+       scan = table_beginscan(rel, snapshot, 0, NULL);
        while ((tup = heap_getnext(scan, ForwardScanDirection)) != NULL)
        {
                Oid                     thisoid;
@@ -1234,9 +1235,9 @@ pgstat_collect_oids(Oid catalogid, AttrNumber anum_oid)
 
                (void) hash_search(htab, (void *) &thisoid, HASH_ENTER, NULL);
        }
-       heap_endscan(scan);
+       table_endscan(scan);
        UnregisterSnapshot(snapshot);
-       heap_close(rel, AccessShareLock);
+       table_close(rel, AccessShareLock);
 
        return htab;
 }
@@ -1519,6 +1520,40 @@ pgstat_report_deadlock(void)
        pgstat_send(&msg, sizeof(msg));
 }
 
+
+
+/* --------
+ * pgstat_report_checksum_failures_in_db(dboid, failure_count) -
+ *
+ *     Tell the collector about one or more checksum failures.
+ * --------
+ */
+void
+pgstat_report_checksum_failures_in_db(Oid dboid, int failurecount)
+{
+       PgStat_MsgChecksumFailure msg;
+
+       if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts)
+               return;
+
+       pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_CHECKSUMFAILURE);
+       msg.m_databaseid = dboid;
+       msg.m_failurecount = failurecount;
+       pgstat_send(&msg, sizeof(msg));
+}
+
+/* --------
+ * pgstat_report_checksum_failure() -
+ *
+ *     Tell the collector about a checksum failure.
+ * --------
+ */
+void
+pgstat_report_checksum_failure(void)
+{
+       pgstat_report_checksum_failures_in_db(MyDatabaseId, 1);
+}
+
 /* --------
  * pgstat_report_tempfile() -
  *
@@ -1582,7 +1617,7 @@ pgstat_send_inquiry(TimestampTz clock_time, TimestampTz cutoff_time, Oid databas
  * Called by the executor before invoking a function.
  */
 void
-pgstat_init_function_usage(FunctionCallInfoData *fcinfo,
+pgstat_init_function_usage(FunctionCallInfo fcinfo,
                                                   PgStat_FunctionCallUsage *fcu)
 {
        PgStat_BackendFunctionEntry *htabent;
@@ -2054,18 +2089,22 @@ pgstat_update_heap_dead_tuples(Relation rel, int delta)
  * ----------
  */
 void
-AtEOXact_PgStat(bool isCommit)
+AtEOXact_PgStat(bool isCommit, bool parallel)
 {
        PgStat_SubXactStatus *xact_state;
 
-       /*
-        * Count transaction commit or abort.  (We use counters, not just bools,
-        * in case the reporting message isn't sent right away.)
-        */
-       if (isCommit)
-               pgStatXactCommit++;
-       else
-               pgStatXactRollback++;
+       /* Don't count parallel worker transaction stats */
+       if (!parallel)
+       {
+               /*
+                * Count transaction commit or abort.  (We use counters, not just
+                * bools, in case the reporting message isn't sent right away.)
+                */
+               if (isCommit)
+                       pgStatXactCommit++;
+               else
+                       pgStatXactRollback++;
+       }
 
        /*
         * Transfer transactional insert/update counts into the base tabstat
@@ -2599,6 +2638,9 @@ static Size BackendActivityBufferSize = 0;
 #ifdef USE_SSL
 static PgBackendSSLStatus *BackendSslStatusBuffer = NULL;
 #endif
+#ifdef ENABLE_GSS
+static PgBackendGSSStatus *BackendGssStatusBuffer = NULL;
+#endif
 
 
 /*
@@ -2731,6 +2773,28 @@ CreateSharedBackendStatus(void)
                }
        }
 #endif
+
+#ifdef ENABLE_GSS
+       /* Create or attach to the shared GSSAPI status buffer */
+       size = mul_size(sizeof(PgBackendGSSStatus), NumBackendStatSlots);
+       BackendGssStatusBuffer = (PgBackendGSSStatus *)
+               ShmemInitStruct("Backend GSS Status Buffer", size, &found);
+
+       if (!found)
+       {
+               PgBackendGSSStatus *ptr;
+
+               MemSet(BackendGssStatusBuffer, 0, size);
+
+               /* Initialize st_gssstatus pointers. */
+               ptr = BackendGssStatusBuffer;
+               for (i = 0; i < NumBackendStatSlots; i++)
+               {
+                       BackendStatusArray[i].st_gssstatus = ptr;
+                       ptr++;
+               }
+       }
+#endif
 }
 
 
@@ -2907,7 +2971,9 @@ pgstat_bestart(void)
                beentry->st_sslstatus->ssl_compression = be_tls_get_compression(MyProcPort);
                strlcpy(beentry->st_sslstatus->ssl_version, be_tls_get_version(MyProcPort), NAMEDATALEN);
                strlcpy(beentry->st_sslstatus->ssl_cipher, be_tls_get_cipher(MyProcPort), NAMEDATALEN);
-               be_tls_get_peerdn_name(MyProcPort, beentry->st_sslstatus->ssl_clientdn, NAMEDATALEN);
+               be_tls_get_peer_subject_name(MyProcPort, beentry->st_sslstatus->ssl_client_dn, NAMEDATALEN);
+               be_tls_get_peer_serial(MyProcPort, beentry->st_sslstatus->ssl_client_serial, NAMEDATALEN);
+               be_tls_get_peer_issuer_name(MyProcPort, beentry->st_sslstatus->ssl_issuer_dn, NAMEDATALEN);
        }
        else
        {
@@ -2916,6 +2982,24 @@ pgstat_bestart(void)
 #else
        beentry->st_ssl = false;
 #endif
+
+#ifdef ENABLE_GSS
+       if (MyProcPort && MyProcPort->gss != NULL)
+       {
+               beentry->st_gss = true;
+               beentry->st_gssstatus->gss_auth = be_gssapi_get_auth(MyProcPort);
+               beentry->st_gssstatus->gss_enc = be_gssapi_get_enc(MyProcPort);
+
+               if (beentry->st_gssstatus->gss_auth)
+                       strlcpy(beentry->st_gssstatus->gss_princ, be_gssapi_get_princ(MyProcPort), NAMEDATALEN);
+       }
+       else
+       {
+               beentry->st_gss = false;
+       }
+#else
+       beentry->st_gss = false;
+#endif
        beentry->st_state = STATE_UNDEFINED;
        beentry->st_appname[0] = '\0';
        beentry->st_activity_raw[0] = '\0';
@@ -3274,7 +3358,7 @@ pgstat_read_current_status(void)
                        localentry->backendStatus.st_procpid = beentry->st_procpid;
                        if (localentry->backendStatus.st_procpid > 0)
                        {
-                               memcpy(&localentry->backendStatus, (char *) beentry, sizeof(PgBackendStatus));
+                               memcpy(&localentry->backendStatus, unvolatize(PgBackendStatus *, beentry), sizeof(PgBackendStatus));
 
                                /*
                                 * strcpy is safe even if the string is modified concurrently,
@@ -3558,6 +3642,9 @@ pgstat_get_wait_client(WaitEventClient w)
                case WAIT_EVENT_WAL_SENDER_WRITE_DATA:
                        event_name = "WalSenderWriteData";
                        break;
+               case WAIT_EVENT_GSS_OPEN_SERVER:
+                       event_name = "GSSOpenServer";
+                       break;
                        /* no default case, so that compiler will warn */
        }
 
@@ -3586,6 +3673,12 @@ pgstat_get_wait_ipc(WaitEventIPC w)
                case WAIT_EVENT_BTREE_PAGE:
                        event_name = "BtreePage";
                        break;
+               case WAIT_EVENT_CHECKPOINT_DONE:
+                       event_name = "CheckpointDone";
+                       break;
+               case WAIT_EVENT_CHECKPOINT_START:
+                       event_name = "CheckpointStart";
+                       break;
                case WAIT_EVENT_CLOG_GROUP_UPDATE:
                        event_name = "ClogGroupUpdate";
                        break;
@@ -3799,7 +3892,7 @@ pgstat_get_wait_io(WaitEventIO w)
                        event_name = "LockFileCreateSync";
                        break;
                case WAIT_EVENT_LOCK_FILE_CREATE_WRITE:
-                       event_name = "LockFileCreateWRITE";
+                       event_name = "LockFileCreateWrite";
                        break;
                case WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ:
                        event_name = "LockFileReCheckDataDirRead";
@@ -4454,6 +4547,10 @@ PgstatCollectorMain(int argc, char *argv[])
                                        pgstat_recv_tempfile((PgStat_MsgTempFile *) &msg, len);
                                        break;
 
+                               case PGSTAT_MTYPE_CHECKSUMFAILURE:
+                                       pgstat_recv_checksum_failure((PgStat_MsgChecksumFailure *) &msg, len);
+                                       break;
+
                                default:
                                        break;
                        }
@@ -4553,6 +4650,7 @@ reset_dbentry_counters(PgStat_StatDBEntry *dbentry)
        dbentry->n_temp_files = 0;
        dbentry->n_temp_bytes = 0;
        dbentry->n_deadlocks = 0;
+       dbentry->n_checksum_failures = 0;
        dbentry->n_block_read_time = 0;
        dbentry->n_block_write_time = 0;
 
@@ -6195,6 +6293,22 @@ pgstat_recv_deadlock(PgStat_MsgDeadlock *msg, int len)
        dbentry->n_deadlocks++;
 }
 
+/* ----------
+ * pgstat_recv_checksum_failure() -
+ *
+ *     Process a CHECKSUMFAILURE message.
+ * ----------
+ */
+static void
+pgstat_recv_checksum_failure(PgStat_MsgChecksumFailure *msg, int len)
+{
+       PgStat_StatDBEntry *dbentry;
+
+       dbentry = pgstat_get_db_entry(msg->m_databaseid, true);
+
+       dbentry->n_checksum_failures += msg->m_failurecount;
+}
+
 /* ----------
  * pgstat_recv_tempfile() -
  *