Re: autovacuum daemon stops doing work after about an

From: Larry Rosenman <ler(at)lerctr(dot)org>
To: Vivek Khera <khera(at)kcilink(dot)com>, "Matthew T(dot) O'Connor" <matthew(at)zeut(dot)net>
Cc: pgsql-performance(at)postgresql(dot)org
Subject: Re: autovacuum daemon stops doing work after about an
Date: 2003-12-04 21:25:36
Message-ID: 401840000.1070573136@lerlaptop-red.iadfw.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers pgsql-performance

--On Thursday, December 04, 2003 16:20:22 -0500 Vivek Khera
<khera(at)kcilink(dot)com> wrote:

>>>>>> "MTO" == Matthew T O'Connor <matthew(at)zeut(dot)net> writes:
>
> MTO> Could this be the recently reported bug where time goes backwards on
> MTO> FreeBSD? Can anyone who knows more about this problem chime in, I
> know it MTO> was recently discussed on Hackers.
>
>
> Time does not go backwards -- the now and then variables are properly
> incrementing in time as you see from the debugging output.
>
> The error appears to be with the computation of the "diff". It is
> either a C programming error, or a compiler error. I'm not a C "cop"
> so I can't tell you which it is.
>
> Witness this program, below, compiled as "cc -g -o t t.c" and the
> output here:
>
> % ./t
> seconds = 3509
> seconds1 = 3509000000
> useconds = -452486
> stepped diff = 3508547514
> seconds2 = -785967296
> seconds3 = 3509000000
> diff = -786419782
> long long diff = 3508547514
> %
>
> apperantly, if you compute (now.tv_sec - then.tv_sec) * 1000000 all at
> once, it overflows since the RHS is all computed using longs rather
> than long longs. Fix is to cast at least one of the values to long
> long on the RHS, as in the computation of seconds3 below. compare
> that to the computation of seconds2 and you'll see that this is the
> cause.
>
> I'd be curious to see the output of this program on other platforms
> and other compilers. I'm using gcc 2.95.4 as shipped with FreeBSD
> 4.8+.
this is with the UnixWare compiler:
$ cc -O -o testvk testvk.c
$ ./testvk
seconds = 3509
seconds1 = 3509000000
useconds = -452486
stepped diff = 3508547514
seconds2 = -785967296
seconds3 = 3509000000
diff = -786419782
long long diff = 3508547514
$

I think this is a C bug.

>
> That all being said, you should never sleep less than the base time,
> and never for more than a max amount, perhaps 1 hour?
>
>
> --cut here--
># include <sys/time.h>
># include <stdio.h>
>
> int
> main()
> {
> struct timeval now, then;
> long long diff = 0;
> long long seconds, seconds1, seconds2, seconds3, useconds;
>
> now.tv_sec = 1070565077L;
> now.tv_usec = 216477L;
>
> then.tv_sec = 1070561568L;
> then.tv_usec = 668963L;
>
> seconds = now.tv_sec - then.tv_sec;
> printf("seconds = %lld\n",seconds);
> seconds1 = seconds * 1000000;
> printf("seconds1 = %lld\n",seconds1);
> useconds = now.tv_usec - then.tv_usec;
> printf("useconds = %lld\n",useconds);
>
> diff = seconds1 + useconds;
> printf("stepped diff = %lld\n",diff);
>
> /* this appears to be the culprit... it should be same as seconds1 */
> seconds2 = (now.tv_sec - then.tv_sec) * 1000000;
> printf("seconds2 = %lld\n",seconds2);
>
> /* seems we need to cast long's to long long's for this computation */
> seconds3 = ((long long)now.tv_sec - (long long)then.tv_sec) * 1000000;
> printf("seconds3 = %lld\n",seconds3);
>
>
> diff = (now.tv_sec - then.tv_sec) * 1000000 + (now.tv_usec -
> then.tv_usec); printf ("diff = %lld\n",diff);
>
> diff = ((long long)now.tv_sec - (long long)then.tv_sec) * 1000000 +
> (now.tv_usec - then.tv_usec); printf ("long long diff = %lld\n",diff);
>
> exit(0);
> }
>
>
> --cut here--
>
> ---------------------------(end of broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
> (send "unregister YourEmailAddressHere" to majordomo(at)postgresql(dot)org)
>

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler(at)lerctr(dot)org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Vivek Khera 2003-12-04 21:37:12 Re: autovacuum daemon stops doing work after about an
Previous Message Alvar Freude 2003-12-04 21:24:42 bytea, index and like operator again and detailed report

Browse pgsql-performance by date

  From Date Subject
Next Message Vivek Khera 2003-12-04 21:37:12 Re: autovacuum daemon stops doing work after about an
Previous Message Josh Berkus 2003-12-04 21:24:37 Re: tuning questions