On 04.12.2010 10:22, jes...@krogh.cc wrote:
Den 4 Dec 2010 kl. 08:48 skrev Heikki 
Linnakangas<heikki.linnakan...@enterprisedb.com>:
If you WAL-log the visibility map changes after-the-fact, it doesn't solve the 
race condition we're struggling with: the visibility map change might hit the 
disk before the PD_ALL_VISIBLE to the heap page. If you crash, you can end up 
with a situation where the PD_ALL_VISIBLE flag on the heap page is not set, but 
the bit in the visibility map is. Which causes serious issues later on.

My imagination is probably not as good, but if you at time A wallog the 
complete map and at A+1 you update a tuple so the visibility bit is cleared but 
the map bit change does not happen due to a crash. Then at wal replay time you 
restore the map from time A and if the tuple change at A+1 is represented in 
the wal stream the you also update the visibility map.  This is the situation 
where the heap tuple hit disk but the map is left in a broken state?  Or is it 
a different similar looking situation?

The problem is when a bit is *set* in the visibility map. Clearing a bit is not a problem, we already handle that reliably. If you set the flag on the heap page and set the bit on the visibility map page, and you don't emit a WAL record on either of those operations, the VM page might be flushed to disk before the heap page.

--
  Heikki Linnakangas
  EnterpriseDB   http://www.enterprisedb.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to