Accept invalidation before fk graph validity check (#5017)

InvalidateForeignKeyGraph sends an invalidation via shared memory to all
backends, including the current one.

However, we might not call AcceptInvalidationMessages before reading
from the cache below. It would be better to also add a call to
AcceptInvalidationMessages in IsForeignConstraintRelationshipGraphValid.
pull/5022/head
Hanefi Onaldi 2021-06-02 14:45:35 +03:00 committed by GitHub
parent f9c7d74623
commit fa29d6667a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 9 additions and 2 deletions

View File

@ -32,6 +32,7 @@
#if PG_VERSION_NUM >= PG_VERSION_13 #if PG_VERSION_NUM >= PG_VERSION_13
#include "common/hashfn.h" #include "common/hashfn.h"
#endif #endif
#include "utils/inval.h"
#include "utils/memutils.h" #include "utils/memutils.h"
@ -82,6 +83,7 @@ static ForeignConstraintRelationshipNode * GetRelationshipNodeForRelationId(Oid
relationId, relationId,
bool *isFound); bool *isFound);
static void CreateForeignConstraintRelationshipGraph(void); static void CreateForeignConstraintRelationshipGraph(void);
static bool IsForeignConstraintRelationshipGraphValid(void);
static List * GetNeighbourList(ForeignConstraintRelationshipNode *relationshipNode, static List * GetNeighbourList(ForeignConstraintRelationshipNode *relationshipNode,
bool isReferencing); bool isReferencing);
static List * GetRelationIdsFromRelationshipNodeList(List *fKeyRelationshipNodeList); static List * GetRelationIdsFromRelationshipNodeList(List *fKeyRelationshipNodeList);
@ -348,9 +350,15 @@ CreateForeignConstraintRelationshipGraph()
/* /*
* IsForeignConstraintGraphValid check whether there is a valid graph. * IsForeignConstraintGraphValid check whether there is a valid graph.
*/ */
bool static bool
IsForeignConstraintRelationshipGraphValid() IsForeignConstraintRelationshipGraphValid()
{ {
/*
* We might have some concurrent metadata changes. In order to get the changes,
* we first need to accept the cache invalidation messages.
*/
AcceptInvalidationMessages();
if (fConstraintRelationshipGraph != NULL && fConstraintRelationshipGraph->isValid) if (fConstraintRelationshipGraph != NULL && fConstraintRelationshipGraph->isValid)
{ {
return true; return true;

View File

@ -20,7 +20,6 @@ extern bool ConnectedToReferenceTableViaFKey(Oid relationId);
extern List * ReferencedRelationIdList(Oid relationId); extern List * ReferencedRelationIdList(Oid relationId);
extern List * ReferencingRelationIdList(Oid relationId); extern List * ReferencingRelationIdList(Oid relationId);
extern void SetForeignConstraintRelationshipGraphInvalid(void); extern void SetForeignConstraintRelationshipGraphInvalid(void);
extern bool IsForeignConstraintRelationshipGraphValid(void);
extern void ClearForeignConstraintRelationshipGraphContext(void); extern void ClearForeignConstraintRelationshipGraphContext(void);
extern HTAB * CreateOidVisitedHashSet(void); extern HTAB * CreateOidVisitedHashSet(void);
extern bool OidVisited(HTAB *oidVisitedMap, Oid oid); extern bool OidVisited(HTAB *oidVisitedMap, Oid oid);