diff options
Diffstat (limited to 'src/backend/storage/buffer/bufmgr.c')
-rw-r--r-- | src/backend/storage/buffer/bufmgr.c | 66 |
1 files changed, 19 insertions, 47 deletions
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index ef69f21adf4..a12d0c6c27c 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1112,23 +1112,12 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; - - if (track_io_timing) - INSTR_TIME_SET_CURRENT(io_start); + instr_time io_start = pgstat_prepare_io_time(); smgrread(smgr, forkNum, blockNum, bufBlock); - if (track_io_timing) - { - INSTR_TIME_SET_CURRENT(io_time); - INSTR_TIME_SUBTRACT(io_time, io_start); - pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); - INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); - } - - pgstat_count_io_op(io_object, io_context, IOOP_READ); + pgstat_count_io_op_time(io_object, io_context, + IOOP_READ, io_start, 1); /* check for garbage data */ if (!PageIsVerifiedExtended((Page) bufBlock, blockNum, @@ -1837,6 +1826,7 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb, { BlockNumber first_block; IOContext io_context = IOContextForStrategy(strategy); + instr_time io_start; LimitAdditionalPins(&extend_by); @@ -2044,6 +2034,8 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb, } } + io_start = pgstat_prepare_io_time(); + /* * Note: if smgzerorextend fails, we will end up with buffers that are * allocated but not marked BM_VALID. The next relation extension will @@ -2066,6 +2058,9 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb, if (!(flags & EB_SKIP_EXTENSION_LOCK)) UnlockRelationForExtension(eb.rel, ExclusiveLock); + pgstat_count_io_op_time(IOOBJECT_RELATION, io_context, IOOP_EXTEND, + io_start, extend_by); + /* Set BM_VALID, terminate IO, and wake up any waiters */ for (int i = 0; i < extend_by; i++) { @@ -2089,8 +2084,6 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb, } pgBufferUsage.shared_blks_written += extend_by; - pgstat_count_io_op_n(IOOBJECT_RELATION, io_context, IOOP_EXTEND, - extend_by); *extended_by = extend_by; @@ -3344,8 +3337,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln, IOObject io_object, { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start; Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -3420,10 +3412,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln, IOObject io_object, */ bufToWrite = PageSetChecksumCopy((Page) bufBlock, buf->tag.blockNum); - if (track_io_timing) - INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); + io_start = pgstat_prepare_io_time(); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -3452,15 +3441,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln, IOObject io_object, * When a strategy is not in use, the write can only be a "regular" write * of a dirty shared buffer (IOCONTEXT_NORMAL IOOP_WRITE). */ - pgstat_count_io_op(IOOBJECT_RELATION, io_context, IOOP_WRITE); - - if (track_io_timing) - { - INSTR_TIME_SET_CURRENT(io_time); - INSTR_TIME_SUBTRACT(io_time, io_start); - pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); - INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); - } + pgstat_count_io_op_time(IOOBJECT_RELATION, io_context, + IOOP_WRITE, io_start, 1); pgBufferUsage.shared_blks_written++; @@ -4062,14 +4044,13 @@ FlushRelationBuffers(Relation rel) { int i; BufferDesc *bufHdr; - instr_time io_start, - io_time; if (RelationUsesLocalBuffers(rel)) { for (i = 0; i < NLocBuffer; i++) { uint32 buf_state; + instr_time io_start; bufHdr = GetLocalBufferDescriptor(i); if (BufTagMatchesRelFileLocator(&bufHdr->tag, &rel->rd_locator) && @@ -4089,10 +4070,7 @@ FlushRelationBuffers(Relation rel) PageSetChecksumInplace(localpage, bufHdr->tag.blockNum); - if (track_io_timing) - INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); + io_start = pgstat_prepare_io_time(); smgrwrite(RelationGetSmgr(rel), BufTagGetForkNum(&bufHdr->tag), @@ -4100,19 +4078,13 @@ FlushRelationBuffers(Relation rel) localpage, false); + pgstat_count_io_op_time(IOOBJECT_TEMP_RELATION, + IOCONTEXT_NORMAL, IOOP_WRITE, + io_start, 1); + buf_state &= ~(BM_DIRTY | BM_JUST_DIRTIED); pg_atomic_unlocked_write_u32(&bufHdr->state, buf_state); - pgstat_count_io_op(IOOBJECT_TEMP_RELATION, IOCONTEXT_NORMAL, IOOP_WRITE); - - if (track_io_timing) - { - INSTR_TIME_SET_CURRENT(io_time); - INSTR_TIME_SUBTRACT(io_time, io_start); - pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); - INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); - } - pgBufferUsage.local_blks_written++; /* Pop the error context stack */ |