PostgreSQL Source Code  git master
pgstat_subscription.c
Go to the documentation of this file.
1 /* -------------------------------------------------------------------------
2  *
3  * pgstat_subscription.c
4  * Implementation of subscription statistics.
5  *
6  * This file contains the implementation of subscription statistics. It is kept
7  * separate from pgstat.c to enforce the line between the statistics access /
8  * storage implementation and the details about individual types of
9  * statistics.
10  *
11  * Copyright (c) 2001-2023, PostgreSQL Global Development Group
12  *
13  * IDENTIFICATION
14  * src/backend/utils/activity/pgstat_subscription.c
15  * -------------------------------------------------------------------------
16  */
17 
18 #include "postgres.h"
19 
20 #include "utils/pgstat_internal.h"
21 
22 
23 /*
24  * Report a subscription error.
25  */
26 void
27 pgstat_report_subscription_error(Oid subid, bool is_apply_error)
28 {
29  PgStat_EntryRef *entry_ref;
30  PgStat_BackendSubEntry *pending;
31 
33  InvalidOid, subid, NULL);
34  pending = entry_ref->pending;
35 
36  if (is_apply_error)
37  pending->apply_error_count++;
38  else
39  pending->sync_error_count++;
40 }
41 
42 /*
43  * Report creating the subscription.
44  */
45 void
47 {
48  /* Ensures that stats are dropped if transaction rolls back */
50  InvalidOid, subid);
51 
52  /* Create and initialize the subscription stats entry */
54  true, NULL);
56 }
57 
58 /*
59  * Report dropping the subscription.
60  *
61  * Ensures that stats are dropped if transaction commits.
62  */
63 void
65 {
67  InvalidOid, subid);
68 }
69 
70 /*
71  * Support function for the SQL-callable pgstat* functions. Returns
72  * the collected statistics for one subscription or NULL.
73  */
76 {
77  return (PgStat_StatSubEntry *)
79 }
80 
81 /*
82  * Flush out pending stats for the entry
83  *
84  * If nowait is true, this function returns false if lock could not
85  * immediately acquired, otherwise true is returned.
86  */
87 bool
89 {
90  PgStat_BackendSubEntry *localent;
91  PgStatShared_Subscription *shsubent;
92 
93  localent = (PgStat_BackendSubEntry *) entry_ref->pending;
94  shsubent = (PgStatShared_Subscription *) entry_ref->shared_stats;
95 
96  /* localent always has non-zero content */
97 
98  if (!pgstat_lock_entry(entry_ref, nowait))
99  return false;
100 
101 #define SUB_ACC(fld) shsubent->stats.fld += localent->fld
102  SUB_ACC(apply_error_count);
103  SUB_ACC(sync_error_count);
104 #undef SUB_ACC
105 
106  pgstat_unlock_entry(entry_ref);
107  return true;
108 }
109 
110 void
112 {
113  ((PgStatShared_Subscription *) header)->stats.stat_reset_timestamp = ts;
114 }
int64 TimestampTz
Definition: timestamp.h:39
static void header(const char *fmt,...) pg_attribute_printf(1
Definition: pg_regress.c:207
void * pgstat_fetch_entry(PgStat_Kind kind, Oid dboid, Oid objoid)
Definition: pgstat.c:779
PgStat_EntryRef * pgstat_prep_pending_entry(PgStat_Kind kind, Oid dboid, Oid objoid, bool *created_entry)
Definition: pgstat.c:1063
@ PGSTAT_KIND_SUBSCRIPTION
Definition: pgstat.h:45
void pgstat_reset_entry(PgStat_Kind kind, Oid dboid, Oid objoid, TimestampTz ts)
Definition: pgstat_shmem.c:929
PgStat_EntryRef * pgstat_get_entry_ref(PgStat_Kind kind, Oid dboid, Oid objoid, bool create, bool *created_entry)
Definition: pgstat_shmem.c:393
void pgstat_unlock_entry(PgStat_EntryRef *entry_ref)
Definition: pgstat_shmem.c:599
bool pgstat_lock_entry(PgStat_EntryRef *entry_ref, bool nowait)
Definition: pgstat_shmem.c:571
void pgstat_drop_subscription(Oid subid)
void pgstat_create_subscription(Oid subid)
PgStat_StatSubEntry * pgstat_fetch_stat_subscription(Oid subid)
void pgstat_report_subscription_error(Oid subid, bool is_apply_error)
#define SUB_ACC(fld)
bool pgstat_subscription_flush_cb(PgStat_EntryRef *entry_ref, bool nowait)
void pgstat_subscription_reset_timestamp_cb(PgStatShared_Common *header, TimestampTz ts)
void pgstat_create_transactional(PgStat_Kind kind, Oid dboid, Oid objoid)
Definition: pgstat_xact.c:358
void pgstat_drop_transactional(PgStat_Kind kind, Oid dboid, Oid objoid)
Definition: pgstat_xact.c:380
#define InvalidOid
Definition: postgres_ext.h:36
unsigned int Oid
Definition: postgres_ext.h:31
PgStat_Counter apply_error_count
Definition: pgstat.h:144
PgStat_Counter sync_error_count
Definition: pgstat.h:145
PgStatShared_Common * shared_stats