Skip to content

Commit 452ab23

Browse files
committed
Refactor LWLocks and pg_stat_activity new field
1 parent 0e42397 commit 452ab23

File tree

29 files changed

+631
-218
lines changed

29 files changed

+631
-218
lines changed

doc/src/sgml/monitoring.sgml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,11 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser
629629
<entry><type>boolean</></entry>
630630
<entry>True if this backend is currently waiting on a lock</entry>
631631
</row>
632+
<row>
633+
<entry><structfield>wait_event</></entry>
634+
<entry><type>text</></entry>
635+
<entry>Name of a current wait event in backend</entry>
636+
</row>
632637
<row>
633638
<entry><structfield>state</></entry>
634639
<entry><type>text</></entry>

src/backend/access/transam/clog.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,8 @@ CLOGShmemInit(void)
457457
{
458458
ClogCtl->PagePrecedes = CLOGPagePrecedes;
459459
SimpleLruInit(ClogCtl, "CLOG Ctl", CLOGShmemBuffers(), CLOG_LSNS_PER_PAGE,
460-
CLogControlLock, "pg_clog");
460+
CLogControlLock, "pg_clog",
461+
"CLogBufferLocks");
461462
}
462463

463464
/*

src/backend/access/transam/commit_ts.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,8 @@ CommitTsShmemInit(void)
466466

467467
CommitTsCtl->PagePrecedes = CommitTsPagePrecedes;
468468
SimpleLruInit(CommitTsCtl, "CommitTs Ctl", CommitTsShmemBuffers(), 0,
469-
CommitTsControlLock, "pg_commit_ts");
469+
CommitTsControlLock, "pg_commit_ts",
470+
"CommitTSBufferLocks");
470471

471472
commitTsShared = ShmemInitStruct("CommitTs shared",
472473
sizeof(CommitTimestampShared),

src/backend/access/transam/multixact.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1842,10 +1842,12 @@ MultiXactShmemInit(void)
18421842

18431843
SimpleLruInit(MultiXactOffsetCtl,
18441844
"MultiXactOffset Ctl", NUM_MXACTOFFSET_BUFFERS, 0,
1845-
MultiXactOffsetControlLock, "pg_multixact/offsets");
1845+
MultiXactOffsetControlLock, "pg_multixact/offsets",
1846+
"MultiXactOffsetBufferLocks");
18461847
SimpleLruInit(MultiXactMemberCtl,
18471848
"MultiXactMember Ctl", NUM_MXACTMEMBER_BUFFERS, 0,
1848-
MultiXactMemberControlLock, "pg_multixact/members");
1849+
MultiXactMemberControlLock, "pg_multixact/members",
1850+
"MultiXactMemberBufferLocks");
18491851

18501852
/* Initialize our shared state struct */
18511853
MultiXactState = ShmemInitStruct("Shared MultiXact State",

src/backend/access/transam/slru.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,15 +156,20 @@ SimpleLruShmemSize(int nslots, int nlsns)
156156
if (nlsns > 0)
157157
sz += MAXALIGN(nslots * nlsns * sizeof(XLogRecPtr)); /* group_lsn[] */
158158

159+
/* size of lwlocks */
160+
sz = add_size(sz, LWLockTrancheShmemSize(nslots));
161+
159162
return BUFFERALIGN(sz) + BLCKSZ * nslots;
160163
}
161164

162165
void
163166
SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns,
164-
LWLock *ctllock, const char *subdir)
167+
LWLock *ctllock, const char *subdir,
168+
const char *lwlocks_tranche)
165169
{
166-
SlruShared shared;
167-
bool found;
170+
SlruShared shared;
171+
bool found;
172+
LWLockPadded *lwlock_array;
168173

169174
shared = (SlruShared) ShmemInitStruct(name,
170175
SimpleLruShmemSize(nslots, nlsns),
@@ -212,13 +217,18 @@ SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns,
212217
}
213218

214219
ptr += BUFFERALIGN(offset);
220+
221+
/* Create tranche and lwlocks required for slots */
222+
LWLockCreateTranche(lwlocks_tranche, nslots, &lwlock_array);
223+
224+
/* Initialize slots */
215225
for (slotno = 0; slotno < nslots; slotno++)
216226
{
217227
shared->page_buffer[slotno] = ptr;
218228
shared->page_status[slotno] = SLRU_PAGE_EMPTY;
219229
shared->page_dirty[slotno] = false;
220230
shared->page_lru_count[slotno] = 0;
221-
shared->buffer_locks[slotno] = LWLockAssign();
231+
shared->buffer_locks[slotno] = &lwlock_array[slotno].lock;
222232
ptr += BLCKSZ;
223233
}
224234
}

src/backend/access/transam/subtrans.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,8 @@ SUBTRANSShmemInit(void)
179179
{
180180
SubTransCtl->PagePrecedes = SubTransPagePrecedes;
181181
SimpleLruInit(SubTransCtl, "SUBTRANS Ctl", NUM_SUBTRANS_BUFFERS, 0,
182-
SubtransControlLock, "pg_subtrans");
182+
SubtransControlLock, "pg_subtrans",
183+
"SubtransBufferLocks");
183184
/* Override default assumption that writes should be fsync'd */
184185
SubTransCtl->do_fsync = false;
185186
}

src/backend/access/transam/xlog.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4679,11 +4679,12 @@ XLOGShmemInit(void)
46794679

46804680
XLogCtl->Insert.WALInsertLockTrancheId = LWLockNewTrancheId();
46814681

4682-
XLogCtl->Insert.WALInsertLockTranche.name = "WALInsertLocks";
4682+
strcpy(XLogCtl->Insert.WALInsertLockTranche.name, "WALInsertLocks");
46834683
XLogCtl->Insert.WALInsertLockTranche.array_base = WALInsertLocks;
46844684
XLogCtl->Insert.WALInsertLockTranche.array_stride = sizeof(WALInsertLockPadded);
46854685

4686-
LWLockRegisterTranche(XLogCtl->Insert.WALInsertLockTrancheId, &XLogCtl->Insert.WALInsertLockTranche);
4686+
LWLockRegisterTranche(XLogCtl->Insert.WALInsertLockTrancheId,
4687+
&XLogCtl->Insert.WALInsertLockTranche);
46874688
for (i = 0; i < NUM_XLOGINSERT_LOCKS; i++)
46884689
{
46894690
LWLockInitialize(&WALInsertLocks[i].l.lock,

src/backend/catalog/system_views.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -623,6 +623,7 @@ CREATE VIEW pg_stat_activity AS
623623
S.query_start,
624624
S.state_change,
625625
S.waiting,
626+
S.wait_event,
626627
S.state,
627628
S.backend_xid,
628629
s.backend_xmin,

src/backend/commands/async.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ AsyncShmemInit(void)
469469
*/
470470
AsyncCtl->PagePrecedes = asyncQueuePagePrecedes;
471471
SimpleLruInit(AsyncCtl, "Async Ctl", NUM_ASYNC_BUFFERS, 0,
472-
AsyncCtlLock, "pg_notify");
472+
AsyncCtlLock, "pg_notify", "AsyncBufferLocks");
473473
/* Override default assumption that writes should be fsync'd */
474474
AsyncCtl->do_fsync = false;
475475

src/backend/libpq/be-secure.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include "tcop/tcopprot.h"
3737
#include "utils/memutils.h"
3838
#include "storage/proc.h"
39+
#include "pgstat.h"
3940

4041

4142
char *ssl_cert_file;
@@ -122,6 +123,8 @@ secure_read(Port *port, void *ptr, size_t len)
122123
ssize_t n;
123124
int waitfor;
124125

126+
pgstat_report_wait_start(WAIT_NETWORK, WAIT_NETWORK_READ);
127+
125128
retry:
126129
#ifdef USE_SSL
127130
waitfor = 0;
@@ -168,6 +171,7 @@ secure_read(Port *port, void *ptr, size_t len)
168171
* interrupts from being processed.
169172
*/
170173
ProcessClientReadInterrupt(false);
174+
pgstat_report_wait_end();
171175

172176
return n;
173177
}
@@ -202,6 +206,8 @@ secure_write(Port *port, void *ptr, size_t len)
202206
ssize_t n;
203207
int waitfor;
204208

209+
pgstat_report_wait_start(WAIT_NETWORK, WAIT_NETWORK_WRITE);
210+
205211
retry:
206212
waitfor = 0;
207213
#ifdef USE_SSL
@@ -247,6 +253,7 @@ secure_write(Port *port, void *ptr, size_t len)
247253
* interrupts from being processed.
248254
*/
249255
ProcessClientWriteInterrupt(false);
256+
pgstat_report_wait_end();
250257

251258
return n;
252259
}

0 commit comments

Comments
 (0)