diff options
Diffstat (limited to 'src/backend/utils/activity/pgstat_io.c')
-rw-r--r-- | src/backend/utils/activity/pgstat_io.c | 20 |
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] += |