mirror of
https://github.com/postgres/postgres.git
synced 2025-06-16 06:01:02 +03:00
Fix relpersistence setting in reindex_index
Buildfarm members with CLOBBER_CACHE_ALWAYS advised us that commit
85b506bbfc
was mistaken in setting the relpersistence value of the
index directly in the relcache entry, within reindex_index. The reason
for the failure is that an invalidation message that comes after mucking
with the relcache entry directly, but before writing it to the catalogs,
would cause the entry to become rebuilt in place from catalogs with the
old contents, losing the update.
Fix by passing the correct persistence value to
RelationSetNewRelfilenode instead; this routine also writes the updated
tuple to pg_class, avoiding the problem. Suggested by Tom Lane.
This commit is contained in:
@ -1196,7 +1196,8 @@ ExecuteTruncate(TruncateStmt *stmt)
|
||||
* as the relfilenode value. The old storage file is scheduled for
|
||||
* deletion at commit.
|
||||
*/
|
||||
RelationSetNewRelfilenode(rel, RecentXmin, minmulti);
|
||||
RelationSetNewRelfilenode(rel, rel->rd_rel->relpersistence,
|
||||
RecentXmin, minmulti);
|
||||
if (rel->rd_rel->relpersistence == RELPERSISTENCE_UNLOGGED)
|
||||
heap_create_init_fork(rel);
|
||||
|
||||
@ -1209,7 +1210,8 @@ ExecuteTruncate(TruncateStmt *stmt)
|
||||
if (OidIsValid(toast_relid))
|
||||
{
|
||||
rel = relation_open(toast_relid, AccessExclusiveLock);
|
||||
RelationSetNewRelfilenode(rel, RecentXmin, minmulti);
|
||||
RelationSetNewRelfilenode(rel, rel->rd_rel->relpersistence,
|
||||
RecentXmin, minmulti);
|
||||
if (rel->rd_rel->relpersistence == RELPERSISTENCE_UNLOGGED)
|
||||
heap_create_init_fork(rel);
|
||||
heap_close(rel, NoLock);
|
||||
|
Reference in New Issue
Block a user