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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy