Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit31912d0

Browse files
committed
Improve relcache invalidation handling of currently invisible relations.
The corner case where a relcache invalidation tried to rebuild theentry for a referenced relation but couldn't find it in the catalogwasn't correct.The code tried to RelationCacheDelete/RelationDestroyRelation theentry. That didn't work when assertions are enabled because the lattercontains an assertion ensuring the refcount is zero. It's also moregenerally a bad idea, because by virtue of being referenced somebodymight actually look at the entry, which is possible if the error istrapped and handled via a subtransaction abort.Instead just error out, without deleting the entry. As the entry ismarked invalid, the worst that can happen is that the invalid (and atsome point unused) entry lingers in the relcache.Discussion: 22459.1418656530@sss.pgh.pa.usThere should be no way to hit this case < 9.4 where logical decodingintroduced a bug that can hit this. But since the code for handlingthe corner case is there it should do something halfway sane, sobackpatch all the the way back. The logical decoding bug will behandled in a separate commit.
1 parentcb07517 commit31912d0

File tree

1 file changed

+7
-3
lines changed

1 file changed

+7
-3
lines changed

‎src/backend/utils/cache/relcache.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2192,9 +2192,13 @@ RelationClearRelation(Relation relation, bool rebuild)
21922192
newrel=RelationBuildDesc(save_relid, false);
21932193
if (newrel==NULL)
21942194
{
2195-
/* Should only get here if relation was deleted */
2196-
RelationCacheDelete(relation);
2197-
RelationDestroyRelation(relation, false);
2195+
/*
2196+
* This shouldn't happen as dropping a relation is intended to be
2197+
* impossible if still referenced (c.f. CheckTableNotInUse()). But
2198+
* if we get here anyway, we can't just delete the relcache entry,
2199+
* as it possibly could get accessed later (as e.g. the error
2200+
* might get trapped and handled via a subtransaction rollback).
2201+
*/
21982202
elog(ERROR,"relation %u deleted while still in use",save_relid);
21992203
}
22002204

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp