mirror of
https://github.com/postgres/postgres.git
synced 2025-05-05 09:19:17 +03:00
Fix vac_update_relstats to ensure it always sends a relcache inval message,
even if none of the fields in the pg_class row change. This behavior is necessary to ensure other backends flush rd_targblock values that might point to truncated-away pages. We got this right pre-8.2 but it was broken by overoptimistic change to not write out the pg_class row if unchanged. Per report from Pavan Deolasee.
This commit is contained in:
parent
2b1abc8756
commit
8e010acb0d
@ -13,7 +13,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.342 2006/11/05 22:42:08 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.342.2.1 2007/03/08 17:03:43 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -715,10 +715,20 @@ vac_update_relstats(Oid relid, BlockNumber num_pages, double num_tuples,
|
||||
}
|
||||
|
||||
/*
|
||||
* If anything changed, write out the tuple
|
||||
* If anything changed, write out the tuple. Even if nothing changed,
|
||||
* force relcache invalidation so all backends reset their rd_targblock
|
||||
* --- otherwise it might point to a page we truncated away.
|
||||
*/
|
||||
if (dirty)
|
||||
{
|
||||
heap_inplace_update(rd, ctup);
|
||||
/* the above sends a cache inval message */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* no need to change tuple, but force relcache inval anyway */
|
||||
CacheInvalidateRelcacheByTuple(ctup);
|
||||
}
|
||||
|
||||
heap_close(rd, RowExclusiveLock);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user