Re: BufFileWrite across MAX_PHYSICAL_FILESIZE boundary

Lists: pgsql-hackers
From: "Kurt Harriman" <kharriman(at)greenplum(dot)com>
To: pgsql-hackers(at)postgresql(dot)org
Subject: BufFileWrite across MAX_PHYSICAL_FILESIZE boundary
Date: 2007-05-07 20:53:12
Message-ID: 463F91B8.8060806@greenplum.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

Just noticed buffile.c:292 doesn't look quite right where
BufFileDumpBuffer calls FileWrite:
bytestowrite = FileWrite(thisfile, file->buffer, bytestowrite);
It looks as though it would write the same data each time the
loop is iterated. Would this be better?
bytestowrite = FileWrite(thisfile, file->buffer + wpos, bytestowrite);


From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: "Kurt Harriman" <kharriman(at)greenplum(dot)com>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: BufFileWrite across MAX_PHYSICAL_FILESIZE boundary
Date: 2007-05-07 21:45:38
Message-ID: 19107.1178574338@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

"Kurt Harriman" <kharriman(at)greenplum(dot)com> writes:
> Just noticed buffile.c:292 doesn't look quite right where
> BufFileDumpBuffer calls FileWrite:
> bytestowrite = FileWrite(thisfile, file->buffer, bytestowrite);
> It looks as though it would write the same data each time the
> loop is iterated. Would this be better?
> bytestowrite = FileWrite(thisfile, file->buffer + wpos, bytestowrite);

Yeah, I think you're right. We've probably not seen this because in
most usages the buffer is always block-aligned, but it looks possible
for tuplestore.c to get out of alignment if its concurrent write/read
feature is exercised just so. Do you want to try demonstrating the bug
with a smaller-than-normal setting of MAX_PHYSICAL_FILESIZE?

regards, tom lane


From: Bruce Momjian <bruce(at)momjian(dot)us>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: Kurt Harriman <kharriman(at)greenplum(dot)com>, pgsql-hackers(at)postgresql(dot)org
Subject: Re: BufFileWrite across MAX_PHYSICAL_FILESIZE boundary
Date: 2007-05-17 01:09:50
Message-ID: 200705170109.l4H19oJ06122@momjian.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers


This has been saved for the 8.4 release:

http://momjian.postgresql.org/cgi-bin/pgpatches_hold

---------------------------------------------------------------------------

Tom Lane wrote:
> "Kurt Harriman" <kharriman(at)greenplum(dot)com> writes:
> > Just noticed buffile.c:292 doesn't look quite right where
> > BufFileDumpBuffer calls FileWrite:
> > bytestowrite = FileWrite(thisfile, file->buffer, bytestowrite);
> > It looks as though it would write the same data each time the
> > loop is iterated. Would this be better?
> > bytestowrite = FileWrite(thisfile, file->buffer + wpos, bytestowrite);
>
> Yeah, I think you're right. We've probably not seen this because in
> most usages the buffer is always block-aligned, but it looks possible
> for tuplestore.c to get out of alignment if its concurrent write/read
> feature is exercised just so. Do you want to try demonstrating the bug
> with a smaller-than-normal setting of MAX_PHYSICAL_FILESIZE?
>
> regards, tom lane
>
> ---------------------------(end of broadcast)---------------------------
> TIP 5: don't forget to increase your free space map settings

--
Bruce Momjian <bruce(at)momjian(dot)us> http://momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +


From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Bruce Momjian <bruce(at)momjian(dot)us>
Cc: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Kurt Harriman <kharriman(at)greenplum(dot)com>, pgsql-hackers(at)postgresql(dot)org
Subject: Re: BufFileWrite across MAX_PHYSICAL_FILESIZE boundary
Date: 2007-05-17 04:25:42
Message-ID: 20070517042541.GQ4582@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

Bruce Momjian wrote:
>
> This has been saved for the 8.4 release:
>
> http://momjian.postgresql.org/cgi-bin/pgpatches_hold

Huh, no, this is a bug and should be fixed right away.

> ---------------------------------------------------------------------------
>
> Tom Lane wrote:
> > "Kurt Harriman" <kharriman(at)greenplum(dot)com> writes:
> > > Just noticed buffile.c:292 doesn't look quite right where
> > > BufFileDumpBuffer calls FileWrite:
> > > bytestowrite = FileWrite(thisfile, file->buffer, bytestowrite);
> > > It looks as though it would write the same data each time the
> > > loop is iterated. Would this be better?
> > > bytestowrite = FileWrite(thisfile, file->buffer + wpos, bytestowrite);
> >
> > Yeah, I think you're right. We've probably not seen this because in
> > most usages the buffer is always block-aligned, but it looks possible
> > for tuplestore.c to get out of alignment if its concurrent write/read
> > feature is exercised just so. Do you want to try demonstrating the bug
> > with a smaller-than-normal setting of MAX_PHYSICAL_FILESIZE?

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.


From: Bruce Momjian <bruce(at)momjian(dot)us>
To: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
Cc: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Kurt Harriman <kharriman(at)greenplum(dot)com>, pgsql-hackers(at)postgresql(dot)org
Subject: Re: BufFileWrite across MAX_PHYSICAL_FILESIZE boundary
Date: 2007-05-17 13:24:07
Message-ID: 200705171324.l4HDO7412086@momjian.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

Alvaro Herrera wrote:
> Bruce Momjian wrote:
> >
> > This has been saved for the 8.4 release:
> >
> > http://momjian.postgresql.org/cgi-bin/pgpatches_hold
>
> Huh, no, this is a bug and should be fixed right away.

OK, moved to the 8.3 patch queue.

---------------------------------------------------------------------------

>
> > ---------------------------------------------------------------------------
> >
> > Tom Lane wrote:
> > > "Kurt Harriman" <kharriman(at)greenplum(dot)com> writes:
> > > > Just noticed buffile.c:292 doesn't look quite right where
> > > > BufFileDumpBuffer calls FileWrite:
> > > > bytestowrite = FileWrite(thisfile, file->buffer, bytestowrite);
> > > > It looks as though it would write the same data each time the
> > > > loop is iterated. Would this be better?
> > > > bytestowrite = FileWrite(thisfile, file->buffer + wpos, bytestowrite);
> > >
> > > Yeah, I think you're right. We've probably not seen this because in
> > > most usages the buffer is always block-aligned, but it looks possible
> > > for tuplestore.c to get out of alignment if its concurrent write/read
> > > feature is exercised just so. Do you want to try demonstrating the bug
> > > with a smaller-than-normal setting of MAX_PHYSICAL_FILESIZE?
>
>
> --
> Alvaro Herrera http://www.CommandPrompt.com/
> The PostgreSQL Company - Command Prompt, Inc.

--
Bruce Momjian <bruce(at)momjian(dot)us> http://momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +


From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: "Kurt Harriman" <kharriman(at)greenplum(dot)com>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: BufFileWrite across MAX_PHYSICAL_FILESIZE boundary
Date: 2007-06-01 23:46:48
Message-ID: 27252.1180741608@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

I wrote:
> "Kurt Harriman" <kharriman(at)greenplum(dot)com> writes:
>> Just noticed buffile.c:292 doesn't look quite right where
>> BufFileDumpBuffer calls FileWrite:
>> bytestowrite = FileWrite(thisfile, file->buffer, bytestowrite);
>> It looks as though it would write the same data each time the
>> loop is iterated. Would this be better?
>> bytestowrite = FileWrite(thisfile, file->buffer + wpos, bytestowrite);

> Yeah, I think you're right.

FYI, I was able to exercise the bug by changing RELSEG_SIZE to 2 within
buffile.c and then running this script in the regression database:

set work_mem = '64kB';
begin;
declare c scroll cursor for select * from tenk1 a join tenk1 b using(two);
fetch 1 from c;
fetch 100 from c;
fetch backward 10 from c;
fetch 100 from c;
fetch backward 10 from c;
fetch 100 from c;
fetch backward 100 from c;
commit;

It doesn't crash with the fix applied. Thanks for spotting it.

regards, tom lane