bool PersistentFilespace_TryGetPrimaryAndMirror( Oid filespaceOid, /* The filespace OID to lookup. */ char **primaryFilespaceLocation, /* The primary filespace directory path. Return NULL for global and base. */ char **mirrorFilespaceLocation) /* * The primary filespace directory path. Return NULL for global and base. * Or, returns NULL when mirror not configured. */ { FilespaceDirEntry filespaceDirEntry; bool result = false; *primaryFilespaceLocation = NULL; *mirrorFilespaceLocation = NULL; #ifdef MASTER_MIRROR_SYNC /* * Can't rely on persistent tables or memory structures on the standby so * get it from the cache maintained by the master mirror sync code */ if (IsStandbyMode()) { return mmxlog_filespace_get_path( filespaceOid, primaryFilespaceLocation); } #endif /* * Important to make this call AFTER we check if we are the Standby * Master. */ PersistentFilespace_VerifyInitScan(); LWLockAcquire(FilespaceHashLock, LW_SHARED); filespaceDirEntry = PersistentFilespace_FindDirUnderLock(filespaceOid); if (filespaceDirEntry) { PersistentFilespace_GetPaths(filespaceDirEntry, primaryFilespaceLocation, mirrorFilespaceLocation); result = true; } LWLockRelease(FilespaceHashLock); return result; }
PersistentTablespaceGetFilespaces PersistentFilespace_GetFilespaceFromTablespace(Oid tablespaceOid, char **primaryFilespaceLocation, char **mirrorFilespaceLocation, Oid *filespaceOid) { bool found; TablespaceDirEntry tablespaceDirEntry; TablespaceDirEntryKey tsKey; FilespaceDirEntry filespaceDirEntry; FilespaceDirEntryKey fsKey; PersistentTablespaceGetFilespaces result; if (persistentTablespaceSharedHashTable == NULL) elog(PANIC, "persistent tablespace shared-memory not setup"); if (persistentFilespaceSharedHashTable == NULL) elog(PANIC, "persistent filespace shared-memory not setup"); LWLockAcquire(FilespaceHashLock, LW_SHARED); LWLockAcquire(TablespaceHashLock, LW_SHARED); tsKey.tablespaceOid = tablespaceOid; tablespaceDirEntry = (TablespaceDirEntry) hash_search( persistentTablespaceSharedHashTable, (void *) &tsKey, HASH_FIND, &found); if (found) { fsKey.filespaceOid = *filespaceOid = tablespaceDirEntry->filespaceOid; filespaceDirEntry = (FilespaceDirEntry) hash_search( persistentFilespaceSharedHashTable, (void *) &fsKey, HASH_FIND, &found); if (found) { result = PersistentTablespaceGetFilespaces_Ok; } else result = PersistentTablespaceGetFilespaces_FilespaceNotFound; } else result = PersistentTablespaceGetFilespaces_TablespaceNotFound; if (result == PersistentTablespaceGetFilespaces_Ok) PersistentFilespace_GetPaths(filespaceDirEntry, primaryFilespaceLocation, mirrorFilespaceLocation); LWLockRelease(TablespaceHashLock); LWLockRelease(FilespaceHashLock); return result; }