After ~Crash Sequence not correct

Started by Henshall, Stuart - WCPover 24 years ago7 messagesbugs
Jump to latest
#1Henshall, Stuart - WCP
SHenshall@westcountrypublications.co.uk

Severity: Annoyance
Setup: PostgreSQL 7.1.2 on Dual PIII WinNT4 server + Cygwin 1.3.2
PostgreSQL is run as a service and when rebooting (which doesn't shutdown -
previously on cygwin list (hence the ~Crash in title)) I have twice noticed
that a sequence was not properly updated, however records with Primary keys
based upon the sequence where present in the table. (I *think* it was a
different table & sequence last time).
- Stuart

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Henshall, Stuart - WCP (#1)
Re: After ~Crash Sequence not correct

"Henshall, Stuart - WCP" <SHenshall@westcountrypublications.co.uk> writes:

Setup: PostgreSQL 7.1.2 on Dual PIII WinNT4 server + Cygwin 1.3.2
PostgreSQL is run as a service and when rebooting (which doesn't shutdown -
previously on cygwin list (hence the ~Crash in title)) I have twice noticed
that a sequence was not properly updated, however records with Primary keys
based upon the sequence where present in the table.

Hmm. You're about the third person to report something like this, so
there's clearly something not right. I'm guessing a bug in the WAL
logging or redo code for sequences ...

regards, tom lane

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Henshall, Stuart - WCP (#1)
Re: After ~Crash Sequence not correct

I have verified that killing the postmaster after a few nextval's
leaves things in a bad state after restart.

I think I see the problem: in nextval(), the sequence data written to
the WAL log is different from that written to the data page. Isn't
that bogus?

To WAL:
seq->last_value = next;
seq->is_called = true;
seq->log_cnt = 0;

To disk:
seq->last_value = last; /* last fetched number */
seq->is_called = true;
seq->log_cnt = log; /* how much is logged */

(also, "log" has been changed between these two points)

regards, tom lane

#4Mikheev, Vadim
vmikheev@SECTORBASE.COM
In reply to: Tom Lane (#3)
Re: After ~Crash Sequence not correct

I have verified that killing the postmaster after a few nextval's
leaves things in a bad state after restart.

I think I see the problem: in nextval(), the sequence data written to
the WAL log is different from that written to the data page. Isn't
that bogus?

It was made to avoid WAL-loging on each nextval call, ie it should work
like OID pre-fetching: value stored in WAL must always "exceed" values
returned by nextval so on the after-crash-restart sequence should be
advanced to value which was never returned by nextval (for non-cycled
sequences). Maybe I made some mistakes in implementation?

Vadim

#5Tom Lane
tgl@sss.pgh.pa.us
In reply to: Mikheev, Vadim (#4)
Re: After ~Crash Sequence not correct

"Mikheev, Vadim" <vmikheev@SECTORBASE.COM> writes:

It was made to avoid WAL-loging on each nextval call, ie it should work
like OID pre-fetching: value stored in WAL must always "exceed" values
returned by nextval so on the after-crash-restart sequence should be
advanced to value which was never returned by nextval (for non-cycled
sequences). Maybe I made some mistakes in implementation?

Oh, okay. What I saw was that the next nextval() after restart was
higher than what I was expecting; but that's correct given the prefetch
behavior.

But we've seen several reports wherein the value appeared to go
backwards after a crash.

Stuart, you weren't running with -F (fsync off) by any chance, were you?

regards, tom lane

#6Henshall, Stuart - WCP
SHenshall@westcountrypublications.co.uk
In reply to: Tom Lane (#5)
Re: After ~Crash Sequence not correct

No. I had fsync on.
- Stuart

-----Original Message-----
From: Tom Lane [mailto:tgl@sss.pgh.pa.us]
Sent: 19 December 2001 18:49
To: Mikheev, Vadim
Cc: Henshall, Stuart - WCP; pgsql-bugs@postgreSQL.org
Subject: Re: [BUGS] After ~Crash Sequence not correct

"Mikheev, Vadim" <vmikheev@SECTORBASE.COM> writes:

It was made to avoid WAL-loging on each nextval call, ie it should work
like OID pre-fetching: value stored in WAL must always "exceed" values
returned by nextval so on the after-crash-restart sequence should be
advanced to value which was never returned by nextval (for non-cycled
sequences). Maybe I made some mistakes in implementation?

Oh, okay. What I saw was that the next nextval() after restart was
higher than what I was expecting; but that's correct given the prefetch
behavior.

But we've seen several reports wherein the value appeared to go
backwards after a crash.

Stuart, you weren't running with -F (fsync off) by any chance, were you?

regards, tom lane

#7Bruce Momjian
bruce@momjian.us
In reply to: Mikheev, Vadim (#4)
Re: After ~Crash Sequence not correct

Mikheev, Vadim wrote:

I have verified that killing the postmaster after a few nextval's
leaves things in a bad state after restart.

I think I see the problem: in nextval(), the sequence data written to
the WAL log is different from that written to the data page. Isn't
that bogus?

It was made to avoid WAL-loging on each nextval call, ie it should work
like OID pre-fetching: value stored in WAL must always "exceed" values
returned by nextval so on the after-crash-restart sequence should be
advanced to value which was never returned by nextval (for non-cycled
sequences). Maybe I made some mistakes in implementation?

Was this ever fixed?

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026