Fix search_path cache initialization.
The cache needs to be available very early, so don't rely on InitializeSearchPath() to initialize the it. Reported-by: Murat Efendioğlu Discussion: https://postgr.es/m/CACbCzujQ4zS8MM1bx-==+tr+D3Hk5G1cjN4XkUQ+Q=cEpwhzqg@mail.gmail.com Backpatch-through: 17
This commit is contained in:
parent
c3b80a7e98
commit
a9ed7d9449
@ -305,17 +305,32 @@ static SearchPathCacheEntry *LastSearchPathCacheEntry = NULL;
|
|||||||
static void
|
static void
|
||||||
spcache_init(void)
|
spcache_init(void)
|
||||||
{
|
{
|
||||||
Assert(SearchPathCacheContext);
|
|
||||||
|
|
||||||
if (SearchPathCache && searchPathCacheValid &&
|
if (SearchPathCache && searchPathCacheValid &&
|
||||||
SearchPathCache->members < SPCACHE_RESET_THRESHOLD)
|
SearchPathCache->members < SPCACHE_RESET_THRESHOLD)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* make sure we don't leave dangling pointers if nsphash_create fails */
|
searchPathCacheValid = false;
|
||||||
|
baseSearchPathValid = false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure we don't leave dangling pointers if a failure happens during
|
||||||
|
* initialization.
|
||||||
|
*/
|
||||||
SearchPathCache = NULL;
|
SearchPathCache = NULL;
|
||||||
LastSearchPathCacheEntry = NULL;
|
LastSearchPathCacheEntry = NULL;
|
||||||
|
|
||||||
MemoryContextReset(SearchPathCacheContext);
|
if (SearchPathCacheContext == NULL)
|
||||||
|
{
|
||||||
|
/* Make the context we'll keep search path cache hashtable in */
|
||||||
|
SearchPathCacheContext = AllocSetContextCreate(TopMemoryContext,
|
||||||
|
"search_path processing cache",
|
||||||
|
ALLOCSET_DEFAULT_SIZES);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MemoryContextReset(SearchPathCacheContext);
|
||||||
|
}
|
||||||
|
|
||||||
/* arbitrary initial starting size of 16 elements */
|
/* arbitrary initial starting size of 16 elements */
|
||||||
SearchPathCache = nsphash_create(SearchPathCacheContext, 16, NULL);
|
SearchPathCache = nsphash_create(SearchPathCacheContext, 16, NULL);
|
||||||
searchPathCacheValid = true;
|
searchPathCacheValid = true;
|
||||||
@ -4742,11 +4757,6 @@ InitializeSearchPath(void)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Make the context we'll keep search path cache hashtable in */
|
|
||||||
SearchPathCacheContext = AllocSetContextCreate(TopMemoryContext,
|
|
||||||
"search_path processing cache",
|
|
||||||
ALLOCSET_DEFAULT_SIZES);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In normal mode, arrange for a callback on any syscache invalidation
|
* In normal mode, arrange for a callback on any syscache invalidation
|
||||||
* that will affect the search_path cache.
|
* that will affect the search_path cache.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user