Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commite1a7772

Browse files
author
Alexander Korotkov
committed
Implement double buffering.
1 parente5863bc commite1a7772

File tree

3 files changed

+57
-27
lines changed

3 files changed

+57
-27
lines changed

‎contrib/pg_stat_wait/collector.c

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,18 +61,35 @@ AllocHistory(History *observations, int count)
6161
void
6262
ReadCurrentWait(PGPROC*proc,HistoryItem*item)
6363
{
64-
CurrentWaitEvent*wait;
65-
instr_timecurrentTime;
64+
instr_timestartTime,currentTime;
6665

67-
wait=&cur_wait_events[proc->pgprocno];
66+
while (true)
67+
{
68+
CurrentWaitEventWrap*wrap;
69+
CurrentWaitEvent*event;
70+
uint32previdx;
71+
72+
73+
wrap=&cur_wait_events[proc->pgprocno];
74+
previdx=wrap->curidx;
75+
event=&wrap->data[(previdx+1) %2];
76+
77+
pg_read_barrier();
6878

69-
item->backendPid=proc->pid;
70-
item->classid=wait->classid;
71-
item->eventid=wait->eventid;
72-
memcpy(item->params,wait->params,sizeof(item->params));
79+
item->backendPid=proc->pid;
80+
item->classid=event->classeventid >>16;
81+
item->eventid=event->classeventid&0xFFFF;
82+
memcpy(item->params,event->params,sizeof(event->params));
83+
startTime=event->start_time;
84+
85+
pg_read_barrier();
86+
87+
if (wrap->curidx==previdx)
88+
break;
89+
}
7390

7491
INSTR_TIME_SET_CURRENT(currentTime);
75-
INSTR_TIME_SUBTRACT(currentTime,wait->start_time);
92+
INSTR_TIME_SUBTRACT(currentTime,startTime);
7693
item->waitTime=INSTR_TIME_GET_MICROSEC(currentTime);
7794
}
7895

‎contrib/pg_stat_wait/pg_stat_wait.c

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ boolhistorySkipLatch;
2828
shm_toc*toc=NULL;
2929
CollectorShmqHeader*collector_hdr=NULL;
3030
shm_mq*collector_mq=NULL;
31-
CurrentWaitEvent*cur_wait_events=NULL;
31+
CurrentWaitEventWrap*cur_wait_events=NULL;
3232

3333
staticintmaxProcs;
3434

@@ -53,7 +53,7 @@ pgsw_shmem_size(void)
5353

5454
shm_toc_initialize_estimator(&e);
5555

56-
shm_toc_estimate_chunk(&e,sizeof(CurrentWaitEvent)*maxProcs);
56+
shm_toc_estimate_chunk(&e,sizeof(CurrentWaitEventWrap)*maxProcs);
5757
nkeys=1;
5858

5959
if (waitsHistoryOn)
@@ -85,7 +85,7 @@ pgsw_shmem_startup(void)
8585
{
8686
toc=shm_toc_create(PG_STAT_WAIT_MAGIC,pgsw,segsize);
8787

88-
cur_wait_events=shm_toc_allocate(toc,sizeof(CurrentWaitEvent)*maxProcs);
88+
cur_wait_events=shm_toc_allocate(toc,sizeof(CurrentWaitEventWrap)*maxProcs);
8989
shm_toc_insert(toc,0,cur_wait_events);
9090

9191
if (waitsHistoryOn)
@@ -122,22 +122,26 @@ static void
122122
pgsw_wait_event_start_hook(uint32classid,uint32eventid,
123123
uint32p1,uint32p2,uint32p3,uint32p4,uint32p5)
124124
{
125-
CurrentWaitEvent*event;
125+
CurrentWaitEventWrap*wrap;
126+
CurrentWaitEvent*event;
126127

127128
if (!shmem_initialized|| !MyProc)
128129
return;
129130

130-
event=&cur_wait_events[MyProc->pgprocno];
131+
wrap=&cur_wait_events[MyProc->pgprocno];
132+
event=&wrap->data[(wrap->curidx+1) %2];
131133

132-
event->classid=classid;
133-
event->eventid=eventid;
134-
event->params[0]=0;
135-
event->params[1]=0;
136-
event->params[2]=0;
137-
event->params[3]=0;
138-
event->params[4]=0;
134+
event->classeventid= (classid <<16) |eventid;
135+
event->params[0]=p1;
136+
event->params[1]=p2;
137+
event->params[2]=p3;
138+
event->params[3]=p4;
139+
event->params[4]=p5;
139140
INSTR_TIME_SET_CURRENT(event->start_time);
140141

142+
pg_write_barrier();
143+
wrap->curidx++;
144+
141145
if (prev_wait_event_start_hook)
142146
prev_wait_event_start_hook(classid,eventid,p1,p2,p3,p4,p5);
143147
}
@@ -148,22 +152,26 @@ pgsw_wait_event_start_hook(uint32 classid, uint32 eventid,
148152
staticvoid
149153
pgsw_wait_event_stop_hook(void)
150154
{
151-
CurrentWaitEvent*event;
155+
CurrentWaitEventWrap*wrap;
156+
CurrentWaitEvent*event;
152157

153158
if (!shmem_initialized|| !MyProc)
154159
return;
155160

156-
event=&cur_wait_events[MyProc->pgprocno];
161+
wrap=&cur_wait_events[MyProc->pgprocno];
162+
event=&wrap->data[(wrap->curidx+1) %2];
157163

158-
event->classid=WAIT_CPU;
159-
event->eventid=WAIT_CPU_BUSY;
164+
event->classeventid= (WAIT_CPU <<16) |WAIT_CPU_BUSY;
160165
event->params[0]=0;
161166
event->params[1]=0;
162167
event->params[2]=0;
163168
event->params[3]=0;
164169
event->params[4]=0;
165170
INSTR_TIME_SET_CURRENT(event->start_time);
166171

172+
pg_write_barrier();
173+
wrap->curidx++;
174+
167175
if (prev_wait_event_stop_hook)
168176
prev_wait_event_stop_hook();
169177
}

‎contrib/pg_stat_wait/pg_stat_wait.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,17 @@
1515

1616
typedefstruct
1717
{
18-
uint32classid;
19-
uint32eventid;
18+
uint32classeventid;
2019
uint32params[WAIT_PARAMS_COUNT];
2120
instr_timestart_time;
2221
}CurrentWaitEvent;
2322

23+
typedefstruct
24+
{
25+
uint32curidx;
26+
CurrentWaitEventdata[2];
27+
}CurrentWaitEventWrap;
28+
2429
typedefstruct
2530
{
2631
uint32backendPid;
@@ -79,7 +84,7 @@ typedef struct
7984
/* pg_stat_wait.c */
8085
externvoidcheck_shmem(void);
8186
externCollectorShmqHeader*collector_hdr;
82-
externCurrentWaitEvent*cur_wait_events;
87+
externCurrentWaitEventWrap*cur_wait_events;
8388
externshm_mq*collector_mq;
8489
externinthistorySize;
8590
externinthistoryPeriod;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp