Thread: XLByte* usage

XLByte* usage

From
Andres Freund
Date:
Hi,

Now that XLRecPtr's are plain 64bit integers what are we supposed to use
in code comparing and manipulating them? There already is plenty example
of both, but I would like new code to go into one direction not two...

I personally find direct comparisons/manipulations far easier to read
than the XLByte* equivalents.

Greetings,

Andres Freund

-- Andres Freund                       http://www.2ndQuadrant.com/PostgreSQL Development, 24x7 Support, Training &
Services



Re: XLByte* usage

From
Heikki Linnakangas
Date:
On 16.12.2012 16:16, Andres Freund wrote:
> Now that XLRecPtr's are plain 64bit integers what are we supposed to use
> in code comparing and manipulating them? There already is plenty example
> of both, but I would like new code to go into one direction not two...
>
> I personally find direct comparisons/manipulations far easier to read
> than the XLByte* equivalents.

I've still used XLByte* macros, but I agree that plain < = > are easier 
to read. +1 for using < = > in new code.

- Heikki



Re: XLByte* usage

From
Pavan Deolasee
Date:
On Mon, Dec 17, 2012 at 2:00 PM, Heikki Linnakangas
<hlinnakangas@vmware.com> wrote:
> On 16.12.2012 16:16, Andres Freund wrote:
>>
>> Now that XLRecPtr's are plain 64bit integers what are we supposed to use
>> in code comparing and manipulating them? There already is plenty example
>> of both, but I would like new code to go into one direction not two...
>>
>> I personally find direct comparisons/manipulations far easier to read
>> than the XLByte* equivalents.
>
>
> I've still used XLByte* macros, but I agree that plain < = > are easier to
> read. +1 for using < = > in new code.
>

Do we ever see us changing this from 64-bit integers to something else
? If so, a macro would be much better.

Thanks,
Pavan

-- 
Pavan Deolasee
http://www.linkedin.com/in/pavandeolasee



Re: XLByte* usage

From
Heikki Linnakangas
Date:
On 17.12.2012 11:04, Pavan Deolasee wrote:
> On Mon, Dec 17, 2012 at 2:00 PM, Heikki Linnakangas
> <hlinnakangas@vmware.com>  wrote:
>> On 16.12.2012 16:16, Andres Freund wrote:
>>>
>>> Now that XLRecPtr's are plain 64bit integers what are we supposed to use
>>> in code comparing and manipulating them? There already is plenty example
>>> of both, but I would like new code to go into one direction not two...
>>>
>>> I personally find direct comparisons/manipulations far easier to read
>>> than the XLByte* equivalents.
>>
>> I've still used XLByte* macros, but I agree that plain<  =>  are easier to
>> read. +1 for using<  =>  in new code.
>
> Do we ever see us changing this from 64-bit integers to something else
> ? If so, a macro would be much better.

I don't see us changing it again any time soon. Maybe in 20 years time 
people will start overflowing 2^64 bytes of WAL generated in the 
lifetime of a database, but I don't think we need to start preparing for 
that yet.

- Heikki



Re: XLByte* usage

From
Tom Lane
Date:
Heikki Linnakangas <hlinnakangas@vmware.com> writes:
> On 17.12.2012 11:04, Pavan Deolasee wrote:
>> On Mon, Dec 17, 2012 at 2:00 PM, Heikki Linnakangas
>> <hlinnakangas@vmware.com>  wrote:
>>> I've still used XLByte* macros, but I agree that plain <=> are easier to
>>> read. +1 for using <=> in new code.

>> Do we ever see us changing this from 64-bit integers to something else
>> ? If so, a macro would be much better.

> I don't see us changing it again any time soon. Maybe in 20 years time 
> people will start overflowing 2^64 bytes of WAL generated in the 
> lifetime of a database, but I don't think we need to start preparing for 
> that yet.

Note that to get to 2^64 in twenty years, an installation would have had
to have generated an average of 29GB of WAL per second, 24x7 for the
entire twenty years, with never a dump-and-reload.  We're still a few
orders of magnitude away from needing to think about this.

But, if the day ever comes when 64 bits doesn't seem like enough, I bet
we'd move to 128-bit integers, which will surely be available on all
platforms by then.  So +1 for using plain comparisons --- in fact, I'd
vote for running around and ripping out the macros altogether.  I had
already been thinking of fixing the places that are still using memset
to initialize XLRecPtrs to "invalid".
        regards, tom lane



Re: XLByte* usage

From
Andres Freund
Date:
On 2012-12-17 12:47:41 -0500, Tom Lane wrote:
> Heikki Linnakangas <hlinnakangas@vmware.com> writes:
> > On 17.12.2012 11:04, Pavan Deolasee wrote:
> >> On Mon, Dec 17, 2012 at 2:00 PM, Heikki Linnakangas
> >> <hlinnakangas@vmware.com>  wrote:
> >>> I've still used XLByte* macros, but I agree that plain <=> are easier to
> >>> read. +1 for using <=> in new code.
>
> >> Do we ever see us changing this from 64-bit integers to something else
> >> ? If so, a macro would be much better.
>
> > I don't see us changing it again any time soon. Maybe in 20 years time
> > people will start overflowing 2^64 bytes of WAL generated in the
> > lifetime of a database, but I don't think we need to start preparing for
> > that yet.
>
> Note that to get to 2^64 in twenty years, an installation would have had
> to have generated an average of 29GB of WAL per second, 24x7 for the
> entire twenty years, with never a dump-and-reload.  We're still a few
> orders of magnitude away from needing to think about this.

Agreed. And it seems achieving such rates would require architectural
changes that would make manually changing all those comparisons the
tiniest problem.

> But, if the day ever comes when 64 bits doesn't seem like enough, I bet
> we'd move to 128-bit integers, which will surely be available on all
> platforms by then.  So +1 for using plain comparisons --- in fact, I'd
> vote for running around and ripping out the macros altogether.  I had
> already been thinking of fixing the places that are still using memset
> to initialize XLRecPtrs to "invalid".

I thought about that and had guessed you would be against it because it
would cause useless diversion of the branches? Otherwise I am all for
it.

Greetings,

Andres Freund

--Andres Freund                       http://www.2ndQuadrant.com/PostgreSQL Development, 24x7 Support, Training &
Services



Re: XLByte* usage

From
Pavan Deolasee
Date:
On Mon, Dec 17, 2012 at 11:17 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> Heikki Linnakangas <hlinnakangas@vmware.com> writes:
>> On 17.12.2012 11:04, Pavan Deolasee wrote:
>>> On Mon, Dec 17, 2012 at 2:00 PM, Heikki Linnakangas
>>> <hlinnakangas@vmware.com>  wrote:
>>>> I've still used XLByte* macros, but I agree that plain <=> are easier to
>>>> read. +1 for using <=> in new code.
>
>>> Do we ever see us changing this from 64-bit integers to something else
>>> ? If so, a macro would be much better.
>
>> I don't see us changing it again any time soon. Maybe in 20 years time
>> people will start overflowing 2^64 bytes of WAL generated in the
>> lifetime of a database, but I don't think we need to start preparing for
>> that yet.
>
> Note that to get to 2^64 in twenty years, an installation would have had
> to have generated an average of 29GB of WAL per second, 24x7 for the
> entire twenty years, with never a dump-and-reload.  We're still a few
> orders of magnitude away from needing to think about this.
>

I probably did not mean increasing that to beyond 64-bit. OTOH I
wondered if we would ever want to steal a few bits from the LSN field,
given the numbers you just put out. But it was more of a question than
objection.

Thanks,
Pavan

-- 
Pavan Deolasee
http://www.linkedin.com/in/pavandeolasee



Re: XLByte* usage

From
Pavan Deolasee
Date:
On Mon, Dec 17, 2012 at 11:26 PM, Pavan Deolasee
<pavan.deolasee@gmail.com> wrote:

>>
>
> I probably did not mean increasing that to beyond 64-bit. OTOH I
> wondered if we would ever want to steal a few bits from the LSN field,
> given the numbers you just put out. But it was more of a question than
> objection.
>

BTW, now that XLogRecPtr is uint64, can't we change the pd_lsn field
to use the same type ? At least the following comment in bufpage.h
looks outdated or at the minimum needs some explanation as why LSN in
the page header needs to split into two 32-bit values.

123 /* for historical reasons, the LSN is stored as two 32-bit values. */
124 typedef struct
125 {
126     uint32      xlogid;         /* high bits */
127     uint32      xrecoff;        /* low bits */
128 } PageXLogRecPtr;


Thanks,
Pavan

-- 
Pavan Deolasee
http://www.linkedin.com/in/pavandeolasee



Re: XLByte* usage

From
Tom Lane
Date:
Andres Freund <andres@2ndquadrant.com> writes:
> On 2012-12-17 12:47:41 -0500, Tom Lane wrote:
>> But, if the day ever comes when 64 bits doesn't seem like enough, I bet
>> we'd move to 128-bit integers, which will surely be available on all
>> platforms by then.  So +1 for using plain comparisons --- in fact, I'd
>> vote for running around and ripping out the macros altogether.  I had
>> already been thinking of fixing the places that are still using memset
>> to initialize XLRecPtrs to "invalid".

> I thought about that and had guessed you would be against it because it
> would cause useless diversion of the branches? Otherwise I am all for
> it.

That's the only argument I can see against doing it --- but Heikki's
patch was already pretty invasive in the same areas this would touch,
so I'm thinking this won't make back-patching much worse.  The
notational simplification seems worth it.
        regards, tom lane



Re: XLByte* usage

From
Andres Freund
Date:
On 2012-12-17 23:45:51 +0530, Pavan Deolasee wrote:
> On Mon, Dec 17, 2012 at 11:26 PM, Pavan Deolasee
> <pavan.deolasee@gmail.com> wrote:
>
> >>
> >
> > I probably did not mean increasing that to beyond 64-bit. OTOH I
> > wondered if we would ever want to steal a few bits from the LSN field,
> > given the numbers you just put out. But it was more of a question than
> > objection.
> >
>
> BTW, now that XLogRecPtr is uint64, can't we change the pd_lsn field
> to use the same type ? At least the following comment in bufpage.h
> looks outdated or at the minimum needs some explanation as why LSN in
> the page header needs to split into two 32-bit values.
>
> 123 /* for historical reasons, the LSN is stored as two 32-bit values. */
> 124 typedef struct
> 125 {
> 126     uint32      xlogid;         /* high bits */
> 127     uint32      xrecoff;        /* low bits */
> 128 } PageXLogRecPtr;

pg_upgrade'ability. The individual bytes aren't necessarily laid out the
same with two such uint32s as with one uint64.

Greetings,

Andres Freund

-- Andres Freund                       http://www.2ndQuadrant.com/PostgreSQL Development, 24x7 Support, Training &
Services



Re: XLByte* usage

From
Tom Lane
Date:
Pavan Deolasee <pavan.deolasee@gmail.com> writes:
> BTW, now that XLogRecPtr is uint64, can't we change the pd_lsn field
> to use the same type ?

No, at least not without breaking on-disk compatibility on little-endian
machines.
        regards, tom lane



Re: XLByte* usage

From
Andres Freund
Date:
On 2012-12-17 13:16:47 -0500, Tom Lane wrote:
> Andres Freund <andres@2ndquadrant.com> writes:
> > On 2012-12-17 12:47:41 -0500, Tom Lane wrote:
> >> But, if the day ever comes when 64 bits doesn't seem like enough, I bet
> >> we'd move to 128-bit integers, which will surely be available on all
> >> platforms by then.  So +1 for using plain comparisons --- in fact, I'd
> >> vote for running around and ripping out the macros altogether.  I had
> >> already been thinking of fixing the places that are still using memset
> >> to initialize XLRecPtrs to "invalid".
>
> > I thought about that and had guessed you would be against it because it
> > would cause useless diversion of the branches? Otherwise I am all for
> > it.
>
> That's the only argument I can see against doing it --- but Heikki's
> patch was already pretty invasive in the same areas this would touch,
> so I'm thinking this won't make back-patching much worse.

I thought a while about this for while and decided its worth trying to
this before the next review round of xlogreader. Even if it causes some
breakage there. Doing it this way round seems less likely to introduce
bugs, especially if somebody else would go round and do this after the
next xlogreader review round but before committing it.

Attached is
1) removal of MemSet(&ptr, 0, sizeof(XLogRecPtr)
2) removal of XLByte(EQ|LT|LE|Advance)
3) removal of the dead NextLogPage I noticed along the way

In 2) unfortunately one has to make decision in which way to simplify
negated XLByte(LT|LE) expressions. I tried to make that choice very
careful and when over every change several times after that, so I hope
there aren't any bad changes, but more eyeballs are needed.

> The notational simplification seems worth it.

After doing this: Definitely. Imo some of the conditions are way much
easier to read now. Perhaps I am just bad in reading negations though...

Greetings,

Andres Freund

--
 Andres Freund                       http://www.2ndQuadrant.com/
 PostgreSQL Development, 24x7 Support, Training & Services

Attachment

Re: XLByte* usage

From
Dimitri Fontaine
Date:
Andres Freund <andres@2ndquadrant.com> writes:
> In 2) unfortunately one has to make decision in which way to simplify
> negated XLByte(LT|LE) expressions. I tried to make that choice very
> careful and when over every change several times after that, so I hope
> there aren't any bad changes, but more eyeballs are needed.

+    if (lsn > PageGetLSN(page))
+    if (lsn >= PageGetLSN(page))
+    if (lsn <= PageGetLSN(page))
+            if (max_lsn < this_lsn)

My only comment here would be that I would like it much better that the
code always use the same operators, and as we read from left to right,
that we pick < and <=.

Regards,
-- 
Dimitri Fontaine
http://2ndQuadrant.fr     PostgreSQL : Expertise, Formation et Support



Re: XLByte* usage

From
Andres Freund
Date:
On 2012-12-18 13:14:10 +0100, Dimitri Fontaine wrote:
> Andres Freund <andres@2ndquadrant.com> writes:
> > In 2) unfortunately one has to make decision in which way to simplify
> > negated XLByte(LT|LE) expressions. I tried to make that choice very
> > careful and when over every change several times after that, so I hope
> > there aren't any bad changes, but more eyeballs are needed.
>
> +    if (lsn > PageGetLSN(page))
> +    if (lsn >= PageGetLSN(page))
> +    if (lsn <= PageGetLSN(page))
> +            if (max_lsn < this_lsn)
>
> My only comment here would be that I would like it much better that the
> code always use the same operators, and as we read from left to right,
> that we pick < and <=.

I did that in most places (check the xlog.c changes), but in this case
it didn't seem to be appropriate because because that would have meant
partially reversing the order of operands which would have looked
confusing as well, given this check is a common patter across nearly
every xlog replay function.
Imo its a good idea trying to choose < or <= as operator but its also
important to keep the order consistent inside a single function/similar
functions.

Greetings,

Andres Freund

--Andres Freund                       http://www.2ndQuadrant.com/PostgreSQL Development, 24x7 Support, Training &
Services



Re: XLByte* usage

From
Alvaro Herrera
Date:
Andres Freund escribió:
> On 2012-12-17 13:16:47 -0500, Tom Lane wrote:
> > Andres Freund <andres@2ndquadrant.com> writes:
> > > On 2012-12-17 12:47:41 -0500, Tom Lane wrote:
> > >> But, if the day ever comes when 64 bits doesn't seem like enough, I bet
> > >> we'd move to 128-bit integers, which will surely be available on all
> > >> platforms by then.  So +1 for using plain comparisons --- in fact, I'd
> > >> vote for running around and ripping out the macros altogether.  I had
> > >> already been thinking of fixing the places that are still using memset
> > >> to initialize XLRecPtrs to "invalid".
> >
> > > I thought about that and had guessed you would be against it because it
> > > would cause useless diversion of the branches? Otherwise I am all for
> > > it.
> >
> > That's the only argument I can see against doing it --- but Heikki's
> > patch was already pretty invasive in the same areas this would touch,
> > so I'm thinking this won't make back-patching much worse.
>
> I thought a while about this for while and decided its worth trying to
> this before the next review round of xlogreader.

I have applied these three patches, after merging for recent changes.
Thanks.

--
Álvaro Herrera                http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services



Re: XLByte* usage

From
Andres Freund
Date:
On 2012-12-28 14:59:50 -0300, Alvaro Herrera wrote:
> Andres Freund escribió:
> > On 2012-12-17 13:16:47 -0500, Tom Lane wrote:
> > > Andres Freund <andres@2ndquadrant.com> writes:
> > > > On 2012-12-17 12:47:41 -0500, Tom Lane wrote:
> > > >> But, if the day ever comes when 64 bits doesn't seem like enough, I bet
> > > >> we'd move to 128-bit integers, which will surely be available on all
> > > >> platforms by then.  So +1 for using plain comparisons --- in fact, I'd
> > > >> vote for running around and ripping out the macros altogether.  I had
> > > >> already been thinking of fixing the places that are still using memset
> > > >> to initialize XLRecPtrs to "invalid".
> > >
> > > > I thought about that and had guessed you would be against it because it
> > > > would cause useless diversion of the branches? Otherwise I am all for
> > > > it.
> > >
> > > That's the only argument I can see against doing it --- but Heikki's
> > > patch was already pretty invasive in the same areas this would touch,
> > > so I'm thinking this won't make back-patching much worse.
> >
> > I thought a while about this for while and decided its worth trying to
> > this before the next review round of xlogreader.
>
> I have applied these three patches, after merging for recent changes.
> Thanks.

Thanks!

Greetings,

Andres Freund

--Andres Freund                       http://www.2ndQuadrant.com/PostgreSQL Development, 24x7 Support, Training &
Services