Re: database vacuum from cron hanging

Поиск
Список
Период
Сортировка
От Kevin Grittner
Тема Re: database vacuum from cron hanging
Дата
Msg-id s34cf165.049@gwmta.wicourts.gov
обсуждение исходный текст
Ответ на database vacuum from cron hanging  ("Kevin Grittner" <Kevin.Grittner@wicourts.gov>)
Список pgsql-hackers
Declaring it as volatile gives:
       movb    $1, %al       cmpb    $0,28(%ebx)       jne             1f       lock       xchgb   %al,28(%ebx)
1:       testb   %al, %al       jne     .L228
.L221:       movl    20(%ebx), %eax       incl    %eax       movl    %eax, 20(%ebx)       movw    16(%ebx), %ax
movb   $0, 28(%ebx)       shrl    %eax       andl    $1, %eax       movl    %eax, %edi       movl    PrivateRefCount,
%eax


>>> Tom Lane <tgl@sss.pgh.pa.us> 10/12/05 11:00 AM >>>
"Kevin Grittner" <Kevin.Grittner@wicourts.gov> writes:
> bufmgr.s file coming in separate (off-list) email.

Yup, here is the smoking gun!  This code in PinBuffer
    LockBufHdr_NoHoldoff(buf);    buf->refcount++;    result = (buf->flags & BM_VALID) != 0;
UnlockBufHdr_NoHoldoff(buf);

is translated as
movb    $1, %alcmpb    $0,28(%ebx)    jne    1f        lock            xchgb    %al,28(%ebx)        <-- acquire
spinlock
1: testb    %al, %aljne    .L228            <-- (failure case is out-of-line)
.L221:movl    20(%ebx), %ecx        <-- fetch refcountmovw    16(%ebx), %axincl    %ecx            <-- increment
refcountmovb   $0, 28(%ebx)        <-- release spinlockshrl    %eaxmovl    %ecx, 20(%ebx)        <-- store back
refcountandl   $1, %eaxmovl    %eax, %edi 

For comparison, gcc 4.0.1 on my Fedora machine produces
movb    $1, %alcmpb    $0,28(%ebx)    jne    1f        lock            xchgb    %al,28(%ebx)        <-- acquire
spinlock
1: testb    %al, %aljne    .L117incl    20(%ebx)        <-- increment refcountmovw    16(%ebx), %axmovb    $0, 28(%ebx)
      <-- release spinlockmovl    %eax, %edishrl    %ediandl    $1, %edimovl    PrivateRefCount, %eax 

which is safe.

What we probably need to do is insert some "volatile" qualifiers
to force the compiler to behave better.  What happens to the code
if you change PinBuffer to be declared as

static bool
PinBuffer(volatile BufferDesc *buf)

?
        regards, tom lane



В списке pgsql-hackers по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: database vacuum from cron hanging
Следующее
От: Tom Lane
Дата:
Сообщение: Re: database vacuum from cron hanging