pgstat-coalesce-v3.patch
binary/octet-stream
Filename: pgstat-coalesce-v3.patch
Type: binary/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
Series: patch v3
| File | + | − |
|---|---|---|
| src/backend/postmaster/pgstat.c | 24 | 2 |
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index 1467355..1345e8d 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -4865,13 +4865,13 @@ pgstat_recv_inquiry(PgStat_MsgInquiry *msg, int len)
}
/*
- * There's no request for this DB yet, so create one.
+ * There's no request for this DB yet, so create one. Don't add it to the
+ * list yet - we will check clock skew and the existing db entry first.
*/
newreq = palloc(sizeof(DBWriteRequest));
newreq->databaseid = msg->databaseid;
newreq->request_time = msg->clock_time;
- slist_push_head(&last_statrequests, &newreq->next);
/*
* If the requestor's local clock time is older than stats_timestamp, we
@@ -4908,6 +4908,28 @@ pgstat_recv_inquiry(PgStat_MsgInquiry *msg, int len)
dbentry->stats_timestamp = cur_ts - 1;
}
}
+
+ /*
+ * Ignore requests that are already resolved by the last write.
+ *
+ * We discard the list of requests after writing the stats files, so the
+ * requests that are already waiting on the UDP socket at that moment
+ * won't be discarded in the loop at the beginning of the method. But we
+ * can skip them here, if we found the database entry.
+ *
+ * We newer skip the requests if we detected clock skew, though. In that
+ * case we want to write the files anyway, to get in sync. Simply check
+ * whether we tweaked the request time in the previous block.
+ */
+ if ((dbentry != NULL) && (msg->cutoff_time <= dbentry->stats_timestamp)
+ && (newreq->request_time == msg->clock_time))
+ {
+ pfree(newreq);
+ return;
+ }
+
+ /* The file is stale or there was a clock skew, so request a write. */
+ slist_push_head(&last_statrequests, &newreq->next);
}