Re: Lock Wait Statistics (next commitfest)
От | Jeff Janes |
---|---|
Тема | Re: Lock Wait Statistics (next commitfest) |
Дата | |
Msg-id | f67928030909291802r79501f58y2e93fe469ff34db1@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: Lock Wait Statistics (next commitfest) (Jaime Casanova <jcasanov@systemguards.com.ec>) |
Ответы |
Re: Lock Wait Statistics (next commitfest)
(Mark Kirkwood <markir@paradise.net.nz>)
|
Список | pgsql-hackers |
On Mon, Sep 28, 2009 at 12:14 AM, Jaime Casanova <jcasanov@systemguards.com.ec> wrote: > On Sat, Aug 8, 2009 at 7:47 PM, Mark Kirkwood <markir@paradise.net.nz> wrote: >>>> >>>> >>> Patch with max(wait time). >>> >>> Still TODO >>> >>> - amalgamate individual transaction lock waits >>> - redo (rather ugly) temporary pg_stat_lock_waits in a form more like >>> pg_locks >>> >> This version has the individual transaction lock waits amalgamated. >> >> Still TODO: redo pg_stat_lock_waits ... >> > > it applies with some hunks, compiles fine and seems to work... > i'm still not sure this is what we need, some more comments could be helpful. I'm pretty sure the logic of this patch is not correct. in pgstat_init_lock_wait(LOCKTAG *locktag) ... + l_curr = htabent->l_counts.l_tot_wait_time; + INSTR_TIME_SET_CURRENT(l_start); + INSTR_TIME_ADD(l_curr, l_start); + htabent->l_counts.l_tot_wait_time = l_curr; in pgstat_end_lock_wait(LOCKTAG *locktag) ... + l_start = htabent->l_counts.l_tot_wait_time; + INSTR_TIME_SET_CURRENT(l_end); + INSTR_TIME_SUBTRACT(l_end, l_start); + htabent->l_counts.l_tot_wait_time = l_end; So l_start = time cumulatively waited previously + time at start of this wait. l_end - l_start is equal to: = time at end of this wait - ( time at start of this wait + time cumulatively waited previously) = (time at end of this wait - time at start of this wait) - time cumulatively waited previously = (duration of this wait) - time waited cumulatively previously. That minus sign in the last line can't be good, can it? Also + htabent->l_counts.l_tot_wait_time = l_end; + + if (INSTR_TIME_GET_MICROSEC(l_end) > INSTR_TIME_GET_MICROSEC(htabent->l_counts.l_max_wait_time)) + htabent->l_counts.l_max_wait_time = l_end; The total wait time is equal to the max wait time (which are both equal to l_end)? One or both of those has to end up being wrong. At this stage, is l_end supposed to be the last wait time, or the cumulative wait time? One of the things in the patch review checklist is about compiler warnings, so I am reporting these: lock.c: In function `LockAcquire': lock.c:797: warning: passing arg 1 of `pgstat_init_lock_wait' discards qualifiers from pointer target type lock.c:802: warning: passing arg 1 of `pgstat_end_lock_wait' discards qualifiers from pointer target type Cheers, Jeff
В списке pgsql-hackers по дате отправления: