fix resize file
This commit is contained in:
parent
03001c1fe3
commit
d1a8226c32
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user