summaryrefslogtreecommitdiff
path: root/src/backend/utils/activity/pgstat_io.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/activity/pgstat_io.c')
-rw-r--r--src/backend/utils/activity/pgstat_io.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/backend/utils/activity/pgstat_io.c b/src/backend/utils/activity/pgstat_io.c
index b16f57ebeab..78b01310d8b 100644
--- a/src/backend/utils/activity/pgstat_io.c
+++ b/src/backend/utils/activity/pgstat_io.c
@@ -23,6 +23,13 @@
static PgStat_PendingIO PendingIOStats;
static bool have_iostats = false;
+/*
+ * Check if an IOOp is tracked in bytes. This relies on the ordering of IOOp
+ * defined in pgstat.h, so make sure to update this check when changing its
+ * elements.
+ */
+#define pgstat_is_ioop_tracked_in_bytes(io_op) \
+ ((io_op) < IOOP_NUM_TYPES && (io_op) >= IOOP_EXTEND)
/*
* Check that stats have not been counted for any combination of IOObject,
@@ -66,11 +73,13 @@ pgstat_bktype_io_stats_valid(PgStat_BktypeIO *backend_io,
}
void
-pgstat_count_io_op(IOObject io_object, IOContext io_context, IOOp io_op, uint32 cnt)
+pgstat_count_io_op(IOObject io_object, IOContext io_context, IOOp io_op,
+ uint32 cnt, uint64 bytes)
{
Assert((unsigned int) io_object < IOOBJECT_NUM_TYPES);
Assert((unsigned int) io_context < IOCONTEXT_NUM_TYPES);
Assert((unsigned int) io_op < IOOP_NUM_TYPES);
+ Assert(pgstat_is_ioop_tracked_in_bytes(io_op) || bytes == 0);
Assert(pgstat_tracks_io_op(MyBackendType, io_object, io_context, io_op));
if (pgstat_tracks_backend_bktype(MyBackendType))
@@ -79,9 +88,11 @@ pgstat_count_io_op(IOObject io_object, IOContext io_context, IOOp io_op, uint32
entry_ref = pgstat_prep_backend_pending(MyProcNumber);
entry_ref->pending_io.counts[io_object][io_context][io_op] += cnt;
+ entry_ref->pending_io.bytes[io_object][io_context][io_op] += bytes;
}
PendingIOStats.counts[io_object][io_context][io_op] += cnt;
+ PendingIOStats.bytes[io_object][io_context][io_op] += bytes;
have_iostats = true;
}
@@ -114,7 +125,7 @@ pgstat_prepare_io_time(bool track_io_guc)
*/
void
pgstat_count_io_op_time(IOObject io_object, IOContext io_context, IOOp io_op,
- instr_time start_time, uint32 cnt)
+ instr_time start_time, uint32 cnt, uint64 bytes)
{
if (track_io_timing)
{
@@ -153,7 +164,7 @@ pgstat_count_io_op_time(IOObject io_object, IOContext io_context, IOOp io_op,
}
}
- pgstat_count_io_op(io_object, io_context, io_op, cnt);
+ pgstat_count_io_op(io_object, io_context, io_op, cnt, bytes);
}
PgStat_IO *
@@ -219,6 +230,9 @@ pgstat_io_flush_cb(bool nowait)
bktype_shstats->counts[io_object][io_context][io_op] +=
PendingIOStats.counts[io_object][io_context][io_op];
+ bktype_shstats->bytes[io_object][io_context][io_op] +=
+ PendingIOStats.bytes[io_object][io_context][io_op];
+
time = PendingIOStats.pending_times[io_object][io_context][io_op];
bktype_shstats->times[io_object][io_context][io_op] +=