From d1a8226c32b8e86587c000303afcb99726d0e356 Mon Sep 17 00:00:00 2001 From: cd Date: Wed, 16 Jun 2021 11:38:56 +0800 Subject: [PATCH] fix resize file --- src/storage/blocksstable/ob_store_file.cpp | 102 +++++++++++---------- 1 file changed, 52 insertions(+), 50 deletions(-) diff --git a/src/storage/blocksstable/ob_store_file.cpp b/src/storage/blocksstable/ob_store_file.cpp index 749ea98158..e4aaa0197f 100644 --- a/src/storage/blocksstable/ob_store_file.cpp +++ b/src/storage/blocksstable/ob_store_file.cpp @@ -1262,65 +1262,67 @@ void ObStoreFile::set_mark_sweep_done() int ObStoreFile::resize_file(const int64_t new_data_file_size, const int64_t new_data_file_disk_percentage) { int ret = OB_SUCCESS; - lib::ObMutexGuard guard(block_lock_); disable_mark_sweep(); if (OB_ISNULL(store_file_system_)) { // do nothing } else if (OB_FAIL(wait_mark_sweep_finish())) { LOG_WARN("fail to wait mark and sweep finish", K(ret)); - } else if (OB_FAIL(store_file_system_->resize_file(new_data_file_size, new_data_file_disk_percentage))) { - LOG_WARN("fail to resize file", K(ret)); } else { - const int64_t new_total_file_size = + lib::ObMutexGuard guard(block_lock_); + if (OB_FAIL(store_file_system_->resize_file(new_data_file_size, new_data_file_disk_percentage))) { + LOG_WARN("fail to resize file", K(ret)); + } else { + const int64_t new_total_file_size = lower_align(store_file_system_->get_total_data_size(), store_file_system_->get_macro_block_size()); - const int64_t new_macro_block_cnt = new_total_file_size / store_file_system_->get_macro_block_size(); - const int64_t origin_macro_block_cnt = store_file_system_->get_total_macro_block_count(); - if (new_macro_block_cnt > origin_macro_block_cnt) { - uint32_t* new_free_block_array = nullptr; - uint64_t* new_macro_block_bitmap = nullptr; - ObServerSuperBlock super_block = store_file_system_->get_server_super_block(); - super_block.content_.total_file_size_ = new_total_file_size; - super_block.content_.total_macro_block_count_ = new_macro_block_cnt; - super_block.content_.modify_timestamp_ = ObTimeUtility::current_time(); - ObStorageFile* file = OB_FILE_SYSTEM.get_server_root_handle().get_storage_file(); - if (OB_ISNULL(file)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("error unexpected, file must not be null", K(ret)); - } else if (OB_FAIL(alloc_memory( - new_macro_block_cnt, new_free_block_array, new_macro_block_bitmap, macro_block_info_))) { - LOG_WARN("fail to alloc memory", K(ret), K(new_macro_block_cnt)); - } else if (OB_FAIL(file->write_super_block(super_block))) { - LOG_WARN("fail to write super block", K(ret)); - } else { - // copy free block info to new_free_block_array - if (free_block_pop_pos_ > free_block_push_pos_) { - MEMCPY(new_free_block_array, - free_block_array_ + free_block_pop_pos_, - (origin_macro_block_cnt - free_block_pop_pos_) * sizeof(uint32_t)); - MEMCPY(new_free_block_array + origin_macro_block_cnt - free_block_pop_pos_, - free_block_array_, - free_block_push_pos_ * sizeof(uint32_t)); - } else if (free_block_pop_pos_ < free_block_push_pos_) { - MEMCPY(new_free_block_array, - free_block_array_ + free_block_pop_pos_, - (free_block_push_pos_ - free_block_pop_pos_) * sizeof(uint32_t)); + const int64_t new_macro_block_cnt = new_total_file_size / store_file_system_->get_macro_block_size(); + const int64_t origin_macro_block_cnt = store_file_system_->get_total_macro_block_count(); + if (new_macro_block_cnt > origin_macro_block_cnt) { + uint32_t* new_free_block_array = nullptr; + uint64_t* new_macro_block_bitmap = nullptr; + ObServerSuperBlock super_block = store_file_system_->get_server_super_block(); + super_block.content_.total_file_size_ = new_total_file_size; + super_block.content_.total_macro_block_count_ = new_macro_block_cnt; + super_block.content_.modify_timestamp_ = ObTimeUtility::current_time(); + ObStorageFile* file = OB_FILE_SYSTEM.get_server_root_handle().get_storage_file(); + if (OB_ISNULL(file)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("error unexpected, file must not be null", K(ret)); + } else if (OB_FAIL(alloc_memory( + new_macro_block_cnt, new_free_block_array, new_macro_block_bitmap, macro_block_info_))) { + LOG_WARN("fail to alloc memory", K(ret), K(new_macro_block_cnt)); + } else if (OB_FAIL(file->write_super_block(super_block))) { + LOG_WARN("fail to write super block", K(ret)); } else { - MEMCPY(new_free_block_array, free_block_array_, free_block_cnt_ * sizeof(uint32_t)); + // copy free block info to new_free_block_array + if (free_block_pop_pos_ > free_block_push_pos_) { + MEMCPY(new_free_block_array, + free_block_array_ + free_block_pop_pos_, + (origin_macro_block_cnt - free_block_pop_pos_) * sizeof(uint32_t)); + MEMCPY(new_free_block_array + origin_macro_block_cnt - free_block_pop_pos_, + free_block_array_, + free_block_push_pos_ * sizeof(uint32_t)); + } else if (free_block_pop_pos_ < free_block_push_pos_) { + MEMCPY(new_free_block_array, + free_block_array_ + free_block_pop_pos_, + (free_block_push_pos_ - free_block_pop_pos_) * sizeof(uint32_t)); + } else { + MEMCPY(new_free_block_array, free_block_array_, free_block_cnt_ * sizeof(uint32_t)); + } + free_block_pop_pos_ = 0; + free_block_push_pos_ = free_block_cnt_; + MEMCPY(new_macro_block_bitmap, + macro_block_bitmap_, + get_macro_bitmap_array_cnt(origin_macro_block_cnt) * sizeof(uint64_t)); + allocator_.free(free_block_array_); + allocator_.free(macro_block_bitmap_); + free_block_array_ = new_free_block_array; + macro_block_bitmap_ = new_macro_block_bitmap; + LOG_INFO("succeed to resize file", K(new_data_file_size)); + } + if (OB_FAIL(ret)) { + allocator_.free(new_free_block_array); + allocator_.free(new_macro_block_bitmap); } - free_block_pop_pos_ = 0; - free_block_push_pos_ = free_block_cnt_; - MEMCPY(new_macro_block_bitmap, - macro_block_bitmap_, - get_macro_bitmap_array_cnt(origin_macro_block_cnt) * sizeof(uint64_t)); - allocator_.free(free_block_array_); - allocator_.free(macro_block_bitmap_); - free_block_array_ = new_free_block_array; - macro_block_bitmap_ = new_macro_block_bitmap; - LOG_INFO("succeed to resize file", K(new_data_file_size)); - } - if (OB_FAIL(ret)) { - allocator_.free(new_free_block_array); - allocator_.free(new_macro_block_bitmap); } } } -- GitLab