[pgpool-hackers: 5] Re: Fix error on the lsn math
Guillaume Lelarge
guillaume at lelarge.info
Wed Nov 30 07:04:51 JST 2011
On Tue, 2011-11-29 at 09:47 +0900, Tatsuo Ishii wrote:
> > On Mon, 2011-11-28 at 07:56 +0900, Tatsuo Ishii wrote:
> >> Guillaume,
> >>
> >> About your commit in the subject.
> >>
> >> Before it used 0xff000000 and changed by me according to the
> >> suggestion:
> >>
> >> From: Anton Yuzhaninov
> >> To: pgpool-hackers at pgfoundry.org
> >> Date: Wed, 04 May 2011 19:56:54 +0400
> >>
> >> > I have two questions/suggestions about replication lag check for
> >> > straming replication in pgpool-II.
> >> >
> >> > 1. In text_to_lsn() there is formula
> >> >
> >> > lsn = xlogid * 16 * 1024 * 1024 * 255 + xrecoff;
> >> >
> >> > 16 * 1024 * 1024 * 255 = 4278190080 = 0xff000000
> >> >
> >> > where this magic numbers come from?
> >> >
> >> > I think multiplier should be
> >> > 0xffffffff - XLogSegSize.
> >> >
> >> > In PostgreeSQL source this constant used in
> >> > src/include/access/xlog_internal.h
> >> >
> >> > #define XLogSegsPerFile (((uint32) 0xffffffff) / XLogSegSize)
> >> >
> >> > But in comment noted, that one segment at the end of each log file is
> >> > wasted
> >> >
> >> > Each xlogid corresponds to (XLogSegsPerFile - 1) * XLogSegSize =
> >> > 0xffffffff - XLogSegSize bytes
> >>
> >> I confirmed in the source code and decided to change "16 * 1024 * 1024
> >> * 255 = 4278190080 = 0xff000000" to 0xffffffff. Now you changed it
> >> to original constant. Do you have any point against his argument?
> >
> > To be honest, I didn't know about Anton's point of view. I guess he's
> > wrong. See
> > http://eulerto.blogspot.com/2011/11/understanding-wal-nomenclature.html
> > for details. Many agree that we should use 0xff000000.
>
> I think you are plain wrong.
>
> lsn = xlogid * ((unsigned long long int)0xff000000 - WALSEGMENTSIZE) + xrecoff;
>
> In the blog he said that correct formula should be:
>
> FF000000 * xlog_master + offset_master
>
> Here xlog_master = our xlogid, and offset_master = our xrecoff.
> So correct fomula for us is:
>
> lsn = xlogid * ((unsigned long long int)0xff000000) + xrecoff;
>
> or
>
> lsn = xlogid * ((unsigned long long int)0xffffffff - WALSEGMENTSIZE) + xrecoff;
> (actually that was before you made change. Note that 0xffffffff - WALSEGMENTSIZE = 0xff0000).
>
> In summary you subtracted too much.
You're right. My apologies to you and Anton, I was too quick on this
one. Patch reverted.
--
Guillaume
http://blog.guillaume.lelarge.info
http://www.dalibo.com
More information about the pgpool-hackers
mailing list