Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit ed15216

Browse files
committed
PGPRO-791: Fix prioritization
1 parent f0ccdf5 commit ed15216

File tree

1 file changed

+28
-33
lines changed

1 file changed

+28
-33
lines changed

src/backend/tcop/priority.c

Lines changed: 28 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,8 @@ calculate_cpu_usage(int32 sleep_prev, int32 sleep_diff)
127127
priority_sum = pg_atomic_read_u32(&PriorityWorkerState->cpu_priority_sum);
128128

129129
if (ru_spent_actual == 0 || spent_sum == 0 || priority_sum == 0 ||
130-
session_interrupt_count == 0 /*||
131-
session_cpu_weight == pg_atomic_read_u32(&PriorityWorkerState->cpu_priority_max)*/)
130+
session_interrupt_count == 0 ||
131+
session_cpu_weight == pg_atomic_read_u32(&PriorityWorkerState->cpu_priority_max))
132132
{
133133
ru_spent_prev = 0;
134134
return 0;
@@ -137,18 +137,19 @@ calculate_cpu_usage(int32 sleep_prev, int32 sleep_diff)
137137
/* Calculate total time to sleep */
138138
ru_spent_need = session_cpu_weight * spent_sum / priority_sum * 1.1;
139139

140-
if (sleep_diff != 0)
140+
if (sleep_diff != 0 && ru_spent_actual != ru_spent_prev)
141141
{
142142
int64 ru_diff,
143+
ru_diff_need,
143144
impact,
144145
res;
145-
float8 factor;
146146

147147
ru_diff = (int64) ru_spent_actual - (int64) ru_spent_prev;
148148
if (ru_diff < 0)
149149
ru_diff *= -1;
150-
factor = (ru_diff != 0) ? (float8) (sleep_diff / ru_diff) : 0;
151-
impact = (int) ((int) (ru_spent_actual - ru_spent_need) * factor);
150+
151+
ru_diff_need = ru_spent_actual - ru_spent_need;
152+
impact = (int64) (ru_diff_need * sleep_diff / ru_diff);
152153

153154
res = sleep_prev + impact;
154155
if (res > PG_INT32_MAX || res < PG_INT32_MIN || res < 0)
@@ -162,18 +163,15 @@ calculate_cpu_usage(int32 sleep_prev, int32 sleep_diff)
162163
sleep_need = (ru_spent_actual > ru_spent_need) ?
163164
sleep_prev * 1.1 : sleep_prev * 0.9;
164165
else
165-
{
166166
sleep_need = (ru_spent_actual > ru_spent_need) ?
167-
(ru_spent_actual - ru_spent_need) : 0;
168-
elog(LOG, UINT64_FORMAT, ru_spent_actual - ru_spent_need);
169-
}
167+
(int32) (ru_spent_actual - ru_spent_need) : 0;
170168
}
171169

172170
ru_spent_prev = ru_spent_actual;
173171

174-
elog(LOG, "- %d - cpu, %d, %d, " UINT64_FORMAT ", " UINT64_FORMAT,
175-
session_cpu_weight, sleep_need, sleep_prev,
176-
ru_spent_actual, ru_spent_need);
172+
// elog(LOG, "- %d - cpu, %d, %d, " UINT64_FORMAT ", " UINT64_FORMAT,
173+
// session_cpu_weight, sleep_need, sleep_prev,
174+
// ru_spent_actual, ru_spent_need);
177175

178176
return sleep_need;
179177
}
@@ -220,19 +218,19 @@ calculate_ioread_usage(int32 sleep_prev, int32 sleep_diff)
220218
/* Calculate total time to sleep */
221219
blks_read_need = session_ioread_weight * read_sum / priority_sum * 1.1;
222220

223-
if (sleep_diff != 0)
221+
if (sleep_diff != 0 && blks_read_actual != blks_read_prev)
224222
{
225223
int64 read_diff,
224+
read_diff_need,
226225
impact,
227226
res;
228-
float8 factor;
229227

230228
read_diff = (int64) blks_read_actual - (int64) blks_read_prev;
231229
if (read_diff < 0)
232230
read_diff *= -1;
233-
factor = (read_diff != 0) ? (float8) (sleep_diff / read_diff) : 0;
234231

235-
impact = (int) ((int) (blks_read_actual - blks_read_need) * factor);
232+
read_diff_need = blks_read_actual - blks_read_need;
233+
impact = (int64) (read_diff_need * sleep_diff / read_diff);
236234

237235
res = sleep_prev + impact;
238236

@@ -247,18 +245,15 @@ calculate_ioread_usage(int32 sleep_prev, int32 sleep_diff)
247245
sleep_need = (blks_read_actual > blks_read_need) ?
248246
sleep_prev * 1.1 : sleep_prev * 0.9;
249247
else
250-
{
251248
sleep_need = (blks_read_actual > blks_read_need) ?
252-
(blks_read_actual - blks_read_need) / 30 : 0;
253-
elog(LOG, UINT64_FORMAT, blks_read_actual - blks_read_need);
254-
}
249+
(int32) (blks_read_actual - blks_read_need) / 30 : 0;
255250
}
256251

257252
blks_read_prev = blks_read_actual;
258253

259-
elog(LOG, "- %d - ioread, %d, %d, " UINT64_FORMAT ", " UINT64_FORMAT,
260-
session_ioread_weight, sleep_need, sleep_prev,
261-
blks_read_actual, blks_read_need);
254+
// elog(LOG, "- %d - ioread, %d, %d, " UINT64_FORMAT ", " UINT64_FORMAT,
255+
// session_ioread_weight, sleep_need, sleep_prev,
256+
// blks_read_actual, blks_read_need);
262257

263258
return sleep_need;
264259
}
@@ -305,19 +300,19 @@ calculate_iowrite_usage(int32 sleep_prev, int32 sleep_diff)
305300
/* Calculate total time to sleep */
306301
blks_write_need = session_iowrite_weight * write_sum / priority_sum * 1.1;
307302

308-
if (sleep_diff != 0)
303+
if (sleep_diff != 0 && blks_write_actual != blks_write_prev)
309304
{
310305
int64 write_diff,
306+
write_diff_need,
311307
impact,
312308
res;
313-
float8 factor;
314309

315310
write_diff = (int64) blks_write_actual - (int64) blks_write_prev;
316311
if (write_diff < 0)
317312
write_diff *= -1;
318-
factor = (write_diff != 0) ? (float8) (sleep_diff / write_diff) : 0;
319313

320-
impact = (int) ((int) (blks_write_actual - blks_write_need) * factor);
314+
write_diff_need = blks_write_actual - blks_write_need;
315+
impact = (int64) (write_diff_need * sleep_diff / write_diff);
321316

322317
res = sleep_prev + impact;
323318

@@ -333,14 +328,14 @@ calculate_iowrite_usage(int32 sleep_prev, int32 sleep_diff)
333328
sleep_prev * 1.1 : sleep_prev * 0.9;
334329
else
335330
sleep_need = (blks_write_actual > blks_write_need) ?
336-
(blks_write_actual - blks_write_need) / 30 : 0;
331+
(int32) (blks_write_actual - blks_write_need) / 10 : 0;
337332
}
338333

339334
blks_write_prev = blks_write_actual;
340335

341-
elog(LOG, "- %d - iowrite, %d, %d, " UINT64_FORMAT ", " UINT64_FORMAT,
342-
session_iowrite_weight, sleep_need, sleep_prev,
343-
blks_write_actual, blks_write_need);
336+
// elog(LOG, "- %d - iowrite, %d, %d, " UINT64_FORMAT ", " UINT64_FORMAT,
337+
// session_iowrite_weight, sleep_need, sleep_prev,
338+
// blks_write_actual, blks_write_need);
344339

345340
return sleep_need;
346341
}
@@ -381,7 +376,7 @@ SessionUsageTimeoutHandler(void)
381376

382377
session_interrupt_count = 0;
383378

384-
/* Re-enable timeout if priorities are enable */
379+
/* Re-enable timeout if prioritization is enabled */
385380
if (usage_tracking_interval && session_usage_timeout_enabled)
386381
enable_timeout_after(SESSION_USAGE_TIMEOUT,
387382
usage_tracking_interval * 1000);

0 commit comments

Comments
 (0)