lwlock, xlog: Report caller wait event for LWLockWaitForVar.
authorAndres Freund <andres@anarazel.de>
Mon, 25 May 2020 10:02:56 +0000 (03:02 -0700)
committerAndres Freund <andres@anarazel.de>
Wed, 24 Jun 2020 23:20:59 +0000 (16:20 -0700)
Author:
Reviewed-By:
Discussion: https://postgr.es/m/
Backpatch:

src/backend/access/transam/xlog.c
src/backend/postmaster/pgstat.c
src/backend/storage/lmgr/lwlock.c
src/include/pgstat.h

index 9628b8110331f7e37da50667ef38da4694f3a99e..4f5575ece715311982063e066b5a51d602014d78 100644 (file)
@@ -1862,14 +1862,17 @@ WaitXLogInsertionsToFinish(XLogRecPtr upto)
             * advertise the insertion point with LWLockUpdateVar before
             * sleeping.
             */
+           pgstat_report_wait_start(WAIT_EVENT_WAL_WAIT_INSERT);
            if (LWLockWaitForVar(&WALInsertLocks[i].l.lock,
                                 &WALInsertLocks[i].l.insertingAt,
                                 insertingat, &insertingat))
            {
                /* the lock was free, so no insertion in progress */
                insertingat = InvalidXLogRecPtr;
+               pgstat_report_wait_end();
                break;
            }
+           pgstat_report_wait_end();
 
            /*
             * This insertion is still in progress. Have to wait, unless the
index e63b81b17dce723a345b59852ceab944ab7aa5ac..ca5ecfa5638cf43acae2fe2034cd258f8981d063 100644 (file)
@@ -4141,6 +4141,9 @@ pgstat_get_wait_io(WaitEventIO w)
        case WAIT_EVENT_WAL_WRITE:
            event_name = "WALWrite";
            break;
+       case WAIT_EVENT_WAL_WAIT_INSERT:
+           event_name = "WALWaitInsert";
+           break;
        case WAIT_EVENT_AIO_SUBMIT:
            event_name = "AIOSubmit";
            break;
index f36e42cb21b47ac378ba1e28fb1a4b2a2513f54d..ce036451c42e30b2aad6e656b8a1b4dc59558969 100644 (file)
@@ -1697,7 +1697,7 @@ LWLockWaitForVar(LWLock *lock, uint64 *valptr, uint64 oldval, uint64 *newval)
        lwstats->block_count++;
 #endif
 
-       LWLockReportWaitStart(lock);
+       /* Don't use LWLockReportWaitStart here, we're not actually waiting for the lock */
        TRACE_POSTGRESQL_LWLOCK_WAIT_START(T_NAME(lock), LW_EXCLUSIVE);
 
        for (;;)
@@ -1718,7 +1718,6 @@ LWLockWaitForVar(LWLock *lock, uint64 *valptr, uint64 oldval, uint64 *newval)
 #endif
 
        TRACE_POSTGRESQL_LWLOCK_WAIT_DONE(T_NAME(lock), LW_EXCLUSIVE);
-       LWLockReportWaitEnd();
 
        LOG_LWDEBUG("LWLockWaitForVar", lock, "awakened");
 
index 4d5dda0ff6d3961a8a31cfa429f9fd428951ee8c..d1ed7ee4df62152e723a2b74791eedb5aafc363d 100644 (file)
@@ -983,6 +983,7 @@ typedef enum
    WAIT_EVENT_WAL_SYNC,
    WAIT_EVENT_WAL_SYNC_METHOD_ASSIGN,
    WAIT_EVENT_WAL_WRITE,
+   WAIT_EVENT_WAL_WAIT_INSERT,
    WAIT_EVENT_AIO_SUBMIT,
    WAIT_EVENT_AIO_IO_COMPLETE_ANY,
    WAIT_EVENT_AIO_IO_COMPLETE_ONE,