Обсуждение: After ~Crash Sequence not correct
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
"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
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
"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
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
> 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
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