in cpp/src/file/tsfile_io_writer.cc [489:547]
int TsFileIOWriter::build_device_level(DeviceNodeMap &device_map,
std::shared_ptr<MetaIndexNode> &ret_root,
FileIndexWritingMemManager &wmm) {
int ret = E_OK;
SimpleList<std::shared_ptr<MetaIndexNode>> node_queue(
1024,
MOD_TSFILE_WRITER_META); // FIXME
DeviceNodeMapIterator device_map_iter;
std::shared_ptr<MetaIndexNode> cur_index_node = nullptr;
if (RET_FAIL(
alloc_and_init_meta_index_node(wmm, cur_index_node, LEAF_DEVICE))) {
return ret;
}
for (device_map_iter = device_map.begin();
device_map_iter != device_map.end() && IS_SUCC(ret);
device_map_iter++) {
auto device_id = device_map_iter->first;
std::shared_ptr<IMetaIndexEntry> entry = nullptr;
if (cur_index_node->is_full()) {
cur_index_node->end_offset_ = cur_file_position();
#if DEBUG_SE
std::cout << "TsFileIOWriter::build_device_level, cur_index_node="
<< *cur_index_node << std::endl;
#endif
if (RET_FAIL(node_queue.push_back(cur_index_node))) {
} else if (RET_FAIL(alloc_and_init_meta_index_node(
wmm, cur_index_node, LEAF_DEVICE))) {
}
}
if (RET_FAIL(alloc_and_init_meta_index_entry(wmm, entry, device_id))) {
} else if (RET_FAIL(
device_map_iter->second->serialize_to(write_stream_))) {
} else if (RET_FAIL(cur_index_node->push_entry(entry))) {
}
} // end for
if (IS_SUCC(ret)) {
if (!cur_index_node->is_empty()) {
cur_index_node->end_offset_ = cur_file_position();
ret = node_queue.push_back(cur_index_node);
}
}
if (IS_SUCC(ret)) {
if (node_queue.size() > 0) {
if (RET_FAIL(generate_root(&node_queue, ret_root, INTERNAL_DEVICE,
wmm))) {
}
} else {
ret_root = cur_index_node;
ret_root->end_offset_ = cur_file_position();
ret_root->node_type_ = LEAF_DEVICE;
}
}
destroy_node_list(&node_queue);
return ret;
}