mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-03-01 19:45:33 +08:00
Try to ensure that stats collector's receive buffer size is at least 100KB.
Back-patch of commit 8b0b6303e9
.
Discussion: https://postgr.es/m/22173.1494788088@sss.pgh.pa.us
This commit is contained in:
parent
78e4fb8e41
commit
4a3bb96ce9
@ -96,6 +96,9 @@
|
||||
#define PGSTAT_POLL_LOOP_COUNT (PGSTAT_MAX_WAIT_TIME / PGSTAT_RETRY_DELAY)
|
||||
#define PGSTAT_INQ_LOOP_COUNT (PGSTAT_INQ_INTERVAL / PGSTAT_RETRY_DELAY)
|
||||
|
||||
/* Minimum receive buffer size for the collector's socket. */
|
||||
#define PGSTAT_MIN_RCVBUF (100 * 1024)
|
||||
|
||||
|
||||
/* ----------
|
||||
* The initial size hints for the hash tables used in the collector.
|
||||
@ -527,6 +530,35 @@ retry2:
|
||||
goto startup_failed;
|
||||
}
|
||||
|
||||
/*
|
||||
* Try to ensure that the socket's receive buffer is at least
|
||||
* PGSTAT_MIN_RCVBUF bytes, so that it won't easily overflow and lose
|
||||
* data. Use of UDP protocol means that we are willing to lose data under
|
||||
* heavy load, but we don't want it to happen just because of ridiculously
|
||||
* small default buffer sizes (such as 8KB on older Windows versions).
|
||||
*/
|
||||
{
|
||||
int old_rcvbuf;
|
||||
int new_rcvbuf;
|
||||
ACCEPT_TYPE_ARG3 rcvbufsize = sizeof(old_rcvbuf);
|
||||
|
||||
if (getsockopt(pgStatSock, SOL_SOCKET, SO_RCVBUF,
|
||||
(char *) &old_rcvbuf, &rcvbufsize) < 0)
|
||||
{
|
||||
elog(LOG, "getsockopt(SO_RCVBUF) failed: %m");
|
||||
/* if we can't get existing size, always try to set it */
|
||||
old_rcvbuf = 0;
|
||||
}
|
||||
|
||||
new_rcvbuf = PGSTAT_MIN_RCVBUF;
|
||||
if (old_rcvbuf < new_rcvbuf)
|
||||
{
|
||||
if (setsockopt(pgStatSock, SOL_SOCKET, SO_RCVBUF,
|
||||
(char *) &new_rcvbuf, sizeof(new_rcvbuf)) < 0)
|
||||
elog(LOG, "setsockopt(SO_RCVBUF) failed: %m");
|
||||
}
|
||||
}
|
||||
|
||||
pg_freeaddrinfo_all(hints.ai_family, addrs);
|
||||
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user