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;
}