Repository: incubator-hawq Updated Branches: refs/heads/master 0ec66d57d -> a9e010eda
HAWQ-222. add revert block info maps Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/a9e010ed Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/a9e010ed Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/a9e010ed Branch: refs/heads/master Commit: a9e010eda9380db8b7020317330d8923bde51e6d Parents: 0ec66d5 Author: ivan <iw...@pivotal.io> Authored: Mon Dec 7 14:38:07 2015 +0800 Committer: ivan <iw...@pivotal.io> Committed: Mon Dec 7 14:38:07 2015 +0800 ---------------------------------------------------------------------- src/backend/cdb/cdbmetadatacache.c | 107 +++++++++++++++++++++++++------- 1 file changed, 86 insertions(+), 21 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/a9e010ed/src/backend/cdb/cdbmetadatacache.c ---------------------------------------------------------------------- diff --git a/src/backend/cdb/cdbmetadatacache.c b/src/backend/cdb/cdbmetadatacache.c index dbf1a65..cef839f 100644 --- a/src/backend/cdb/cdbmetadatacache.c +++ b/src/backend/cdb/cdbmetadatacache.c @@ -92,6 +92,17 @@ typedef struct BlockInfoEntry uint16_t index; } BlockInfoEntry; +typedef struct RevertBlockInfoKey +{ + uint16_t index; +} RevertBlockInfoKey; + +typedef struct RevertBlockInfoEntry +{ + RevertBlockInfoKey key; + char block_info[MAX_BLOCK_INFO_LEN]; +} RevertBlockInfoEntry; + /* * Metadata Cache Global Initialization Functions */ @@ -101,6 +112,9 @@ MetadataCacheHashTableInit(void); static bool MetadataBlockInfoTablesInit(void); +static bool +MetadataRevertBlockInfoTablesInit(void); + static bool MetadataCacheHdfsBlockArrayInit(void); @@ -145,6 +159,10 @@ static HTAB *BlockHostsMap = NULL; static HTAB *BlockNamesMap = NULL; static HTAB *BlockTopologyPathsMap = NULL; +static HTAB *RevertBlockHostsMap = NULL; +static HTAB *RevertBlockNamesMap = NULL; +static HTAB *RevertBlockTopologyPathsMap = NULL; + //static BlockLocation *CreateHdfsFileBlockLocations(BlockLocation *hdfs_locations, int block_num); static BlockLocation *MergeHdfsFileBlockLocations(BlockLocation *locations1, int block_num1, BlockLocation *locations2, int block_num2); @@ -218,6 +236,11 @@ MetadataCache_ShmemInit(void) elog(FATAL, "[MetadataCache] fail to allocate share memory for metadata cache block info hash tables"); } + if (!MetadataRevertBlockInfoTablesInit()) + { + elog(FATAL, "[MetadataCache] fail to allocate share memory for metadata cache revert block info hash tables"); + } + if (!MetadataCacheHdfsBlockArrayInit()) { elog(FATAL, "[MetadataCache] fail to allocate share memory for metadata cache hdfs block array"); @@ -293,6 +316,43 @@ MetadataBlockInfoTablesInit(void) } /* + * Initialize metadata revert block info hash tables + */ +bool +MetadataRevertBlockInfoTablesInit(void) +{ + HASHCTL info; + int hash_flags; + + MemSet(&info, 0, sizeof(info)); + + info.keysize = sizeof(RevertBlockInfoKey); + info.entrysize = sizeof(RevertBlockInfoEntry); + hash_flags = HASH_ELEM; + + RevertBlockHostsMap = ShmemInitHash("Metadata Revert Block Hosts Map", MAX_HDFS_HOST_NUM, MAX_HDFS_HOST_NUM, &info, hash_flags); + if (NULL == RevertBlockHostsMap) + { + return false; + } + + RevertBlockNamesMap = ShmemInitHash("Metadata Revert Block Names Map", MAX_HDFS_HOST_NUM, MAX_HDFS_HOST_NUM, &info, hash_flags); + if (NULL == RevertBlockNamesMap) + { + return false; + } + + RevertBlockTopologyPathsMap = ShmemInitHash("Metadata Revert Block TopologyPaths Map", MAX_HDFS_HOST_NUM, MAX_HDFS_HOST_NUM, &info, hash_flags); + if (NULL == RevertBlockTopologyPathsMap) + { + return false; + } + + return true; +} + + +/* * Initialize metadata hdfs block array */ bool @@ -482,22 +542,30 @@ SetMetadataBlockInfo(MetadataBlockInfoType type, char **infos, uint32_t num) BlockInfoKey key; BlockInfoEntry *entry; HTAB *htab = NULL; + + RevertBlockInfoKey rkey; + RevertBlockInfoEntry *rentry; + HTAB *rhtab = NULL; + uint32_t *cur_idx = NULL; switch (type) { case METADATA_BLOCK_INFO_TYPE_HOSTS: htab = BlockHostsMap; + rhtab = RevertBlockHostsMap; cur_idx = &MetadataCacheSharedDataInstance->cur_hosts_idx; break; case METADATA_BLOCK_INFO_TYPE_NAMES: htab = BlockNamesMap; + rhtab = RevertBlockNamesMap; cur_idx = &MetadataCacheSharedDataInstance->cur_names_idx; break; case METADATA_BLOCK_INFO_TYPE_TOPOLOGYPATHS: htab = BlockTopologyPathsMap; + rhtab = RevertBlockTopologyPathsMap; cur_idx = &MetadataCacheSharedDataInstance->cur_topologyPaths_idx; break; @@ -520,6 +588,11 @@ SetMetadataBlockInfo(MetadataBlockInfoType type, char **infos, uint32_t num) { (*cur_idx)++; entry->index = (*cur_idx); + + rkey.index = (*cur_idx); + rentry = hash_search(rhtab, (void *)&rkey, HASH_ENTER_NULL, &found); + memset(rentry->block_info, 0, MAX_BLOCK_INFO_LEN); + snprintf(rentry->block_info, MAX_BLOCK_INFO_LEN, "%s", infos[i]); } entry_idx = entry->index; result |= (entry_idx << (i * BLOCK_INFO_BIT_NUM)); @@ -536,26 +609,25 @@ char * GetMetadataBlockInfo(MetadataBlockInfoType type, uint64_t infos, int index) { Insist(index >= 0 && index < 4); - - HASH_SEQ_STATUS hstat; - BlockInfoEntry *entry; - char *result = NULL; - HTAB *htab = NULL; + + RevertBlockInfoKey rkey; + RevertBlockInfoEntry *rentry; + HTAB *rhtab = NULL; uint64_t mask; - int infos_idx = -1; + bool found; switch (type) { case METADATA_BLOCK_INFO_TYPE_HOSTS: - htab = BlockHostsMap; + rhtab = RevertBlockHostsMap; break; case METADATA_BLOCK_INFO_TYPE_NAMES: - htab = BlockNamesMap; + rhtab = RevertBlockNamesMap; break; case METADATA_BLOCK_INFO_TYPE_TOPOLOGYPATHS: - htab = BlockTopologyPathsMap; + rhtab = RevertBlockTopologyPathsMap; break; default: @@ -564,20 +636,13 @@ GetMetadataBlockInfo(MetadataBlockInfoType type, uint64_t infos, int index) mask = 0x000000000000ffff; mask = mask << (index * BLOCK_INFO_BIT_NUM); - infos_idx = (mask & infos) >> (index * BLOCK_INFO_BIT_NUM); + rkey.index = (mask & infos) >> (index * BLOCK_INFO_BIT_NUM); - hash_seq_init(&hstat, htab); - while ((entry = (BlockInfoEntry *)hash_seq_search(&hstat)) != NULL) - { - if (entry->index == infos_idx) - { - result = entry->key.block_info; - hash_seq_term(&hstat); - break; - } + rentry = (RevertBlockInfoEntry *)hash_search(rhtab, (void *)&rkey, HASH_FIND, &found); + if (!found) { + return NULL; } - - return result; + return rentry->block_info; } /*