On Wed, 13 Mar 2002, Tom Lane wrote:
> 
> I don't think that can work.  AFAICT what your patch does is to ensure
> a WAL record is written by the first nextval() in any given backend
> session.  

That's exactly what it does, yes.  It forces the WAL record to be 
written at least once.  I think the reason this works is because the 
WAL record that's written seems to be one behind what should be on 
disk.  So doing it once gets it ahead of the game.  I'm sure it's  
a very naive approach, but before yesterday I had never looked at 
the source for postgresql.  All I can say for my patch it is that if 
it does not indeed fix the problem it masks it well enough that I 
can't reproduce it.

> But what we need is to ensure a WAL record from the first
> nextval() after a checkpoint.  
>
> The problem in the scenario Bruce exhibits is that the CHECKPOINT
> forces out both the latest sequence WAL record and the current state
> of the sequence relation itself.  The subsequent nextval()'s advance
> the sequence relation in-memory but generate no disk writes and no
> WAL records.  On restart, you lose: the sequence relation is back
> to where it was checkpointed, and the latest WAL record for the
> sequence is before the checkpoint *so it won't get rescanned*.
> Thus, the sequence doesn't get pushed forward like it's supposed to.

This isn't quite true... because until you select enough values to 
get to log < fetch it won't even have inserted a WAL record to 
CHECKPOINT to so it falls back to the unmodified state which means 
that the 'last_value' on disk never moves forward, in theory the 
value on disk should *always* be equal or greater (up to 32) than the 
value being returned to the client and when you load it off disk 
it isn't.  

More (possibly redundant) examples:
select * from your_seq and note the values.  Then select nextval a few 
times, kill -9 your backend, and reconnect.  select * from your_seq 
again and you should see that it's identical to the previous values.  

Now, try the same thing again, but force a checkpoint before killing 
your backend, then select again... same values as initially.  

Now, select nextval the number of times needed to get log_cnt to 
loop past 0 and back up to 32, then select * from your_seq again, 
note the values and checkpoint.  crash the backend, reconnect and 
select again... it saved it this time because it got through enough
code to do the xloginsert.

> The failure cases for your patch would
> involve backends that have been running for longer than one checkpoint
> cycle ...

I haven't been able to reproduce that, even checkpointing multiple 
times on several open backends.  But I also found a couple mistakes 
in my patch that make it a little better.  I can forward the new 
patch if you'd like to see it.

-- Ben


---------------------------(end of broadcast)---------------------------
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]

Reply via email to