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
|
* 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)
|
if (dirty)
|
||||||
|
{
|
||||||
heap_inplace_update(rd, ctup);
|
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);
|
heap_close(rd, RowExclusiveLock);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user