Skip to content

Commit 019838e

Browse files
obdevgaopy3
authored andcommitted
fix storage opt problem
Co-authored-by: gaopy3 <gao.panyu@qq.com>
1 parent 0b11119 commit 019838e

7 files changed

Lines changed: 40 additions & 26 deletions

File tree

src/observer/ob_server_reload_config.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,8 @@ int ObServerReloadConfig::operator()()
297297
} else if (OB_TMP_FAIL(SERVER_STORAGE_META_SERVICE.get_reserved_size(reserved_size))) {
298298
LOG_WARN("fail to get reserved size", KR(tmp_ret), K(reserved_size));
299299
} else if (OB_TMP_FAIL(OB_STORAGE_OBJECT_MGR.resize_local_device(
300+
OB_STORAGE_OBJECT_MGR.get_total_macro_block_count()
301+
* OB_STORAGE_OBJECT_MGR.get_macro_block_size(),
300302
data_disk_size, data_disk_percentage, reserved_size))) {
301303
LOG_WARN("fail to resize file", KR(tmp_ret),
302304
K(data_disk_size), K(data_disk_percentage), K(reserved_size));

src/observer/ob_server_utils.cpp

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,7 @@ int ObServerUtils::get_log_disk_info_in_config(int64_t& log_disk_size,
5757
int64_t& total_log_disk_size)
5858
{
5959
int ret = OB_SUCCESS;
60-
const int64_t DEFAULT_LOG_DISK_SIZE = MIN(MAX(2LL << 30, lib::get_memory_limit() / 2), 8LL << 30);
61-
int64_t suggested_data_disk_size = GCONF.datafile_size;
62-
int64_t suggested_data_disk_percentage = GCONF.datafile_disk_percentage;
60+
const int64_t DEFAULT_LOG_DISK_SIZE = MAX(2LL << 30, lib::get_memory_limit() / 2);
6361
int64_t suggested_clog_disk_size = 0 == GCONF.log_disk_size ? DEFAULT_LOG_DISK_SIZE : GCONF.log_disk_size;
6462
int64_t suggested_clog_disk_percentage = GCONF.log_disk_percentage;
6563
int64_t data_default_disk_percentage = 0;
@@ -75,21 +73,19 @@ int ObServerUtils::get_log_disk_info_in_config(int64_t& log_disk_size,
7573
clog_default_disk_percentage,
7674
shared_mode))) {
7775
LOG_ERROR("cal all part disk default percentage failed",
78-
KR(ret), K(data_dir), K(suggested_data_disk_size), K(suggested_data_disk_percentage),
79-
K(data_default_disk_percentage), K(shared_mode));
76+
KR(ret), K(data_dir), K(data_default_disk_percentage), K(shared_mode));
8077
} else if (OB_FAIL(decide_disk_size(clog_disk_total_size,
8178
suggested_clog_disk_size,
8279
suggested_clog_disk_percentage,
8380
clog_default_disk_percentage,
8481
log_disk_size,
8582
log_disk_percentage))) {
8683
LOG_ERROR("decide disk size failed",
87-
KR(ret), K(data_dir), K(suggested_data_disk_size), K(suggested_data_disk_percentage),
88-
K(data_default_disk_percentage), K(shared_mode));
84+
KR(ret), K(data_dir), K(data_default_disk_percentage), K(shared_mode));
8985
} else {
9086
total_log_disk_size = clog_disk_total_size;
91-
LOG_INFO("get_log_disk_info_in_config", K(suggested_data_disk_size), K(suggested_clog_disk_size),
92-
K(suggested_data_disk_percentage), K(suggested_clog_disk_percentage), K(log_disk_size),
87+
LOG_INFO("get_log_disk_info_in_config", K(suggested_clog_disk_size),
88+
K(suggested_clog_disk_percentage), K(log_disk_size),
9389
K(log_disk_percentage), K(total_log_disk_size));
9490
}
9591
return ret;
@@ -99,11 +95,8 @@ int ObServerUtils::get_data_disk_info_in_config(int64_t& data_disk_size,
9995
int64_t& data_disk_percentage)
10096
{
10197
int ret = OB_SUCCESS;
102-
const int64_t DEFAULT_LOG_DISK_SIZE = MIN(MAX(2LL << 30, lib::get_memory_limit() / 2), 8LL << 30);
10398
int64_t suggested_data_disk_size = GCONF.datafile_size;
10499
int64_t suggested_data_disk_percentage = GCONF.datafile_disk_percentage;
105-
int64_t suggested_clog_disk_size = 0 == GCONF.log_disk_size ? DEFAULT_LOG_DISK_SIZE : GCONF.log_disk_size;
106-
int64_t suggested_clog_disk_percentage = GCONF.log_disk_percentage;
107100
int64_t data_default_disk_percentage = 0;
108101
int64_t clog_default_disk_percentage = 0;
109102
int64_t data_disk_total_size = 0;
@@ -129,8 +122,8 @@ int ObServerUtils::get_data_disk_info_in_config(int64_t& data_disk_size,
129122
KR(ret), K(data_dir), K(suggested_data_disk_size), K(suggested_data_disk_percentage),
130123
K(data_default_disk_percentage), K(shared_mode));
131124
} else {
132-
LOG_INFO("get_data_disk_info_in_config", K(suggested_data_disk_size), K(suggested_clog_disk_size),
133-
K(suggested_data_disk_percentage), K(suggested_clog_disk_percentage), K(data_disk_size),
125+
LOG_INFO("get_data_disk_info_in_config", K(suggested_data_disk_size),
126+
K(suggested_data_disk_percentage), K(data_disk_size),
134127
K(data_disk_percentage));
135128
}
136129
return ret;
@@ -207,7 +200,7 @@ const char *ObServerUtils::build_syslog_file_info()
207200
* 1. if datafile_next less than 32M, actual_extend_size equal to min(32M, datafile_maxsize * 10%)
208201
* 2. if datafile_next large than 32M, actual_extend_size equal to min(datafile_next, max_extend_file)
209202
*/
210-
int ObServerUtils::calc_auto_extend_size(int64_t &actual_extend_size)
203+
int ObServerUtils::calc_auto_extend_size(int64_t &cur_datafile_size, int64_t &actual_extend_size)
211204
{
212205
int ret = OB_SUCCESS;
213206

@@ -248,6 +241,7 @@ int ObServerUtils::calc_auto_extend_size(int64_t &actual_extend_size)
248241
}
249242
} else {
250243
actual_extend_size += datafile_size; // suggest block file size
244+
cur_datafile_size = datafile_size;
251245
}
252246
}
253247
return ret;

src/observer/ob_server_utils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class ObServerUtils
6464
// - OS info
6565
// - timezone info
6666
static const char *build_syslog_file_info();
67-
static int calc_auto_extend_size(int64_t &actual_extend_size);
67+
static int calc_auto_extend_size(int64_t &cur_datafile_size, int64_t &actual_extend_size);
6868

6969
private:
7070
static int decide_disk_size(const struct statvfs& svfs,

src/storage/blocksstable/ob_block_manager.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -259,10 +259,14 @@ int ObBlockManager::inner_alloc_block(ObIODOpts &opts, ObIOFd &io_fd) {
259259
while (need_retry) {
260260
ret = io_device_->alloc_block(&opts, io_fd);
261261
if (OB_SERVER_OUTOF_DISK_SPACE == ret) {
262-
if (OB_FAIL(extend_file_size_if_need())) {
262+
const int tmp_ret = extend_file_size_if_need();
263+
if (OB_SUCCESS == tmp_ret || OB_EAGAIN == tmp_ret) {
264+
// need to retry
265+
} else {
263266
ret = OB_SERVER_OUTOF_DISK_SPACE;
264267
need_retry = false;
265-
LOG_ERROR("The data file disk space is exhausted. Please expand the capacity by resizing datafile!!!", K(ret));
268+
LOG_ERROR("The data file disk space is exhausted. Please expand the capacity by resizing datafile!!!",
269+
K(ret), K(tmp_ret));
266270
}
267271
} else {
268272
need_retry = false;
@@ -1745,14 +1749,15 @@ int ObBlockManager::extend_file_size_if_need() {
17451749

17461750
int64_t suggest_extend_size = 0;
17471751
int64_t datafile_disk_percentage = 0;
1752+
int64_t cur_datafile_size = 0;
17481753

17491754
if (OB_FAIL(observer::ObServerUtils::calc_auto_extend_size(
1750-
suggest_extend_size))) {
1755+
cur_datafile_size, suggest_extend_size))) {
17511756
LOG_DEBUG("calc auto extend size error, maybe ssblock file has reach "
17521757
"it's max size",
17531758
K(ret));
17541759
} else if (OB_FAIL(OB_STORAGE_OBJECT_MGR.resize_local_device(
1755-
suggest_extend_size, datafile_disk_percentage,
1760+
cur_datafile_size, suggest_extend_size, datafile_disk_percentage,
17561761
reserved_size))) {
17571762
LOG_WARN("Fail to resize file in auto extend", K(ret),
17581763
K(suggest_extend_size));

src/storage/blocksstable/ob_object_manager.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,7 @@ int ObObjectManager::dec_ref(const MacroBlockId &object_id) const
410410
}
411411

412412
int ObObjectManager::resize_local_device(
413+
const int64_t expected_current_size,
413414
const int64_t new_device_size,
414415
const int64_t new_device_disk_percentage,
415416
const int64_t reserved_size)
@@ -422,9 +423,14 @@ int ObObjectManager::resize_local_device(
422423
LOG_WARN("not init", K(ret));
423424
} else if (!is_shared_storage_) {
424425
SpinWLockGuard guard(lock_);
426+
const int64_t current_size = get_total_macro_block_count() * get_macro_block_size();
427+
if (expected_current_size != current_size) {
428+
ret = OB_EAGAIN;
429+
}
425430
HEAP_VAR(ObServerSuperBlock, tmp_super_block) {
426431
tmp_super_block = super_block_;
427-
if (OB_FAIL(OB_SERVER_BLOCK_MGR.resize_file(
432+
if (OB_FAIL(ret)) {
433+
} else if (OB_FAIL(OB_SERVER_BLOCK_MGR.resize_file(
428434
new_device_size, new_device_disk_percentage, reserved_size, tmp_super_block))) {
429435
LOG_WARN("fail to resize file", K(ret), K(new_device_size), K(new_device_disk_percentage), K(reserved_size));
430436
} else if (OB_FAIL(OB_SERVER_BLOCK_MGR.write_super_block(tmp_super_block, super_block_buf_holder_))) {

src/storage/blocksstable/ob_object_manager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,7 @@ class ObObjectManager final
368368
int inc_ref(const MacroBlockId &object_id) const;
369369
int dec_ref(const MacroBlockId &object_id) const;
370370
int resize_local_device(
371+
const int64_t expected_current_size,
371372
const int64_t new_device_size,
372373
const int64_t new_device_disk_percentage,
373374
const int64_t reserved_size);

unittest/storage/blocksstable/test_block_manager.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,11 @@ TEST_F(TestBlockManager, test_ref_cnt_wash_and_load)
336336
ASSERT_TRUE(block_info.access_time_ > 0);
337337
}
338338

339+
int64_t get_current_datafile_size()
340+
{
341+
return OB_STORAGE_OBJECT_MGR.get_total_macro_block_count() * OB_STORAGE_OBJECT_MGR.get_macro_block_size();
342+
}
343+
339344
TEST_F(TestBlockManager, test_resize_file_1)
340345
{
341346
struct statvfs svfs;
@@ -344,16 +349,16 @@ TEST_F(TestBlockManager, test_resize_file_1)
344349
int used_space = OB_STORAGE_OBJECT_MGR.get_total_macro_block_count() * OB_STORAGE_OBJECT_MGR.get_macro_block_size();
345350

346351
double percentage = used_space * 1.0 / (used_space + free_space) + 1;
347-
int ret = OB_STORAGE_OBJECT_MGR.resize_local_device(0, percentage, 0);
352+
int ret = OB_STORAGE_OBJECT_MGR.resize_local_device(get_current_datafile_size(), 0, percentage, 0);
348353
ASSERT_EQ(common::OB_SUCCESS, ret);
349354

350355
int64_t free_blk_cnt_1 = OB_SERVER_BLOCK_MGR.io_device_->get_free_block_count();
351-
ret = OB_STORAGE_OBJECT_MGR.resize_local_device(used_space + free_space / 2, 99, 0);
356+
ret = OB_STORAGE_OBJECT_MGR.resize_local_device(get_current_datafile_size(), used_space + free_space / 2, 99, 0);
352357
ASSERT_EQ(common::OB_SUCCESS, ret);
353358
int64_t free_blk_cnt_2 = OB_SERVER_BLOCK_MGR.io_device_->get_free_block_count();
354359
ASSERT_TRUE(free_space > 0 ? free_blk_cnt_1 < free_blk_cnt_2 : free_blk_cnt_1 == free_blk_cnt_2);
355360

356-
ret = OB_STORAGE_OBJECT_MGR.resize_local_device(used_space, 99, 0);
361+
ret = OB_STORAGE_OBJECT_MGR.resize_local_device(get_current_datafile_size(), used_space, 99, 0);
357362
ASSERT_EQ(common::OB_NOT_SUPPORTED, ret);
358363
int64_t free_blk_cnt_3 = OB_SERVER_BLOCK_MGR.io_device_->get_free_block_count();
359364
ASSERT_TRUE(free_blk_cnt_2 == free_blk_cnt_3);
@@ -365,12 +370,13 @@ TEST_F(TestBlockManager, test_resize_file_2)
365370
statvfs(util_.storage_env_.sstable_dir_, &svfs);
366371
int64_t free_space = svfs.f_bavail * svfs.f_bsize;
367372
int used_space = OB_STORAGE_OBJECT_MGR.get_total_macro_block_count() * OB_STORAGE_OBJECT_MGR.get_macro_block_size();
368-
int ret = OB_STORAGE_OBJECT_MGR.resize_local_device(used_space + 2 * free_space, 99, 0);
373+
int ret = OB_STORAGE_OBJECT_MGR.resize_local_device(get_current_datafile_size(), used_space + 2 * free_space, 99, 0);
369374
ASSERT_EQ(common::OB_SERVER_OUTOF_DISK_SPACE, ret);
370375

371376
int64_t delta_space = free_space - 100 * 1024 * 1024 * 1024L;
372377
int64_t min_space = 0;
373-
ret = OB_STORAGE_OBJECT_MGR.resize_local_device(used_space + std::max(delta_space, min_space), 99, 0);
378+
ret = OB_STORAGE_OBJECT_MGR.resize_local_device(get_current_datafile_size(),
379+
used_space + std::max(delta_space, min_space), 99, 0);
374380
ASSERT_EQ(common::OB_SUCCESS, ret);
375381
}
376382

0 commit comments

Comments
 (0)