Manfred Koizar wrote:
> On Wed, 19 Jan 2005 18:57:48 +0100, I wrote:
> >  My first vacuum.c
> >refactoring patch, rev 1.281 2004-06-08, added these comments in
> >repair_frag():
> >
> >/*
> > * VACUUM FULL has an exclusive lock on the relation.  So
> > * normally no other transaction can have pending INSERTs or
> > * DELETEs in this relation.  A tuple is either
> > *   (a) a tuple in a system catalog, inserted or deleted by
> > *       a not yet committed transaction or
> > *   (b) dead (XMIN_INVALID or XMAX_COMMITTED) or
> > *   (c) inserted by a committed xact (XMIN_COMMITTED) or
> > *   (d) moved by the currently running VACUUM.
> > * In case (a) we wouldn't be in repair_frag() at all.
> > * In case (b) we cannot be here, because scan_heap() has
> > * already marked the item as unused, see continue above.
> > * Case (c) is what normally is to be expected.
> > * Case (d) is only possible, if a whole tuple chain has been
> > * moved while processing this or a higher numbered block.
> > */
> 
> It turns out that this comment is not quite correct.  It is incomplete.
> Case (b) should be: known dead (XMIN_INVALID, or XMAX_COMMITTED and xmax
> is visible to all active transactions).
> 
> And there is a fifth possibility: (e) deleted (XMAX_COMMITTED) but at
> least one active transaction does not see the deleting transaction.
> 
> The patch seems to imply that case (e) is a subcase of (b), but
> effectively tuples in this state are treated more like (c).

OK, comment updated to:

            /* ---
             * VACUUM FULL has an exclusive lock on the relation.  So
             * normally no other transaction can have pending INSERTs or
             * DELETEs in this relation.  A tuple is either:
             *      (a) a tuple in a system catalog, inserted or deleted
             *          by a not yet committed transaction
             *      (b) known dead (XMIN_INVALID, or XMAX_COMMITTED and xmax
             *          is visible to all active transactions)
             *      (c) inserted by a committed xact (XMIN_COMMITTED)
             *      (d) moved by the currently running VACUUM.
             *      (e) deleted (XMAX_COMMITTED) but at least one active
             *          transaction does not see the deleting transaction
             * In case (a) we wouldn't be in repair_frag() at all.
             * In case (b) we cannot be here, because scan_heap() has
             * already marked the item as unused, see continue above. Case
             * (c) is what normally is to be expected. Case (d) is only
             * possible, if a whole tuple chain has been moved while
             * processing this or a higher numbered block.
             * ---
             */

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
    (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])

Reply via email to