mirror of
https://github.com/postgres/postgres.git
synced 2025-10-27 00:12:01 +03:00
Lock before setting relhassubclass on RELKIND_PARTITIONED_INDEX.
Commit5b562644feadded a comment that SetRelationHasSubclass() callers must hold this lock. When commit17f206fbc8extended use of this column to partitioned indexes, it didn't take the lock. As the latter commit message mentioned, we currently never reset a partitioned index to relhassubclass=f. That largely avoids harm from the lock omission. The cause for fixing this now is to unblock introducing a rule about locks required to heap_update() a pg_class row. This might cause more deadlocks. It gives minor user-visible benefits: - If an ALTER INDEX SET TABLESPACE runs concurrently with ALTER TABLE ATTACH PARTITION or CREATE PARTITION OF, one transaction blocks instead of failing with "tuple concurrently updated". (Many cases of DDL concurrency still fail that way.) - Match ALTER INDEX ATTACH PARTITION in choosing to lock the index. While not user-visible today, we'll need this if we ever make something set the flag to false for a partitioned index, like ANALYZE does today for tables. Back-patch to v12 (all supported versions), the plan for the commit relying on the new rule. In back branches, add LockOrStrongerHeldByMe() instead of adding a LockHeldByMe() parameter. Reviewed (in an earlier version) by Robert Haas. Discussion: https://postgr.es/m/20240611024525.9f.nmisch@google.com
This commit is contained in:
@@ -567,7 +567,8 @@ extern void LockReleaseAll(LOCKMETHODID lockmethodid, bool allLocks);
|
||||
extern void LockReleaseSession(LOCKMETHODID lockmethodid);
|
||||
extern void LockReleaseCurrentOwner(LOCALLOCK **locallocks, int nlocks);
|
||||
extern void LockReassignCurrentOwner(LOCALLOCK **locallocks, int nlocks);
|
||||
extern bool LockHeldByMe(const LOCKTAG *locktag, LOCKMODE lockmode);
|
||||
extern bool LockHeldByMe(const LOCKTAG *locktag,
|
||||
LOCKMODE lockmode, bool orstronger);
|
||||
#ifdef USE_ASSERT_CHECKING
|
||||
extern HTAB *GetLockMethodLocalHash(void);
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user