mirror of https://github.com/citusdata/citus.git
Avoid re-assigning the global pid when we cannot retrieve local node id without unsafe catalog access
(cherry picked from commit d06c0cd958
)
pull/7791/head
parent
c6c6d9ffcb
commit
0f84ed807b
|
@ -4545,6 +4545,16 @@ GetLocalNodeId(void)
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* CachedLocalNodeIdIsValid return true if the cached local node id is valid.
|
||||
*/
|
||||
bool
|
||||
CachedLocalNodeIdIsValid(void)
|
||||
{
|
||||
return LocalNodeId != -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* RegisterLocalGroupIdCacheCallbacks registers the callbacks required to
|
||||
* maintain LocalGroupId at a consistent value. It's separate from
|
||||
|
|
|
@ -2899,6 +2899,13 @@ ApplicationNameAssignHook(const char *newval, void *extra)
|
|||
* So we set the FinishedStartupCitusBackend flag in StartupCitusBackend to
|
||||
* indicate when this responsibility handoff has happened.
|
||||
*
|
||||
* On the other hand, even if now it's this hook's responsibility to update
|
||||
* the global pid, we cannot do so if the cached local node id is invalidated
|
||||
* and we're not allowed to access the catalog tables. Within a transaction
|
||||
* block, we can access the catalog tables. For this reason, in addition to
|
||||
* checking FinishedStartupCitusBackend, we also require either being in a
|
||||
* transaction block or the cached local node id to be valid.
|
||||
*
|
||||
* Another solution to the catalog table acccess problem would be to update
|
||||
* global pid lazily, like we do for HideShards. But that's not possible
|
||||
* for the global pid, since it is stored in shared memory instead of in a
|
||||
|
@ -2907,7 +2914,8 @@ ApplicationNameAssignHook(const char *newval, void *extra)
|
|||
* as reasonably possible, which is also why we extract global pids in the
|
||||
* AuthHook already (extracting doesn't require catalog access).
|
||||
*/
|
||||
if (FinishedStartupCitusBackend)
|
||||
if (FinishedStartupCitusBackend &&
|
||||
(IsTransactionState() || CachedLocalNodeIdIsValid()))
|
||||
{
|
||||
AssignGlobalPID(newval);
|
||||
}
|
||||
|
|
|
@ -181,6 +181,7 @@ extern CitusTableCacheEntry * LookupCitusTableCacheEntry(Oid relationId);
|
|||
extern DistObjectCacheEntry * LookupDistObjectCacheEntry(Oid classid, Oid objid, int32
|
||||
objsubid);
|
||||
extern int32 GetLocalGroupId(void);
|
||||
extern bool CachedLocalNodeIdIsValid(void);
|
||||
extern int32 GetLocalNodeId(void);
|
||||
extern void CitusTableCacheFlushInvalidatedEntries(void);
|
||||
extern Oid LookupShardRelationFromCatalog(int64 shardId, bool missing_ok);
|
||||
|
|
Loading…
Reference in New Issue