mirror of
https://github.com/postgres/postgres.git
synced 2025-06-14 18:42:34 +03:00
Create and use wait events for read, write, and fsync operations.
Previous commits, notably53be0b1add
and6f3bd98ebf
, made it possible to see from pg_stat_activity when a backend was stuck waiting for another backend, but it's also fairly common for a backend to be stuck waiting for an I/O. Add wait events for those operations, too. Rushabh Lathia, with further hacking by me. Reviewed and tested by Michael Paquier, Amit Kapila, Rajkumar Raghuwanshi, and Rahila Syed. Discussion: http://postgr.es/m/CAGPqQf0LsYHXREPAZqYGVkDqHSyjf=KsD=k0GTVPAuzyThh-VQ@mail.gmail.com
This commit is contained in:
@ -35,6 +35,7 @@
|
||||
#include "libpq/libpq.h"
|
||||
#include "mb/pg_wchar.h"
|
||||
#include "miscadmin.h"
|
||||
#include "pgstat.h"
|
||||
#include "postmaster/autovacuum.h"
|
||||
#include "postmaster/postmaster.h"
|
||||
#include "storage/fd.h"
|
||||
@ -856,11 +857,13 @@ CreateLockFile(const char *filename, bool amPostmaster,
|
||||
errmsg("could not open lock file \"%s\": %m",
|
||||
filename)));
|
||||
}
|
||||
pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_CREATE_READ);
|
||||
if ((len = read(fd, buffer, sizeof(buffer) - 1)) < 0)
|
||||
ereport(FATAL,
|
||||
(errcode_for_file_access(),
|
||||
errmsg("could not read lock file \"%s\": %m",
|
||||
filename)));
|
||||
pgstat_report_wait_end();
|
||||
close(fd);
|
||||
|
||||
if (len == 0)
|
||||
@ -1009,6 +1012,7 @@ CreateLockFile(const char *filename, bool amPostmaster,
|
||||
strlcat(buffer, "\n", sizeof(buffer));
|
||||
|
||||
errno = 0;
|
||||
pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_CREATE_WRITE);
|
||||
if (write(fd, buffer, strlen(buffer)) != strlen(buffer))
|
||||
{
|
||||
int save_errno = errno;
|
||||
@ -1021,6 +1025,9 @@ CreateLockFile(const char *filename, bool amPostmaster,
|
||||
(errcode_for_file_access(),
|
||||
errmsg("could not write lock file \"%s\": %m", filename)));
|
||||
}
|
||||
pgstat_report_wait_end();
|
||||
|
||||
pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_CREATE_SYNC);
|
||||
if (pg_fsync(fd) != 0)
|
||||
{
|
||||
int save_errno = errno;
|
||||
@ -1032,6 +1039,7 @@ CreateLockFile(const char *filename, bool amPostmaster,
|
||||
(errcode_for_file_access(),
|
||||
errmsg("could not write lock file \"%s\": %m", filename)));
|
||||
}
|
||||
pgstat_report_wait_end();
|
||||
if (close(fd) != 0)
|
||||
{
|
||||
int save_errno = errno;
|
||||
@ -1164,7 +1172,9 @@ AddToDataDirLockFile(int target_line, const char *str)
|
||||
DIRECTORY_LOCK_FILE)));
|
||||
return;
|
||||
}
|
||||
pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ);
|
||||
len = read(fd, srcbuffer, sizeof(srcbuffer) - 1);
|
||||
pgstat_report_wait_end();
|
||||
if (len < 0)
|
||||
{
|
||||
ereport(LOG,
|
||||
@ -1217,9 +1227,11 @@ AddToDataDirLockFile(int target_line, const char *str)
|
||||
*/
|
||||
len = strlen(destbuffer);
|
||||
errno = 0;
|
||||
pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE);
|
||||
if (lseek(fd, (off_t) 0, SEEK_SET) != 0 ||
|
||||
(int) write(fd, destbuffer, len) != len)
|
||||
{
|
||||
pgstat_report_wait_end();
|
||||
/* if write didn't set errno, assume problem is no disk space */
|
||||
if (errno == 0)
|
||||
errno = ENOSPC;
|
||||
@ -1230,6 +1242,8 @@ AddToDataDirLockFile(int target_line, const char *str)
|
||||
close(fd);
|
||||
return;
|
||||
}
|
||||
pgstat_report_wait_end();
|
||||
pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC);
|
||||
if (pg_fsync(fd) != 0)
|
||||
{
|
||||
ereport(LOG,
|
||||
@ -1237,6 +1251,7 @@ AddToDataDirLockFile(int target_line, const char *str)
|
||||
errmsg("could not write to file \"%s\": %m",
|
||||
DIRECTORY_LOCK_FILE)));
|
||||
}
|
||||
pgstat_report_wait_end();
|
||||
if (close(fd) != 0)
|
||||
{
|
||||
ereport(LOG,
|
||||
@ -1293,7 +1308,9 @@ RecheckDataDirLockFile(void)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ);
|
||||
len = read(fd, buffer, sizeof(buffer) - 1);
|
||||
pgstat_report_wait_end();
|
||||
if (len < 0)
|
||||
{
|
||||
ereport(LOG,
|
||||
|
Reference in New Issue
Block a user