mirror of
https://github.com/postgres/postgres.git
synced 2025-07-11 10:01:57 +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:
7
src/backend/utils/cache/relmapper.c
vendored
7
src/backend/utils/cache/relmapper.c
vendored
@ -50,6 +50,7 @@
|
||||
#include "catalog/pg_tablespace.h"
|
||||
#include "catalog/storage.h"
|
||||
#include "miscadmin.h"
|
||||
#include "pgstat.h"
|
||||
#include "storage/fd.h"
|
||||
#include "storage/lwlock.h"
|
||||
#include "utils/inval.h"
|
||||
@ -658,11 +659,13 @@ load_relmap_file(bool shared)
|
||||
* look, the sinval signaling mechanism will make us re-read it before we
|
||||
* are able to access any relation that's affected by the change.
|
||||
*/
|
||||
pgstat_report_wait_start(WAIT_EVENT_RELATION_MAP_READ);
|
||||
if (read(fd, map, sizeof(RelMapFile)) != sizeof(RelMapFile))
|
||||
ereport(FATAL,
|
||||
(errcode_for_file_access(),
|
||||
errmsg("could not read relation mapping file \"%s\": %m",
|
||||
mapfilename)));
|
||||
pgstat_report_wait_end();
|
||||
|
||||
CloseTransientFile(fd);
|
||||
|
||||
@ -774,6 +777,7 @@ write_relmap_file(bool shared, RelMapFile *newmap,
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
pgstat_report_wait_start(WAIT_EVENT_RELATION_MAP_WRITE);
|
||||
if (write(fd, newmap, sizeof(RelMapFile)) != sizeof(RelMapFile))
|
||||
{
|
||||
/* if write didn't set errno, assume problem is no disk space */
|
||||
@ -784,6 +788,7 @@ write_relmap_file(bool shared, RelMapFile *newmap,
|
||||
errmsg("could not write to relation mapping file \"%s\": %m",
|
||||
mapfilename)));
|
||||
}
|
||||
pgstat_report_wait_end();
|
||||
|
||||
/*
|
||||
* We choose to fsync the data to disk before considering the task done.
|
||||
@ -791,11 +796,13 @@ write_relmap_file(bool shared, RelMapFile *newmap,
|
||||
* issue, but it would complicate checkpointing --- see notes for
|
||||
* CheckPointRelationMap.
|
||||
*/
|
||||
pgstat_report_wait_start(WAIT_EVENT_RELATION_MAP_SYNC);
|
||||
if (pg_fsync(fd) != 0)
|
||||
ereport(ERROR,
|
||||
(errcode_for_file_access(),
|
||||
errmsg("could not fsync relation mapping file \"%s\": %m",
|
||||
mapfilename)));
|
||||
pgstat_report_wait_end();
|
||||
|
||||
if (CloseTransientFile(fd))
|
||||
ereport(ERROR,
|
||||
|
Reference in New Issue
Block a user