Re: Extra XLOG in Checkpoint for StandbySnapshot

Lists: pgsql-hackers
From: Simon Riggs <simon(at)2ndQuadrant(dot)com>
To: Amit Kapila <amit(dot)kapila(at)huawei(dot)com>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: Extra XLOG in Checkpoint for StandbySnapshot
Date: 2013-01-07 13:00:03
Message-ID: CA+U5nMJLn1S72bC+B6B7fNV0a5=g+Cjj0g5AOCjnGoCBBBgLAA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

On 7 January 2013 12:39, Amit Kapila <amit(dot)kapila(at)huawei(dot)com> wrote:

> So We can modify to change this in function LogStandbySnapshot as below:
> running = GetRunningTransactionData();
> if (running->xcnt > 0)
> LogCurrentRunningXacts(running);
>
> So this check will make sure that if there is no operation happening i.e. no
> new running transaction, then no need to log running transaction snapshot
> and hence further checkpoint operations will be skipped.
>
> Let me know if I am missing something?

It's not the same test. The fact that nothing is running at that
moment is not the same thing as saying nothing at all has run since
last checkpoint.

If we skip the WAL record in the way you suggest, we'd be unable to
start quickly in some cases.

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


From: Amit Kapila <amit(dot)kapila(at)huawei(dot)com>
To: "'Simon Riggs'" <simon(at)2ndQuadrant(dot)com>
Cc: <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Extra XLOG in Checkpoint for StandbySnapshot
Date: 2013-01-07 13:33:35
Message-ID: 002601cdecdb$989c3760$c9d4a620$@kapila@huawei.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

On Monday, January 07, 2013 6:30 PM Simon Riggs wrote:
> On 7 January 2013 12:39, Amit Kapila <amit(dot)kapila(at)huawei(dot)com> wrote:
>
> > So We can modify to change this in function LogStandbySnapshot as
> below:
> > running = GetRunningTransactionData();
> > if (running->xcnt > 0)
> > LogCurrentRunningXacts(running);
> >
> > So this check will make sure that if there is no operation happening
> i.e. no
> > new running transaction, then no need to log running transaction
> snapshot
> > and hence further checkpoint operations will be skipped.
> >
> > Let me know if I am missing something?
>
> It's not the same test. The fact that nothing is running at that
> moment is not the same thing as saying nothing at all has run since
> last checkpoint.

But isn't the functionality of LogStandbySnapshot() is to log "all running
xids" and "all current
AccessExclusiveLocks". For RunningTransactionLocks, WAL is avoided in
similar way.

> If we skip the WAL record in the way you suggest, we'd be unable to
> start quickly in some cases.

If there are any operations happened which have generated WAL, then on next
checkpoint interval the checkpoint operation should happen.
Which cases will it not able to start quickly?

With Regards,
Amit Kapila


From: Simon Riggs <simon(at)2ndQuadrant(dot)com>
To: Amit Kapila <amit(dot)kapila(at)huawei(dot)com>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: Extra XLOG in Checkpoint for StandbySnapshot
Date: 2013-01-07 13:44:41
Message-ID: CA+U5nMK_5LAvqQRnwj6Q_4Oo52jCSkR=CZ_JS4=AJaRgvaCOmw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

On 7 January 2013 13:33, Amit Kapila <amit(dot)kapila(at)huawei(dot)com> wrote:

>> If we skip the WAL record in the way you suggest, we'd be unable to
>> start quickly in some cases.
>
> If there are any operations happened which have generated WAL, then on next
> checkpoint interval the checkpoint operation should happen.
> Which cases will it not able to start quickly?

The case where we do lots of work but momentarily we weren't doing
anything when we took the snapshot.

The absence of write transactions at one specific moment gives no
indication of behaviour at other points across the whole checkpoint
period.

If you make the correct test, I'd be more inclined to accept the premise.

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


From: Andres Freund <andres(at)anarazel(dot)de>
To: Amit Kapila <amit(dot)kapila(at)huawei(dot)com>
Cc: 'Simon Riggs' <simon(at)2ndQuadrant(dot)com>, pgsql-hackers(at)postgresql(dot)org
Subject: Re: Extra XLOG in Checkpoint for StandbySnapshot
Date: 2013-01-07 13:44:47
Message-ID: 20130107134446.GC5301@awork2.anarazel.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

On 2013-01-07 19:03:35 +0530, Amit Kapila wrote:
> On Monday, January 07, 2013 6:30 PM Simon Riggs wrote:
> > On 7 January 2013 12:39, Amit Kapila <amit(dot)kapila(at)huawei(dot)com> wrote:
> >
> > > So We can modify to change this in function LogStandbySnapshot as
> > below:
> > > running = GetRunningTransactionData();
> > > if (running->xcnt > 0)
> > > LogCurrentRunningXacts(running);
> > >
> > > So this check will make sure that if there is no operation happening
> > i.e. no
> > > new running transaction, then no need to log running transaction
> > snapshot
> > > and hence further checkpoint operations will be skipped.
> > >
> > > Let me know if I am missing something?
> >
> > It's not the same test. The fact that nothing is running at that
> > moment is not the same thing as saying nothing at all has run since
> > last checkpoint.
>
> But isn't the functionality of LogStandbySnapshot() is to log "all running
> xids" and "all current
> AccessExclusiveLocks". For RunningTransactionLocks, WAL is avoided in
> similar way.

The information that no transactions are currently running allows you to
build a recovery snapshot, without that information the standby won't
start answering queries. Now that doesn't matter if all standbys already
have built a snapshot, but the primary cannot know that.
Having to issue a checkpoint while ensuring transactions are running
just to get a standby up doesn't seem like a good idea to me :)

Greetings,

Andres Freund


From: Amit Kapila <amit(dot)kapila(at)huawei(dot)com>
To: "'Andres Freund'" <andres(at)anarazel(dot)de>, "'Simon Riggs'" <simon(at)2ndQuadrant(dot)com>
Cc: <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Extra XLOG in Checkpoint for StandbySnapshot
Date: 2013-01-08 14:21:39
Message-ID: 006801cdedab$7a01c7e0$6e0557a0$@kapila@huawei.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

On Monday, January 07, 2013 7:15 PM Andres Freund wrote:
> On 2013-01-07 19:03:35 +0530, Amit Kapila wrote:
> > On Monday, January 07, 2013 6:30 PM Simon Riggs wrote:
> > > On 7 January 2013 12:39, Amit Kapila <amit(dot)kapila(at)huawei(dot)com>
> wrote:
> > >
> > > > So We can modify to change this in function LogStandbySnapshot as
> > > below:
> > > > running = GetRunningTransactionData();
> > > > if (running->xcnt > 0)
> > > > LogCurrentRunningXacts(running);
> > > >
> > > > So this check will make sure that if there is no operation
> happening
> > > i.e. no
> > > > new running transaction, then no need to log running transaction
> > > snapshot
> > > > and hence further checkpoint operations will be skipped.
> > > >
> > > > Let me know if I am missing something?
> > >
> > > It's not the same test. The fact that nothing is running at that
> > > moment is not the same thing as saying nothing at all has run since
> > > last checkpoint.
> >
> > But isn't the functionality of LogStandbySnapshot() is to log "all
> running
> > xids" and "all current
> > AccessExclusiveLocks". For RunningTransactionLocks, WAL is avoided in
> > similar way.
>
> The information that no transactions are currently running allows you
> to
> build a recovery snapshot, without that information the standby won't
> start answering queries. Now that doesn't matter if all standbys
> already
> have built a snapshot, but the primary cannot know that.

Can't we make sure that checkpoint operation doesn't happen for below conds.
a. nothing has happened during or after last checkpoint
OR
b. nothing except snapshotstanby WAL has happened

Currently it is done for point a.

> Having to issue a checkpoint while ensuring transactions are running
> just to get a standby up doesn't seem like a good idea to me :)

Simon:
> If you make the correct test, I'd be more inclined to accept the premise.

Not sure, what exact you are expecting from test?
The test is do any one operation on system and then keep the system idle.
Now at each checkpoint interval, it logs WAL for SnapshotStandby.

With Regards,
Amit Kapila.


From: Andres Freund <andres(at)2ndquadrant(dot)com>
To: Amit Kapila <amit(dot)kapila(at)huawei(dot)com>
Cc: 'Simon Riggs' <simon(at)2ndQuadrant(dot)com>, pgsql-hackers(at)postgresql(dot)org
Subject: Re: Extra XLOG in Checkpoint for StandbySnapshot
Date: 2013-01-08 14:31:14
Message-ID: 20130108143113.GB5137@awork2.anarazel.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

On 2013-01-08 19:51:39 +0530, Amit Kapila wrote:
> On Monday, January 07, 2013 7:15 PM Andres Freund wrote:
> > On 2013-01-07 19:03:35 +0530, Amit Kapila wrote:
> > > On Monday, January 07, 2013 6:30 PM Simon Riggs wrote:
> > > > On 7 January 2013 12:39, Amit Kapila <amit(dot)kapila(at)huawei(dot)com>
> > wrote:
> > > >
> > > > > So We can modify to change this in function LogStandbySnapshot as
> > > > below:
> > > > > running = GetRunningTransactionData();
> > > > > if (running->xcnt > 0)
> > > > > LogCurrentRunningXacts(running);
> > > > >
> > > > > So this check will make sure that if there is no operation
> > happening
> > > > i.e. no
> > > > > new running transaction, then no need to log running transaction
> > > > snapshot
> > > > > and hence further checkpoint operations will be skipped.
> > > > >
> > > > > Let me know if I am missing something?
> > > >
> > > > It's not the same test. The fact that nothing is running at that
> > > > moment is not the same thing as saying nothing at all has run since
> > > > last checkpoint.
> > >
> > > But isn't the functionality of LogStandbySnapshot() is to log "all
> > running
> > > xids" and "all current
> > > AccessExclusiveLocks". For RunningTransactionLocks, WAL is avoided in
> > > similar way.
> >
> > The information that no transactions are currently running allows you
> > to
> > build a recovery snapshot, without that information the standby won't
> > start answering queries. Now that doesn't matter if all standbys
> > already
> > have built a snapshot, but the primary cannot know that.
>
> Can't we make sure that checkpoint operation doesn't happen for below conds.
> a. nothing has happened during or after last checkpoint
> OR
> b. nothing except snapshotstanby WAL has happened
>
> Currently it is done for point a.
>
> > Having to issue a checkpoint while ensuring transactions are running
> > just to get a standby up doesn't seem like a good idea to me :)
>
> Simon:
> > If you make the correct test, I'd be more inclined to accept the premise.
>
> Not sure, what exact you are expecting from test?
> The test is do any one operation on system and then keep the system idle.
> Now at each checkpoint interval, it logs WAL for SnapshotStandby.

I can't really follow what you want to do here. The snapshot is only
logged if a checkpoint is performed anyway? As recovery starts at (the
logical) checkpoint's location we need to log a snapshot exactly
there. If you want to avoid activity when the system is idle you need to
prevent checkpoints from occurring itself. There was a thread some time
back about that and its not as trivial as it seems at the first glance.

Greetings,

Andres Freund

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


From: Amit Kapila <amit(dot)kapila(at)huawei(dot)com>
To: "'Andres Freund'" <andres(at)2ndquadrant(dot)com>
Cc: "'Simon Riggs'" <simon(at)2ndQuadrant(dot)com>, <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Extra XLOG in Checkpoint for StandbySnapshot
Date: 2013-01-08 15:03:28
Message-ID: 006f01cdedb1$51bbd130$f5337390$@kapila@huawei.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

On Tuesday, January 08, 2013 8:01 PM Andres Freund wrote:
> On 2013-01-08 19:51:39 +0530, Amit Kapila wrote:
> > On Monday, January 07, 2013 7:15 PM Andres Freund wrote:
> > > On 2013-01-07 19:03:35 +0530, Amit Kapila wrote:
> > > > On Monday, January 07, 2013 6:30 PM Simon Riggs wrote:
> > > > > On 7 January 2013 12:39, Amit Kapila <amit(dot)kapila(at)huawei(dot)com>
> > > wrote:
> > > > >
> > > > > > So We can modify to change this in function
> LogStandbySnapshot as
> > > > > below:
> > > > > > running = GetRunningTransactionData();
> > > > > > if (running->xcnt > 0)
> > > > > > LogCurrentRunningXacts(running);
> > > > > >
> > > > > > So this check will make sure that if there is no operation
> > > happening
> > > > > i.e. no
> > > > > > new running transaction, then no need to log running
> transaction
> > > > > snapshot
> > > > > > and hence further checkpoint operations will be skipped.
> > > > > >
> > > > > > Let me know if I am missing something?
> > > > >
> > > > > It's not the same test. The fact that nothing is running at
> that
> > > > > moment is not the same thing as saying nothing at all has run
> since
> > > > > last checkpoint.
> > > >
> > > > But isn't the functionality of LogStandbySnapshot() is to log
> "all
> > > running
> > > > xids" and "all current
> > > > AccessExclusiveLocks". For RunningTransactionLocks, WAL is
> avoided in
> > > > similar way.
> > >
> > > The information that no transactions are currently running allows
> you
> > > to
> > > build a recovery snapshot, without that information the standby
> won't
> > > start answering queries. Now that doesn't matter if all standbys
> > > already
> > > have built a snapshot, but the primary cannot know that.
> >
> > Can't we make sure that checkpoint operation doesn't happen for below
> conds.
> > a. nothing has happened during or after last checkpoint
> > OR
> > b. nothing except snapshotstanby WAL has happened
> >
> > Currently it is done for point a.
> >
> > > Having to issue a checkpoint while ensuring transactions are
> running
> > > just to get a standby up doesn't seem like a good idea to me :)
> >
> > Simon:
> > > If you make the correct test, I'd be more inclined to accept the
> premise.
> >
> > Not sure, what exact you are expecting from test?
> > The test is do any one operation on system and then keep the system
> idle.
> > Now at each checkpoint interval, it logs WAL for SnapshotStandby.
>
> I can't really follow what you want to do here. The snapshot is only
> logged if a checkpoint is performed anyway? As recovery starts at (the
> logical) checkpoint's location we need to log a snapshot exactly
> there. If you want to avoid activity when the system is idle you need
> to
> prevent checkpoints from occurring itself.

Even if the checkpoint is scheduled, it doesn't perform actual operation if
there's nothing logged between
current and previous checkpoint due to below check in CreateCheckPoint()
function.
if (curInsert == ControlFile->checkPoint +
MAXALIGN(SizeOfXLogRecord + sizeof(CheckPoint)) &&
ControlFile->checkPoint ==
ControlFile->checkPointCopy.redo)

But if we set the wal_level as hot_standby, it will log snapshot, now next
time again when function CreateCheckPoint()
will get called due to scheduled checkpoint, the above check will fail and
it will again log snapshot, so this will continue, even if the system is
totally idle.
I understand that it doesn't cause any problem, but I think it is better if
the repeated log of snapshot in this scenario can be avoided.

> There was a thread some time
> back about that and its not as trivial as it seems at the first glance.

I know some part of it that it has been fixed to avoid checkpoint operation
for low activity system and later on that change is rolledback due to
another problem, but I am not sure if it has been agreed that we don't need
to do anything for the above scenario.

With Regards,
Amit Kapila.


From: Andres Freund <andres(at)2ndquadrant(dot)com>
To: Amit Kapila <amit(dot)kapila(at)huawei(dot)com>
Cc: 'Simon Riggs' <simon(at)2ndQuadrant(dot)com>, pgsql-hackers(at)postgresql(dot)org
Subject: Re: Extra XLOG in Checkpoint for StandbySnapshot
Date: 2013-01-08 15:27:01
Message-ID: 20130108152701.GA12111@awork2.anarazel.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

On 2013-01-08 20:33:28 +0530, Amit Kapila wrote:
> On Tuesday, January 08, 2013 8:01 PM Andres Freund wrote:
> > On 2013-01-08 19:51:39 +0530, Amit Kapila wrote:
> > > On Monday, January 07, 2013 7:15 PM Andres Freund wrote:
> > > > On 2013-01-07 19:03:35 +0530, Amit Kapila wrote:
> > > > > On Monday, January 07, 2013 6:30 PM Simon Riggs wrote:
> > > > > > On 7 January 2013 12:39, Amit Kapila <amit(dot)kapila(at)huawei(dot)com>
> > > > wrote:
> > > > > >
> > > > > > > So We can modify to change this in function
> > LogStandbySnapshot as
> > > > > > below:
> > > > > > > running = GetRunningTransactionData();
> > > > > > > if (running->xcnt > 0)
> > > > > > > LogCurrentRunningXacts(running);
> > > > > > >
> > > > > > > So this check will make sure that if there is no operation
> > > > happening
> > > > > > i.e. no
> > > > > > > new running transaction, then no need to log running
> > transaction
> > > > > > snapshot
> > > > > > > and hence further checkpoint operations will be skipped.
> > > > > > >
> > > > > > > Let me know if I am missing something?
> > > > > >
> > > > > > It's not the same test. The fact that nothing is running at
> > that
> > > > > > moment is not the same thing as saying nothing at all has run
> > since
> > > > > > last checkpoint.
> > > > >
> > > > > But isn't the functionality of LogStandbySnapshot() is to log
> > "all
> > > > running
> > > > > xids" and "all current
> > > > > AccessExclusiveLocks". For RunningTransactionLocks, WAL is
> > avoided in
> > > > > similar way.
> > > >
> > > > The information that no transactions are currently running allows
> > you
> > > > to
> > > > build a recovery snapshot, without that information the standby
> > won't
> > > > start answering queries. Now that doesn't matter if all standbys
> > > > already
> > > > have built a snapshot, but the primary cannot know that.
> > >
> > > Can't we make sure that checkpoint operation doesn't happen for below
> > conds.
> > > a. nothing has happened during or after last checkpoint
> > > OR
> > > b. nothing except snapshotstanby WAL has happened
> > >
> > > Currently it is done for point a.
> > >
> > > > Having to issue a checkpoint while ensuring transactions are
> > running
> > > > just to get a standby up doesn't seem like a good idea to me :)
> > >
> > > Simon:
> > > > If you make the correct test, I'd be more inclined to accept the
> > premise.
> > >
> > > Not sure, what exact you are expecting from test?
> > > The test is do any one operation on system and then keep the system
> > idle.
> > > Now at each checkpoint interval, it logs WAL for SnapshotStandby.
> >
> > I can't really follow what you want to do here. The snapshot is only
> > logged if a checkpoint is performed anyway? As recovery starts at (the
> > logical) checkpoint's location we need to log a snapshot exactly
> > there. If you want to avoid activity when the system is idle you need
> > to
> > prevent checkpoints from occurring itself.
>
> Even if the checkpoint is scheduled, it doesn't perform actual operation if
> there's nothing logged between
> current and previous checkpoint due to below check in CreateCheckPoint()
> function.
> if (curInsert == ControlFile->checkPoint +
> MAXALIGN(SizeOfXLogRecord + sizeof(CheckPoint)) &&
> ControlFile->checkPoint ==
> ControlFile->checkPointCopy.redo)
>
> But if we set the wal_level as hot_standby, it will log snapshot, now next
> time again when function CreateCheckPoint()
> will get called due to scheduled checkpoint, the above check will fail and
> it will again log snapshot, so this will continue, even if the system is
> totally idle.
> I understand that it doesn't cause any problem, but I think it is better if
> the repeated log of snapshot in this scenario can be avoided.

ISTM in that case you "just" need a way to cope with the additionally
logged record in the above piece of code. Not logging seems to be the
entirely wrong way to go at this.
I admit its not totally simple, but making HS less predictable seems
like a cure *far* worse than the disease.

Greetings,

Andres Freund

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


From: Amit Kapila <amit(dot)kapila(at)huawei(dot)com>
To: "'Andres Freund'" <andres(at)2ndquadrant(dot)com>
Cc: "'Simon Riggs'" <simon(at)2ndQuadrant(dot)com>, <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Extra XLOG in Checkpoint for StandbySnapshot
Date: 2013-01-09 08:34:32
Message-ID: 007501cdee44$26b18f50$7414adf0$@kapila@huawei.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

On Tuesday, January 08, 2013 8:57 PM Andres Freund wrote:
> On 2013-01-08 20:33:28 +0530, Amit Kapila wrote:
> > On Tuesday, January 08, 2013 8:01 PM Andres Freund wrote:
> > > On 2013-01-08 19:51:39 +0530, Amit Kapila wrote:
> > > > On Monday, January 07, 2013 7:15 PM Andres Freund wrote:
> > > > > On 2013-01-07 19:03:35 +0530, Amit Kapila wrote:
> > > > > > On Monday, January 07, 2013 6:30 PM Simon Riggs wrote:
> > > > > > > On 7 January 2013 12:39, Amit Kapila
> <amit(dot)kapila(at)huawei(dot)com>
> > > > > wrote:
> > > > > > >
> > > > >
> > > > > The information that no transactions are currently running
> allows
> > > you
> > > > > to
> > > > > build a recovery snapshot, without that information the standby
> > > won't
> > > > > start answering queries. Now that doesn't matter if all
> standbys
> > > > > already
> > > > > have built a snapshot, but the primary cannot know that.
> > > >
> > > > Can't we make sure that checkpoint operation doesn't happen for
> below
> > > conds.
> > > > a. nothing has happened during or after last checkpoint
> > > > OR
> > > > b. nothing except snapshotstanby WAL has happened
> > > >
> > > > Currently it is done for point a.
> > > >
> > > > > Having to issue a checkpoint while ensuring transactions are
> > > running
> > > > > just to get a standby up doesn't seem like a good idea to me :)
> > > >
> > > > Simon:
> > > > > If you make the correct test, I'd be more inclined to accept
> the
> > > premise.
> > > >
> > > > Not sure, what exact you are expecting from test?
> > > > The test is do any one operation on system and then keep the
> system
> > > idle.
> > > > Now at each checkpoint interval, it logs WAL for SnapshotStandby.
> > >
> > > I can't really follow what you want to do here. The snapshot is
> only
> > > logged if a checkpoint is performed anyway? As recovery starts at
> (the
> > > logical) checkpoint's location we need to log a snapshot exactly
> > > there. If you want to avoid activity when the system is idle you
> need
> > > to
> > > prevent checkpoints from occurring itself.
> >
> > Even if the checkpoint is scheduled, it doesn't perform actual
> operation if
> > there's nothing logged between
> > current and previous checkpoint due to below check in
> CreateCheckPoint()
> > function.
> > if (curInsert == ControlFile->checkPoint +
> > MAXALIGN(SizeOfXLogRecord +
> sizeof(CheckPoint)) &&
> > ControlFile->checkPoint ==
> > ControlFile->checkPointCopy.redo)
> >
> > But if we set the wal_level as hot_standby, it will log snapshot, now
> next
> > time again when function CreateCheckPoint()
> > will get called due to scheduled checkpoint, the above check will
> fail and
> > it will again log snapshot, so this will continue, even if the system
> is
> > totally idle.
> > I understand that it doesn't cause any problem, but I think it is
> better if
> > the repeated log of snapshot in this scenario can be avoided.
>
> ISTM in that case you "just" need a way to cope with the additionally
> logged record in the above piece of code. Not logging seems to be the
> entirely wrong way to go at this.

I think one of the ways code can be modified is as below:

+ /*size of running transactions log when there is no
active transation*/
+ if (!shutdown && XLogStandbyInfoActive())
+ {
+ runningXactXLog =
MAXALIGN(MinSizeOfXactRunningXacts) + SizeOfXLogRecord;
+ }

! if (curInsert == ControlFile->checkPoint +
! MAXALIGN(SizeOfXLogRecord + sizeof(CheckPoint)) &&
! ControlFile->checkPoint ==
ControlFile->checkPointCopy.redo)

! if (curInsert == ControlFile->checkPoint +
! MAXALIGN(SizeOfXLogRecord + sizeof(CheckPoint)) &&
! ControlFile->checkPoint ==
ControlFile->checkPointCopy.redo + runningXactXLog)

Second condition is checking the last checkpoint WAL position with the
current one.
Since ControlFile->checkPointCopy.redo holds the value before "running
Xact" WAL was inserted
and ControlFile->checkPoint holds the value after "running Xact" WAL got
inserted, so if no new WAL was inserted apart from "running Xacts" and
"Checkpoint" WAL, then this condition will be true.

> Not logging seems to be the entirely wrong way to go at this.

True.

> I admit its not totally simple, but making HS less predictable seems
> like a cure *far* worse than the disease.

Right, that's why I am trying to figure out if there can be a way to handle
without any compromise on HS.

With Regards,
Amit Kapila.


From: Andres Freund <andres(at)2ndquadrant(dot)com>
To: Amit Kapila <amit(dot)kapila(at)huawei(dot)com>
Cc: 'Simon Riggs' <simon(at)2ndQuadrant(dot)com>, pgsql-hackers(at)postgresql(dot)org
Subject: Re: Extra XLOG in Checkpoint for StandbySnapshot
Date: 2013-01-09 08:58:24
Message-ID: 20130109085823.GA5759@awork2.anarazel.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

On 2013-01-09 14:04:32 +0530, Amit Kapila wrote:
> On Tuesday, January 08, 2013 8:57 PM Andres Freund wrote:
> > On 2013-01-08 20:33:28 +0530, Amit Kapila wrote:
> > > On Tuesday, January 08, 2013 8:01 PM Andres Freund wrote:
> > > > On 2013-01-08 19:51:39 +0530, Amit Kapila wrote:
> > > > > On Monday, January 07, 2013 7:15 PM Andres Freund wrote:
> > > > > > On 2013-01-07 19:03:35 +0530, Amit Kapila wrote:
> > > > > > > On Monday, January 07, 2013 6:30 PM Simon Riggs wrote:
> > > > > > > > On 7 January 2013 12:39, Amit Kapila
> > <amit(dot)kapila(at)huawei(dot)com>
> > > > > > wrote:
> > > > > > > >
> > > > > >
> > > > > > The information that no transactions are currently running
> > allows
> > > > you
> > > > > > to
> > > > > > build a recovery snapshot, without that information the standby
> > > > won't
> > > > > > start answering queries. Now that doesn't matter if all
> > standbys
> > > > > > already
> > > > > > have built a snapshot, but the primary cannot know that.
> > > > >
> > > > > Can't we make sure that checkpoint operation doesn't happen for
> > below
> > > > conds.
> > > > > a. nothing has happened during or after last checkpoint
> > > > > OR
> > > > > b. nothing except snapshotstanby WAL has happened
> > > > >
> > > > > Currently it is done for point a.
> > > > >
> > > > > > Having to issue a checkpoint while ensuring transactions are
> > > > running
> > > > > > just to get a standby up doesn't seem like a good idea to me :)
> > > > >
> > > > > Simon:
> > > > > > If you make the correct test, I'd be more inclined to accept
> > the
> > > > premise.
> > > > >
> > > > > Not sure, what exact you are expecting from test?
> > > > > The test is do any one operation on system and then keep the
> > system
> > > > idle.
> > > > > Now at each checkpoint interval, it logs WAL for SnapshotStandby.
> > > >
> > > > I can't really follow what you want to do here. The snapshot is
> > only
> > > > logged if a checkpoint is performed anyway? As recovery starts at
> > (the
> > > > logical) checkpoint's location we need to log a snapshot exactly
> > > > there. If you want to avoid activity when the system is idle you
> > need
> > > > to
> > > > prevent checkpoints from occurring itself.
> > >
> > > Even if the checkpoint is scheduled, it doesn't perform actual
> > operation if
> > > there's nothing logged between
> > > current and previous checkpoint due to below check in
> > CreateCheckPoint()
> > > function.
> > > if (curInsert == ControlFile->checkPoint +
> > > MAXALIGN(SizeOfXLogRecord +
> > sizeof(CheckPoint)) &&
> > > ControlFile->checkPoint ==
> > > ControlFile->checkPointCopy.redo)
> > >
> > > But if we set the wal_level as hot_standby, it will log snapshot, now
> > next
> > > time again when function CreateCheckPoint()
> > > will get called due to scheduled checkpoint, the above check will
> > fail and
> > > it will again log snapshot, so this will continue, even if the system
> > is
> > > totally idle.
> > > I understand that it doesn't cause any problem, but I think it is
> > better if
> > > the repeated log of snapshot in this scenario can be avoided.
> >
> > ISTM in that case you "just" need a way to cope with the additionally
> > logged record in the above piece of code. Not logging seems to be the
> > entirely wrong way to go at this.
>
> I think one of the ways code can be modified is as below:
>
> + /*size of running transactions log when there is no
> active transation*/
> + if (!shutdown && XLogStandbyInfoActive())
> + {
> + runningXactXLog =
> MAXALIGN(MinSizeOfXactRunningXacts) + SizeOfXLogRecord;
> + }
>
> ! if (curInsert == ControlFile->checkPoint +
> ! MAXALIGN(SizeOfXLogRecord + sizeof(CheckPoint)) &&
> ! ControlFile->checkPoint ==
> ControlFile->checkPointCopy.redo)
>
> ! if (curInsert == ControlFile->checkPoint +
> ! MAXALIGN(SizeOfXLogRecord + sizeof(CheckPoint)) &&
> ! ControlFile->checkPoint ==
> ControlFile->checkPointCopy.redo + runningXactXLog)
>
> Second condition is checking the last checkpoint WAL position with the
> current one.
> Since ControlFile->checkPointCopy.redo holds the value before "running
> Xact" WAL was inserted
> and ControlFile->checkPoint holds the value after "running Xact" WAL got
> inserted, so if no new WAL was inserted apart from "running Xacts" and
> "Checkpoint" WAL, then this condition will be true.
>

I don't think thats safe, there could have been another record inserted
that happens to be MinSizeOfXactRunningXacts big and we would still skip
the checkpoint.

Greetings,

Andres Freund

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


From: Amit Kapila <amit(dot)kapila(at)huawei(dot)com>
To: "'Andres Freund'" <andres(at)2ndquadrant(dot)com>
Cc: "'Simon Riggs'" <simon(at)2ndQuadrant(dot)com>, <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Extra XLOG in Checkpoint for StandbySnapshot
Date: 2013-01-09 09:36:04
Message-ID: 008801cdee4c$bf02cf50$3d086df0$@kapila@huawei.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

On Wednesday, January 09, 2013 2:28 PM Andres Freund wrote:
> On 2013-01-09 14:04:32 +0530, Amit Kapila wrote:
> > On Tuesday, January 08, 2013 8:57 PM Andres Freund wrote:
> > > On 2013-01-08 20:33:28 +0530, Amit Kapila wrote:
> > > > On Tuesday, January 08, 2013 8:01 PM Andres Freund wrote:
> > > > > On 2013-01-08 19:51:39 +0530, Amit Kapila wrote:
> > > > > > On Monday, January 07, 2013 7:15 PM Andres Freund wrote:
> > > > > > > On 2013-01-07 19:03:35 +0530, Amit Kapila wrote:
> > > > > > > > On Monday, January 07, 2013 6:30 PM Simon Riggs wrote:
> > > > > > > > > On 7 January 2013 12:39, Amit Kapila
> > > <amit(dot)kapila(at)huawei(dot)com>
> > > > > > > wrote:
> > > > > > > > >
> > > > > > >
> > > > > > > The information that no transactions are currently running
> > > allows
> > > > > you
> > > > > > > to
> > > > > > > build a recovery snapshot, without that information the
> standby
> > > > > won't
> > > > > > > start answering queries. Now that doesn't matter if all
> > > standbys
> > > > > > > already
> > > > > > > have built a snapshot, but the primary cannot know that.
> > > > > >
> > > > > > Can't we make sure that checkpoint operation doesn't happen
> for
> > > below
> > > > > conds.
> > > > > > a. nothing has happened during or after last checkpoint
> > > > > > OR
> > > > > > b. nothing except snapshotstanby WAL has happened
> > > > > >
> > > > > > Currently it is done for point a.
> > > > > >
> > > > > > > Having to issue a checkpoint while ensuring transactions
> are
> > > > > running
> > > > > > > just to get a standby up doesn't seem like a good idea to
> me :)
> > > > > >
> > > > > > Simon:
> > > > > > > If you make the correct test, I'd be more inclined to
> accept
> > > the
> > > > > premise.
> > > > > >
> > > > > > Not sure, what exact you are expecting from test?
> > > > > > The test is do any one operation on system and then keep the
> > > system
> > > > > idle.
> > > > > > Now at each checkpoint interval, it logs WAL for
> SnapshotStandby.
> > > > >
> > > > > I can't really follow what you want to do here. The snapshot is
> > > only
> > > > > logged if a checkpoint is performed anyway? As recovery starts
> at
> > > (the
> > > > > logical) checkpoint's location we need to log a snapshot
> exactly
> > > > > there. If you want to avoid activity when the system is idle
> you
> > > need
> > > > > to
> > > > > prevent checkpoints from occurring itself.
> > > >
> > > > Even if the checkpoint is scheduled, it doesn't perform actual
> > > operation if
> > > > there's nothing logged between
> > > > current and previous checkpoint due to below check in
> > > CreateCheckPoint()
> > > > function.
> > > > if (curInsert == ControlFile->checkPoint +
> > > > MAXALIGN(SizeOfXLogRecord +
> > > sizeof(CheckPoint)) &&
> > > > ControlFile->checkPoint ==
> > > > ControlFile->checkPointCopy.redo)
> > > >
> > > > But if we set the wal_level as hot_standby, it will log snapshot,
> now
> > > next
> > > > time again when function CreateCheckPoint()
> > > > will get called due to scheduled checkpoint, the above check will
> > > fail and
> > > > it will again log snapshot, so this will continue, even if the
> system
> > > is
> > > > totally idle.
> > > > I understand that it doesn't cause any problem, but I think it is
> > > better if
> > > > the repeated log of snapshot in this scenario can be avoided.
> > >
> > > ISTM in that case you "just" need a way to cope with the
> additionally
> > > logged record in the above piece of code. Not logging seems to be
> the
> > > entirely wrong way to go at this.
> >
> > I think one of the ways code can be modified is as below:
> >
> > + /*size of running transactions log when there is no
> > active transation*/
> > + if (!shutdown && XLogStandbyInfoActive())
> > + {
> > + runningXactXLog =
> > MAXALIGN(MinSizeOfXactRunningXacts) + SizeOfXLogRecord;
> > + }
> >
> > ! if (curInsert == ControlFile->checkPoint +
> > ! MAXALIGN(SizeOfXLogRecord +
> sizeof(CheckPoint)) &&
> > ! ControlFile->checkPoint ==
> > ControlFile->checkPointCopy.redo)
> >
> > ! if (curInsert == ControlFile->checkPoint +
> > ! MAXALIGN(SizeOfXLogRecord +
> sizeof(CheckPoint)) &&
> > ! ControlFile->checkPoint ==
> > ControlFile->checkPointCopy.redo + runningXactXLog)
> >
> > Second condition is checking the last checkpoint WAL position with
> the
> > current one.
> > Since ControlFile->checkPointCopy.redo holds the value before
> "running
> > Xact" WAL was inserted
> > and ControlFile->checkPoint holds the value after "running Xact" WAL
> got
> > inserted, so if no new WAL was inserted apart from "running Xacts"
> and
> > "Checkpoint" WAL, then this condition will be true.
> >
>
> I don't think thats safe, there could have been another record inserted
> that happens to be MinSizeOfXactRunningXacts big and we would still
> skip the checkpoint.

I think such can happen only for when first time checkpoint is triggered,
and even then the first part of the check (curInsert ==
ControlFile->checkPoint + MAXALIGN(SizeOfXLogRecord + sizeof(CheckPoint))
will fail.

Value to runningXactXLog will be assigned only if wal_level is hot_stanby.
In that case if checkpoint is getting scheduled for 2nd or consecutive time,
it will include WAL for "running Xact" along with WAL for any other data.
So now even if the other data is of size MinSizeOfXactRunningXacts, the
check should fail and skip the checkpoint.

Also why such cannot happen for Checkpoint record, because there is almost
similar check for Checkpoint record in the same if check?

With Regards,
Amit Kapila.


From: Andres Freund <andres(at)2ndquadrant(dot)com>
To: Amit Kapila <amit(dot)kapila(at)huawei(dot)com>
Cc: 'Simon Riggs' <simon(at)2ndQuadrant(dot)com>, pgsql-hackers(at)postgresql(dot)org
Subject: Re: Extra XLOG in Checkpoint for StandbySnapshot
Date: 2013-01-09 12:19:19
Message-ID: 20130109121919.GD5759@awork2.anarazel.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

On 2013-01-09 15:06:04 +0530, Amit Kapila wrote:
> On Wednesday, January 09, 2013 2:28 PM Andres Freund wrote:
> > On 2013-01-09 14:04:32 +0530, Amit Kapila wrote:
> > > On Tuesday, January 08, 2013 8:57 PM Andres Freund wrote:
> > > > On 2013-01-08 20:33:28 +0530, Amit Kapila wrote:
> > > > > On Tuesday, January 08, 2013 8:01 PM Andres Freund wrote:
> > > > > > On 2013-01-08 19:51:39 +0530, Amit Kapila wrote:
> > > > > > > On Monday, January 07, 2013 7:15 PM Andres Freund wrote:
> > > > > > > > On 2013-01-07 19:03:35 +0530, Amit Kapila wrote:
> > > > > > > > > On Monday, January 07, 2013 6:30 PM Simon Riggs wrote:
> > > > > > > > > > On 7 January 2013 12:39, Amit Kapila
> > > > <amit(dot)kapila(at)huawei(dot)com>
> > > > > > > > wrote:
> > > > > > > > > >
> > > > > > > >
> > > > > > > > The information that no transactions are currently running
> > > > allows
> > > > > > you
> > > > > > > > to
> > > > > > > > build a recovery snapshot, without that information the
> > standby
> > > > > > won't
> > > > > > > > start answering queries. Now that doesn't matter if all
> > > > standbys
> > > > > > > > already
> > > > > > > > have built a snapshot, but the primary cannot know that.
> > > > > > >
> > > > > > > Can't we make sure that checkpoint operation doesn't happen
> > for
> > > > below
> > > > > > conds.
> > > > > > > a. nothing has happened during or after last checkpoint
> > > > > > > OR
> > > > > > > b. nothing except snapshotstanby WAL has happened
> > > > > > >
> > > > > > > Currently it is done for point a.
> > > > > > >
> > > > > > > > Having to issue a checkpoint while ensuring transactions
> > are
> > > > > > running
> > > > > > > > just to get a standby up doesn't seem like a good idea to
> > me :)
> > > > > > >
> > > > > > > Simon:
> > > > > > > > If you make the correct test, I'd be more inclined to
> > accept
> > > > the
> > > > > > premise.
> > > > > > >
> > > > > > > Not sure, what exact you are expecting from test?
> > > > > > > The test is do any one operation on system and then keep the
> > > > system
> > > > > > idle.
> > > > > > > Now at each checkpoint interval, it logs WAL for
> > SnapshotStandby.
> > > > > >
> > > > > > I can't really follow what you want to do here. The snapshot is
> > > > only
> > > > > > logged if a checkpoint is performed anyway? As recovery starts
> > at
> > > > (the
> > > > > > logical) checkpoint's location we need to log a snapshot
> > exactly
> > > > > > there. If you want to avoid activity when the system is idle
> > you
> > > > need
> > > > > > to
> > > > > > prevent checkpoints from occurring itself.
> > > > >
> > > > > Even if the checkpoint is scheduled, it doesn't perform actual
> > > > operation if
> > > > > there's nothing logged between
> > > > > current and previous checkpoint due to below check in
> > > > CreateCheckPoint()
> > > > > function.
> > > > > if (curInsert == ControlFile->checkPoint +
> > > > > MAXALIGN(SizeOfXLogRecord +
> > > > sizeof(CheckPoint)) &&
> > > > > ControlFile->checkPoint ==
> > > > > ControlFile->checkPointCopy.redo)
> > > > >
> > > > > But if we set the wal_level as hot_standby, it will log snapshot,
> > now
> > > > next
> > > > > time again when function CreateCheckPoint()
> > > > > will get called due to scheduled checkpoint, the above check will
> > > > fail and
> > > > > it will again log snapshot, so this will continue, even if the
> > system
> > > > is
> > > > > totally idle.
> > > > > I understand that it doesn't cause any problem, but I think it is
> > > > better if
> > > > > the repeated log of snapshot in this scenario can be avoided.
> > > >
> > > > ISTM in that case you "just" need a way to cope with the
> > additionally
> > > > logged record in the above piece of code. Not logging seems to be
> > the
> > > > entirely wrong way to go at this.
> > >
> > > I think one of the ways code can be modified is as below:
> > >
> > > + /*size of running transactions log when there is no
> > > active transation*/
> > > + if (!shutdown && XLogStandbyInfoActive())
> > > + {
> > > + runningXactXLog =
> > > MAXALIGN(MinSizeOfXactRunningXacts) + SizeOfXLogRecord;
> > > + }
> > >
> > > ! if (curInsert == ControlFile->checkPoint +
> > > ! MAXALIGN(SizeOfXLogRecord +
> > sizeof(CheckPoint)) &&
> > > ! ControlFile->checkPoint ==
> > > ControlFile->checkPointCopy.redo)
> > >
> > > ! if (curInsert == ControlFile->checkPoint +
> > > ! MAXALIGN(SizeOfXLogRecord +
> > sizeof(CheckPoint)) &&
> > > ! ControlFile->checkPoint ==
> > > ControlFile->checkPointCopy.redo + runningXactXLog)
> > >
> > > Second condition is checking the last checkpoint WAL position with
> > the
> > > current one.
> > > Since ControlFile->checkPointCopy.redo holds the value before
> > "running
> > > Xact" WAL was inserted
> > > and ControlFile->checkPoint holds the value after "running Xact" WAL
> > got
> > > inserted, so if no new WAL was inserted apart from "running Xacts"
> > and
> > > "Checkpoint" WAL, then this condition will be true.
> > >
> >
> > I don't think thats safe, there could have been another record inserted
> > that happens to be MinSizeOfXactRunningXacts big and we would still
> > skip the checkpoint.
>
> I think such can happen only for when first time checkpoint is triggered,
> and even then the first part of the check (curInsert ==
> ControlFile->checkPoint + MAXALIGN(SizeOfXLogRecord + sizeof(CheckPoint))
> will fail.
>
> Value to runningXactXLog will be assigned only if wal_level is hot_stanby.
> In that case if checkpoint is getting scheduled for 2nd or consecutive time,
> it will include WAL for "running Xact" along with WAL for any other data.
> So now even if the other data is of size MinSizeOfXactRunningXacts, the
> check should fail and skip the checkpoint.

Hm. The locking around checkpoints probably prevents the case I was
worried about in combination with the wal_level not changing while
running.

> Also why such cannot happen for Checkpoint record, because there is almost
> similar check for Checkpoint record in the same if check?

Because we compare the address of the checkpoint record and count the
size from that. That misses some cases (when wrapping to a new xlog
page) but it won't give false positives.

Greetings,

Andres Freund

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


From: Amit Kapila <amit(dot)kapila(at)huawei(dot)com>
To: "'Andres Freund'" <andres(at)2ndquadrant(dot)com>
Cc: "'Simon Riggs'" <simon(at)2ndQuadrant(dot)com>, <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Extra XLOG in Checkpoint for StandbySnapshot
Date: 2013-01-09 13:45:52
Message-ID: 00b801cdee6f$a488c620$ed9a5260$@kapila@huawei.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

On Wednesday, January 09, 2013 5:49 PM Andres Freund wrote:
> On 2013-01-09 15:06:04 +0530, Amit Kapila wrote:
> > On Wednesday, January 09, 2013 2:28 PM Andres Freund wrote:
> > > On 2013-01-09 14:04:32 +0530, Amit Kapila wrote:
> > > > On Tuesday, January 08, 2013 8:57 PM Andres Freund wrote:
> > > > > On 2013-01-08 20:33:28 +0530, Amit Kapila wrote:
> > > > > > On Tuesday, January 08, 2013 8:01 PM Andres Freund wrote:
> > > > > > > On 2013-01-08 19:51:39 +0530, Amit Kapila wrote:
> > > > > > > > On Monday, January 07, 2013 7:15 PM Andres Freund wrote:
> > > > > > > > > On 2013-01-07 19:03:35 +0530, Amit Kapila wrote:
> > > > > > > > > > On Monday, January 07, 2013 6:30 PM Simon Riggs
> wrote:
> > > > > > > > > > > On 7 January 2013 12:39, Amit Kapila
> > > > > <amit(dot)kapila(at)huawei(dot)com>
> > > > > > > > > wrote:
> > > > > > > > > > >
> > > > > > > > >
> > > > > > > > > The information that no transactions are currently
> running
> > > > > allows
> > > > > > > you
> > > > > > > > > to
> > > > > > > > > build a recovery snapshot, without that information the
> > > standby
> > > > > > > won't
> > > > > > > > > start answering queries. Now that doesn't matter if all
> > > > > standbys
> > > > > > > > > already
> > > > > > > > > have built a snapshot, but the primary cannot know
> that.
> > > > > > > >
> > > > > > > > Can't we make sure that checkpoint operation doesn't
> happen
> > > for
> > > > > below
> > > > > > > conds.
> > > > > > > > a. nothing has happened during or after last checkpoint
> > > > > > > > OR
> > > > > > > > b. nothing except snapshotstanby WAL has happened
> > > > > > > >
> > > > > > > > Currently it is done for point a.
> > > > > > > >
> > > > > > > > > Having to issue a checkpoint while ensuring
> transactions
> > > are
> > > > > > > running
> > > > > > > > > just to get a standby up doesn't seem like a good idea
> to
> > > me :)
> > > > > > > >
> > > > > > > > Simon:
> > > > > > > > > If you make the correct test, I'd be more inclined to
> > > accept
> > > > > the
> > > > > > > premise.
> > > > > > > >
> > > > > > > > Not sure, what exact you are expecting from test?
> > > > > > > > The test is do any one operation on system and then keep
> the
> > > > > system
> > > > > > > idle.
> > > > > > > > Now at each checkpoint interval, it logs WAL for
> > > SnapshotStandby.
> > > > > > >
> > > > > > > I can't really follow what you want to do here. The
> snapshot is
> > > > > only
> > > > > > > logged if a checkpoint is performed anyway? As recovery
> starts
> > > at
> > > > > (the
> > > > > > > logical) checkpoint's location we need to log a snapshot
> > > exactly
> > > > > > > there. If you want to avoid activity when the system is
> idle
> > > you
> > > > > need
> > > > > > > to
> > > > > > > prevent checkpoints from occurring itself.
> > > > > >
> > > > > > Even if the checkpoint is scheduled, it doesn't perform
> actual
> > > > > operation if
> > > > > > there's nothing logged between
> > > > > > current and previous checkpoint due to below check in
> > > > > CreateCheckPoint()
> > > > > > function.
> > > > > > if (curInsert == ControlFile->checkPoint +
> > > > > > MAXALIGN(SizeOfXLogRecord +
> > > > > sizeof(CheckPoint)) &&
> > > > > > ControlFile->checkPoint ==
> > > > > > ControlFile->checkPointCopy.redo)
> > > > > >
> > > > > > But if we set the wal_level as hot_standby, it will log
> snapshot,
> > > now
> > > > > next
> > > > > > time again when function CreateCheckPoint()
> > > > > > will get called due to scheduled checkpoint, the above check
> will
> > > > > fail and
> > > > > > it will again log snapshot, so this will continue, even if
> the
> > > system
> > > > > is
> > > > > > totally idle.
> > > > > > I understand that it doesn't cause any problem, but I think
> it is
> > > > > better if
> > > > > > the repeated log of snapshot in this scenario can be avoided.
> > > > >
> > > > > ISTM in that case you "just" need a way to cope with the
> > > additionally
> > > > > logged record in the above piece of code. Not logging seems to
> be
> > > the
> > > > > entirely wrong way to go at this.
> > > >
> > > > I think one of the ways code can be modified is as below:
> > > >
> > > > + /*size of running transactions log when there is
> no
> > > > active transation*/
> > > > + if (!shutdown && XLogStandbyInfoActive())
> > > > + {
> > > > + runningXactXLog =
> > > > MAXALIGN(MinSizeOfXactRunningXacts) + SizeOfXLogRecord;
> > > > + }
> > > >
> > > > ! if (curInsert == ControlFile->checkPoint +
> > > > ! MAXALIGN(SizeOfXLogRecord +
> > > sizeof(CheckPoint)) &&
> > > > ! ControlFile->checkPoint ==
> > > > ControlFile->checkPointCopy.redo)
> > > >
> > > > ! if (curInsert == ControlFile->checkPoint +
> > > > ! MAXALIGN(SizeOfXLogRecord +
> > > sizeof(CheckPoint)) &&
> > > > ! ControlFile->checkPoint ==
> > > > ControlFile->checkPointCopy.redo + runningXactXLog)
> > > >
> > > > Second condition is checking the last checkpoint WAL position
> with
> > > the
> > > > current one.
> > > > Since ControlFile->checkPointCopy.redo holds the value before
> > > "running
> > > > Xact" WAL was inserted
> > > > and ControlFile->checkPoint holds the value after "running Xact"
> WAL
> > > got
> > > > inserted, so if no new WAL was inserted apart from "running
> Xacts"
> > > and
> > > > "Checkpoint" WAL, then this condition will be true.
> > > >
> > >
> > > I don't think thats safe, there could have been another record
> inserted
> > > that happens to be MinSizeOfXactRunningXacts big and we would still
> > > skip the checkpoint.
> >
> > I think such can happen only for when first time checkpoint is
> triggered,
> > and even then the first part of the check (curInsert ==
> > ControlFile->checkPoint + MAXALIGN(SizeOfXLogRecord +
> sizeof(CheckPoint))
> > will fail.
> >
> > Value to runningXactXLog will be assigned only if wal_level is
> hot_stanby.
> > In that case if checkpoint is getting scheduled for 2nd or
> consecutive time,
> > it will include WAL for "running Xact" along with WAL for any other
> data.
> > So now even if the other data is of size MinSizeOfXactRunningXacts,
> the
> > check should fail and skip the checkpoint.
>
> Hm. The locking around checkpoints probably prevents the case I was
> worried about in combination with the wal_level not changing while
> running.

In that case, can we consider this as a patch for Commit.
If there is no objection, shall I prepare bug-fix patch for the scenario
reported.

With Regards,
Amit Kapila.


From: Amit kapila <amit(dot)kapila(at)huawei(dot)com>
To: "'Andres Freund'" <andres(at)2ndquadrant(dot)com>
Cc: "'Simon Riggs'" <simon(at)2ndQuadrant(dot)com>, "pgsql-hackers(at)postgresql(dot)org" <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Extra XLOG in Checkpoint for StandbySnapshot
Date: 2013-01-10 12:38:37
Message-ID: 6C0B27F7206C9E4CA54AE035729E9C383BEAB2CC@szxeml509-mbx
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers


On Wednesday, January 09, 2013 7:15 PM Amit Kapila wrote:
On Wednesday, January 09, 2013 5:49 PM Andres Freund wrote:
> On 2013-01-09 15:06:04 +0530, Amit Kapila wrote:
> > On Wednesday, January 09, 2013 2:28 PM Andres Freund wrote:
> > > On 2013-01-09 14:04:32 +0530, Amit Kapila wrote:

> > > > > > > > > > > On 7 January 2013 12:39, Amit Kapila
> > > > > <amit(dot)kapila(at)huawei(dot)com>
> > > > > > > > > wrote:
> > > > > > > > > > >
> > > > > > > > >
> > > > > > > > > The information that no transactions are currently
> running
> > > > > allows
> > > > > > > you
> > > > > > > > > to
> > > > > > > > > build a recovery snapshot, without that information the
> > > standby
> > > > > > > won't
> > > > > > > > > start answering queries. Now that doesn't matter if all
> > > > > standbys
> > > > > > > > > already
> > > > > > > > > have built a snapshot, but the primary cannot know
> that.
> > > > > > > >
> > > > > > > > Can't we make sure that checkpoint operation doesn't
> happen
> > > for
> > > > > below
> > > > > > > conds.
> > > > > > > > a. nothing has happened during or after last checkpoint
> > > > > > > > OR
> > > > > > > > b. nothing except snapshotstanby WAL has happened
> > > > > > > >
> > > > > > > > Currently it is done for point a.
> > > > > > > >
> > > > > > > > > Having to issue a checkpoint while ensuring
> transactions
> > > are
> > > > > > > running
> > > > > > > > > just to get a standby up doesn't seem like a good idea
> to
> > > me :)
> > > > > > > >
> > > > > > > > Simon:
> > > > > > > > > If you make the correct test, I'd be more inclined to
> > > accept
> > > > > the
> > > > > > > premise.
> > > > > > > >
> > > > > > > > Not sure, what exact you are expecting from test?
> > > > > > > > The test is do any one operation on system and then keep
> the
> > > > > system
> > > > > > > idle.
> > > > > > > > Now at each checkpoint interval, it logs WAL for
> > > SnapshotStandby.
> > > > > > >
> > > > > > > I can't really follow what you want to do here. The
> snapshot is
> > > > > only
> > > > > > > logged if a checkpoint is performed anyway? As recovery
> starts
> > > at
> > > > > (the
> > > > > > > logical) checkpoint's location we need to log a snapshot
> > > exactly
> > > > > > > there. If you want to avoid activity when the system is
> idle
> > > you
> > > > > need
> > > > > > > to
> > > > > > > prevent checkpoints from occurring itself.
> > > > > >
> > > > > > Even if the checkpoint is scheduled, it doesn't perform
> actual
> > > > > operation if
> > > > > > there's nothing logged between
> > > > > > current and previous checkpoint due to below check in
> > > > > CreateCheckPoint()
> > > > > > function.
> > > > > > if (curInsert == ControlFile->checkPoint +
> > > > > > MAXALIGN(SizeOfXLogRecord +
> > > > > sizeof(CheckPoint)) &&
> > > > > > ControlFile->checkPoint ==
> > > > > > ControlFile->checkPointCopy.redo)
> > > > > >
> > > > > > But if we set the wal_level as hot_standby, it will log
> snapshot,
> > > now
> > > > > next
> > > > > > time again when function CreateCheckPoint()
> > > > > > will get called due to scheduled checkpoint, the above check
> will
> > > > > fail and
> > > > > > it will again log snapshot, so this will continue, even if
> the
> > > system
> > > > > is
> > > > > > totally idle.
> > > > > > I understand that it doesn't cause any problem, but I think
> it is
> > > > > better if
> > > > > > the repeated log of snapshot in this scenario can be avoided.
> > > > >
> > > > > ISTM in that case you "just" need a way to cope with the
> > > additionally
> > > > > logged record in the above piece of code. Not logging seems to
> be
> > > the
> > > > > entirely wrong way to go at this.
> > > >
> > > > I think one of the ways code can be modified is as below:
> > > >
> > > > + /*size of running transactions log when there is
> no
> > > > active transation*/
> > > > + if (!shutdown && XLogStandbyInfoActive())
> > > > + {
> > > > + runningXactXLog =
> > > > MAXALIGN(MinSizeOfXactRunningXacts) + SizeOfXLogRecord;
> > > > + }
> > > >
> > > > ! if (curInsert == ControlFile->checkPoint +
> > > > ! MAXALIGN(SizeOfXLogRecord +
> > > sizeof(CheckPoint)) &&
> > > > ! ControlFile->checkPoint ==
> > > > ControlFile->checkPointCopy.redo)
> > > >
> > > > ! if (curInsert == ControlFile->checkPoint +
> > > > ! MAXALIGN(SizeOfXLogRecord +
> > > sizeof(CheckPoint)) &&
> > > > ! ControlFile->checkPoint ==
> > > > ControlFile->checkPointCopy.redo + runningXactXLog)
> > > >
> > > > Second condition is checking the last checkpoint WAL position
> with
> > > the
> > > > current one.
> > > > Since ControlFile->checkPointCopy.redo holds the value before
> > > "running
> > > > Xact" WAL was inserted
> > > > and ControlFile->checkPoint holds the value after "running Xact"
> WAL
> > > got
> > > > inserted, so if no new WAL was inserted apart from "running
> Xacts"
> > > and
> > > > "Checkpoint" WAL, then this condition will be true.
> > > >
> > >
> > > I don't think thats safe, there could have been another record
> inserted
> > > that happens to be MinSizeOfXactRunningXacts big and we would still
> > > skip the checkpoint.
> >
> > I think such can happen only for when first time checkpoint is
> triggered,
> > and even then the first part of the check (curInsert ==
> > ControlFile->checkPoint + MAXALIGN(SizeOfXLogRecord +
> sizeof(CheckPoint))
> > will fail.
> >
> > Value to runningXactXLog will be assigned only if wal_level is
> hot_stanby.
> > In that case if checkpoint is getting scheduled for 2nd or
> consecutive time,
> > it will include WAL for "running Xact" along with WAL for any other
> data.
> > So now even if the other data is of size MinSizeOfXactRunningXacts,
> the
> > check should fail and skip the checkpoint.
>
> Hm. The locking around checkpoints probably prevents the case I was
> worried about in combination with the wal_level not changing while
> running.

Patch to address the issue is attached with this mail.
Suggestions?

With Regards,
Amit Kapila.

Attachment Content-Type Size
avoid_Extra_WAL_checkpoint.patch application/octet-stream 1.5 KB