oceanbase
442 строки · 20.8 Кб
1/**
2* Copyright (c) 2021 OceanBase
3* OceanBase CE is licensed under Mulan PubL v2.
4* You can use this software according to the terms and conditions of the Mulan PubL v2.
5* You may obtain a copy of Mulan PubL v2 at:
6* http://license.coscl.org.cn/MulanPubL-2.0
7* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
8* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
9* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10* See the Mulan PubL v2 for more details.
11*/
12
13#include "lib/ob_define.h"
14#include "lib/ob_errno.h"
15#include <cstdio>
16#include <gtest/gtest.h>
17#include <signal.h>
18#include <stdexcept>
19#define private public
20#define protected public
21#include "env/ob_simple_log_cluster_env.h"
22#undef private
23#undef protected
24#include "logservice/palf/log_reader_utils.h"
25#include "logservice/palf/log_define.h"
26#include "logservice/palf/log_group_entry_header.h"
27#include "logservice/palf/log_io_worker.h"
28#include "logservice/palf/lsn.h"
29
30const std::string TEST_NAME = "log_disk_mgr";
31
32using namespace oceanbase::common;
33using namespace oceanbase;
34namespace oceanbase
35{
36using namespace logservice;
37namespace unittest
38{
39class TestObSimpleLogDiskMgr : public ObSimpleLogClusterTestEnv
40{
41public:
42TestObSimpleLogDiskMgr() : ObSimpleLogClusterTestEnv()
43{
44int ret = init();
45if (OB_SUCCESS != ret) {
46throw std::runtime_error("TestObSimpleLogDiskMgr init failed");
47}
48}
49~TestObSimpleLogDiskMgr()
50{
51destroy();
52}
53int init()
54{
55return OB_SUCCESS;
56}
57void destroy()
58{}
59int64_t id_;
60};
61
62int64_t ObSimpleLogClusterTestBase::member_cnt_ = 1;
63int64_t ObSimpleLogClusterTestBase::node_cnt_ = 1;
64std::string ObSimpleLogClusterTestBase::test_name_ = TEST_NAME;
65bool ObSimpleLogClusterTestBase::need_add_arb_server_ = false;
66
67TEST_F(TestObSimpleLogDiskMgr, out_of_disk_space)
68{
69update_server_log_disk(10*1024*1024*1024ul);
70update_disk_options(10*1024*1024*1024ul/palf::PALF_PHY_BLOCK_SIZE);
71SET_CASE_LOG_FILE(TEST_NAME, "out_of_disk_space");
72int64_t id = ATOMIC_AAF(&palf_id_, 1);
73int server_idx = 0;
74PalfEnv *palf_env = NULL;
75int64_t leader_idx = 0;
76PalfHandleImplGuard leader;
77share::SCN create_scn = share::SCN::base_scn();
78EXPECT_EQ(OB_SUCCESS, get_palf_env(server_idx, palf_env));
79EXPECT_EQ(OB_SUCCESS, create_paxos_group(id, create_scn, leader_idx, leader));
80update_disk_options(leader_idx, MIN_DISK_SIZE_PER_PALF_INSTANCE/PALF_PHY_BLOCK_SIZE + 2);
81EXPECT_EQ(OB_SUCCESS, submit_log(leader, 8*31+1, id, MAX_LOG_BODY_SIZE));
82LogStorage *log_storage = &leader.palf_handle_impl_->log_engine_.log_storage_;
83while (LSN(6*PALF_BLOCK_SIZE) > log_storage->log_tail_) {
84usleep(500);
85}
86EXPECT_EQ(OB_SUCCESS, submit_log(leader, 20, id, MAX_LOG_BODY_SIZE));
87while (LSN(6*PALF_BLOCK_SIZE + 20 * MAX_LOG_BODY_SIZE) > log_storage->log_tail_) {
88usleep(500);
89}
90LSN max_lsn = leader.palf_handle_impl_->get_max_lsn();
91wait_lsn_until_flushed(max_lsn, leader);
92PALF_LOG(INFO, "out of disk max_lsn", K(max_lsn));
93usleep(palf::BlockGCTimerTask::BLOCK_GC_TIMER_INTERVAL_MS + 5*10000);
94EXPECT_EQ(OB_LOG_OUTOF_DISK_SPACE, submit_log(leader, 1, id, MAX_LOG_BODY_SIZE));
95// shrinking 后继续停写
96update_disk_options(leader_idx, MIN_DISK_SIZE_PER_PALF_INSTANCE/PALF_PHY_BLOCK_SIZE);
97EXPECT_EQ(OB_LOG_OUTOF_DISK_SPACE, submit_log(leader, 1, id, MAX_LOG_BODY_SIZE));
98usleep(ObLooper::INTERVAL_US*2);
99}
100
101TEST_F(TestObSimpleLogDiskMgr, update_disk_options_basic)
102{
103SET_CASE_LOG_FILE(TEST_NAME, "update_disk_options_basic");
104OB_LOGGER.set_log_level("INFO");
105const int64_t id = ATOMIC_AAF(&palf_id_, 1);
106// 将日志盘空间设置为10GB
107update_disk_options(10*1024*1024*1024ul/PALF_PHY_BLOCK_SIZE);
108PALF_LOG(INFO, "start update_disk_options_basic", K(id));
109int64_t leader_idx = 0;
110PalfHandleImplGuard leader;
111PalfEnv *palf_env = NULL;
112EXPECT_EQ(OB_SUCCESS, create_paxos_group(id, leader_idx, leader));
113EXPECT_EQ(OB_SUCCESS, get_palf_env(leader_idx, palf_env));
114
115// 提交1G的日志
116EXPECT_EQ(OB_SUCCESS, submit_log(leader, 500, id, MAX_LOG_BODY_SIZE));
117EXPECT_EQ(OB_SUCCESS, wait_lsn_until_flushed(leader.palf_handle_impl_->get_max_lsn(), leader));
118
119EXPECT_EQ(OB_SUCCESS, update_disk_options(leader_idx, 20));
120usleep(1000*1000+palf::BlockGCTimerTask::BLOCK_GC_TIMER_INTERVAL_MS);
121EXPECT_EQ(PalfDiskOptionsWrapper::Status::SHRINKING_STATUS,
122palf_env->palf_env_impl_.disk_options_wrapper_.status_);
123EXPECT_EQ(palf_env->palf_env_impl_.disk_options_wrapper_.disk_opts_for_recycling_blocks_.log_disk_usage_limit_size_,
12420*PALF_PHY_BLOCK_SIZE);
125
126// case1: 在上一次未缩容完成之前,可以继续缩容
127EXPECT_EQ(OB_SUCCESS, update_disk_options(leader_idx, 10));
128usleep(1000*1000+palf::BlockGCTimerTask::BLOCK_GC_TIMER_INTERVAL_MS);
129EXPECT_EQ(PalfDiskOptionsWrapper::Status::SHRINKING_STATUS,
130palf_env->palf_env_impl_.disk_options_wrapper_.status_);
131EXPECT_EQ(palf_env->palf_env_impl_.disk_options_wrapper_.disk_opts_for_recycling_blocks_.log_disk_usage_limit_size_,
13210*PALF_PHY_BLOCK_SIZE);
133// 此时日志盘依旧未完成缩容,ObSimpleLogServer维护的disk_opts_依旧是10GB
134{
135PalfDiskOptions opts;
136EXPECT_EQ(OB_SUCCESS, get_disk_options(leader_idx, opts));
137EXPECT_EQ(opts.log_disk_usage_limit_size_, 10*1024*1024*1024ul);
138}
139// case2: 在上一次未缩容完成之前,可以继续扩容, 同时由于扩容后日志盘依旧小于第一次缩容,因此依旧处于缩容状态.
140EXPECT_EQ(OB_SUCCESS, update_disk_options(leader_idx, 11));
141usleep(1000*1000+palf::BlockGCTimerTask::BLOCK_GC_TIMER_INTERVAL_MS);
142EXPECT_EQ(PalfDiskOptionsWrapper::Status::SHRINKING_STATUS,
143palf_env->palf_env_impl_.disk_options_wrapper_.status_);
144EXPECT_EQ(palf_env->palf_env_impl_.disk_options_wrapper_.disk_opts_for_recycling_blocks_.log_disk_usage_limit_size_,
14511*PALF_PHY_BLOCK_SIZE);
146// 此时日志盘依旧未完成缩容,ObSimpleLogServer维护的disk_opts_依旧是10GB
147{
148PalfDiskOptions opts;
149EXPECT_EQ(OB_SUCCESS, get_disk_options(leader_idx, opts));
150EXPECT_EQ(opts.log_disk_usage_limit_size_, 10*1024*1024*1024ul);
151}
152usleep(1000*1000+100+palf::BlockGCTimerTask::BLOCK_GC_TIMER_INTERVAL_MS);
153EXPECT_EQ(PalfDiskOptionsWrapper::Status::SHRINKING_STATUS,
154palf_env->palf_env_impl_.disk_options_wrapper_.status_);
155EXPECT_EQ(palf_env->palf_env_impl_.disk_options_wrapper_.disk_opts_for_recycling_blocks_.log_disk_usage_limit_size_,
15611*PALF_PHY_BLOCK_SIZE);
157EXPECT_EQ(OB_SUCCESS, wait_until_has_committed(leader, leader.palf_handle_impl_->get_max_lsn()));
158const LSN base_lsn(12*PALF_BLOCK_SIZE);
159EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->set_base_lsn(base_lsn));
160usleep(1000);
161EXPECT_EQ(OB_SUCCESS, submit_log(leader, 1, id, 1000));
162EXPECT_EQ(OB_SUCCESS, wait_lsn_until_flushed(leader.palf_handle_impl_->get_max_lsn(), leader));
163// wait until disk space enough
164EXPECT_EQ(OB_SUCCESS, wait_until_disk_space_to(leader_idx, (11*PALF_PHY_BLOCK_SIZE*80+100)/100));
165usleep(1000*1000+palf::BlockGCTimerTask::BLOCK_GC_TIMER_INTERVAL_MS);
166EXPECT_EQ(PalfDiskOptionsWrapper::Status::NORMAL_STATUS,
167palf_env->palf_env_impl_.disk_options_wrapper_.status_);
168EXPECT_EQ(palf_env->palf_env_impl_.disk_options_wrapper_.disk_opts_for_stopping_writing_.log_disk_usage_limit_size_,
16911*PALF_PHY_BLOCK_SIZE);
170// 等待后台线程再次执行update_disk_options操作,预期本地持久化的disk_opts会变为11*PALF_PHY_BLOCK_SIZE
171{
172usleep(2*ObLooper::INTERVAL_US);
173PalfDiskOptions opts;
174EXPECT_EQ(OB_SUCCESS, get_disk_options(leader_idx, opts));
175EXPECT_EQ(opts.log_disk_usage_limit_size_, 11*PALF_PHY_BLOCK_SIZE);
176}
177}
178
179TEST_F(TestObSimpleLogDiskMgr, shrink_log_disk)
180{
181SET_CASE_LOG_FILE(TEST_NAME, "shrink_log_disk");
182OB_LOGGER.set_log_level("INFO");
183// 验证缩容由于单日志流最少需要512MB日志盘失败
184// 保证能同时容纳两个日志流
185PalfEnv *palf_env = NULL;
186int64_t leader_idx = 0;
187PalfHandleImplGuard leader;
188share::SCN create_scn = share::SCN::base_scn();
189int server_idx = 0;
190EXPECT_EQ(OB_SUCCESS, get_palf_env(server_idx, palf_env));
191EXPECT_EQ(OB_SUCCESS, update_disk_options(16));
192EXPECT_EQ(PalfDiskOptionsWrapper::Status::NORMAL_STATUS,
193palf_env->palf_env_impl_.disk_options_wrapper_.status_);
194EXPECT_EQ(palf_env->palf_env_impl_.disk_options_wrapper_.disk_opts_for_stopping_writing_.log_disk_usage_limit_size_,
19516*PALF_PHY_BLOCK_SIZE);
196int64_t tmp_id1 = ATOMIC_AAF(&palf_id_, 1);
197{
198PalfHandleImplGuard leader;
199EXPECT_EQ(OB_SUCCESS, create_paxos_group(tmp_id1, leader_idx, leader));
200}
201int64_t tmp_id2 = ATOMIC_AAF(&palf_id_, 1);
202{
203PalfHandleImplGuard leader;
204EXPECT_EQ(OB_SUCCESS, create_paxos_group(tmp_id2, leader_idx, leader));
205}
206EXPECT_EQ(OB_NOT_SUPPORTED, update_disk_options(9));
207EXPECT_EQ(OB_SUCCESS, delete_paxos_group(tmp_id1));
208}
209
210TEST_F(TestObSimpleLogDiskMgr, update_disk_options_restart)
211{
212disable_hot_cache_ = true;
213SET_CASE_LOG_FILE(TEST_NAME, "update_disk_options_restart");
214OB_LOGGER.set_log_level("INFO");
215// 扩容操作
216EXPECT_EQ(OB_SUCCESS, update_disk_options(10*1024*1024*1024ul/PALF_PHY_BLOCK_SIZE));
217usleep(1000*1000+palf::BlockGCTimerTask::BLOCK_GC_TIMER_INTERVAL_MS);
218const int64_t id = ATOMIC_AAF(&palf_id_, 1);
219int64_t leader_idx = 0;
220PalfEnv *palf_env = NULL;
221{
222PalfHandleImplGuard leader;
223EXPECT_EQ(OB_SUCCESS, create_paxos_group(id, leader_idx, leader));
224{
225PalfDiskOptions opts;
226EXPECT_EQ(OB_SUCCESS, get_disk_options(leader_idx, opts));
227EXPECT_EQ(opts.log_disk_usage_limit_size_, 10*1024*1024*1024ul);
228}
229EXPECT_EQ(OB_SUCCESS, get_palf_env(leader_idx, palf_env));
230{
231EXPECT_EQ(PalfDiskOptionsWrapper::Status::NORMAL_STATUS,
232palf_env->palf_env_impl_.disk_options_wrapper_.status_);
233EXPECT_EQ(10*1024*1024*1024ul,
234palf_env->palf_env_impl_.disk_options_wrapper_.disk_opts_for_recycling_blocks_.log_disk_usage_limit_size_);
235}
236// 产生10个文件的数据
237EXPECT_EQ(OB_SUCCESS, submit_log(leader, 10*32, id, MAX_LOG_BODY_SIZE));
238EXPECT_EQ(OB_SUCCESS, wait_until_has_committed(leader, leader.palf_handle_impl_->get_max_lsn()));
239// 最小的log_disk_size要求是存在8个日志文件
240EXPECT_EQ(OB_SUCCESS, update_disk_options(leader_idx, 8));
241usleep(1000*1000+palf::BlockGCTimerTask::BLOCK_GC_TIMER_INTERVAL_MS);
242// 宕机前,缩容不会正式生效,因此不会导致停写
243EXPECT_EQ(true, palf_env->palf_env_impl_.diskspace_enough_);
244EXPECT_EQ(PalfDiskOptionsWrapper::Status::SHRINKING_STATUS,
245palf_env->palf_env_impl_.disk_options_wrapper_.status_);
246EXPECT_EQ(10*1024*1024*1024ul, palf_env->palf_env_impl_.disk_options_wrapper_.disk_opts_for_stopping_writing_.log_disk_usage_limit_size_);
247int64_t log_disk_usage, total_log_disk_size;
248EXPECT_EQ(OB_SUCCESS, palf_env->palf_env_impl_.get_disk_usage(log_disk_usage, total_log_disk_size));
249PALF_LOG(INFO, "log_disk_usage:", K(log_disk_usage), K(total_log_disk_size));
250// 缩容未成功前,log_disk_usage_limit_size_依旧保持10G.
251// 本地持久化的log_disk_size为10G
252// 内部表中持久化的log_disk_size为8*PALF_PHY_BLOCK_SIZE
253PalfDiskOptions opts;
254EXPECT_EQ(OB_SUCCESS, get_disk_options(leader_idx, opts));
255EXPECT_EQ(opts.log_disk_usage_limit_size_, 10*1024*1024*1024ul);
256}
257// 物理缩容未成功前,宕机重启预期不会停写
258EXPECT_EQ(OB_SUCCESS, restart_paxos_groups());
259{
260// 内部表中持久化的log_disk_size依旧是8*PALF_PHY_BLOCK_SIZE
261// 重启后继续缩容
262int64_t log_disk_usage, total_log_disk_size;
263EXPECT_EQ(OB_SUCCESS, get_palf_env(leader_idx, palf_env));
264usleep(2*ObLooper::INTERVAL_US);
265usleep(2*1000*1000 + BlockGCTimerTask::BLOCK_GC_TIMER_INTERVAL_MS);
266EXPECT_EQ(true, palf_env->palf_env_impl_.diskspace_enough_);
267EXPECT_EQ(PalfDiskOptionsWrapper::Status::SHRINKING_STATUS,
268palf_env->palf_env_impl_.disk_options_wrapper_.status_);
269// 本地持久化的(slog)记录的依旧是10G,因此不会停写
270EXPECT_EQ(10*1024*1024*1024ul, palf_env->palf_env_impl_.disk_options_wrapper_.disk_opts_for_stopping_writing_.log_disk_usage_limit_size_);
271EXPECT_EQ(OB_SUCCESS, palf_env->palf_env_impl_.get_disk_usage(log_disk_usage, total_log_disk_size));
272PALF_LOG(INFO, "log_disk_usage:", K(log_disk_usage), K(total_log_disk_size));
273PalfDiskOptions opts;
274EXPECT_EQ(OB_SUCCESS, get_disk_options(leader_idx, opts));
275EXPECT_EQ(opts.log_disk_usage_limit_size_, 10*1024*1024*1024ul);
276}
277{
278PalfHandleImplGuard leader;
279EXPECT_EQ(OB_SUCCESS, get_leader(id, leader, leader_idx));
280PalfDiskOptions opts;
281EXPECT_EQ(OB_SUCCESS, get_disk_options(leader_idx, opts));
282EXPECT_EQ(opts.log_disk_usage_limit_size_, 10*1024*1024*1024ul);
283
284// 物理上保证不缩容,内部表中持久化的变为16*PALF_PHY_BLOCK_SIZE, 由于palf的log_disk_size是10G,
285// 因此本次对palf是一次缩容操作. 但下一轮GC任务运行时,发现当前的使用的日志盘空间不会导致停写,
286// 于是日志盘变为正常状态
287EXPECT_EQ(OB_SUCCESS, update_disk_options(leader_idx, 16));
288// 在下一轮GC任务运行后,本地持久化的log_disk_size也会变为16*PALF_PHY_BLOCK_SIZE
289usleep(2*1000*1000+palf::BlockGCTimerTask::BLOCK_GC_TIMER_INTERVAL_MS);
290// 经过一轮GC后,会变为NORMAL_STATUS
291EXPECT_EQ(true, palf_env->palf_env_impl_.diskspace_enough_);
292EXPECT_EQ(PalfDiskOptionsWrapper::Status::NORMAL_STATUS,
293palf_env->palf_env_impl_.disk_options_wrapper_.status_);
294EXPECT_EQ(16*PALF_PHY_BLOCK_SIZE,
295palf_env->palf_env_impl_.disk_options_wrapper_.disk_opts_for_recycling_blocks_.log_disk_usage_limit_size_);
296// 后台线程会完成缩容操作,最终本地持久化的变为16*PALF_PHY_BLOCK_SIZE
297usleep(2*1000*1000+ObLooper::INTERVAL_US*2);
298EXPECT_EQ(OB_SUCCESS, get_disk_options(leader_idx, opts));
299EXPECT_EQ(opts.log_disk_usage_limit_size_, 16*PALF_PHY_BLOCK_SIZE);
300}
301}
302
303TEST_F(TestObSimpleLogDiskMgr, overshelling)
304{
305disable_hot_cache_ = true;
306SET_CASE_LOG_FILE(TEST_NAME, "overshelling");
307OB_LOGGER.set_log_level("INFO");
308ObServerLogBlockMgr *log_pool = nullptr;
309EXPECT_EQ(OB_SUCCESS, get_log_pool(0, log_pool));
310ASSERT_NE(nullptr, log_pool);
311// 验证扩缩容场景下的LogPool字段的正确性
312EXPECT_EQ(16*PALF_PHY_BLOCK_SIZE, log_pool->min_log_disk_size_for_all_tenants_);
313const int64_t id = ATOMIC_AAF(&palf_id_, 1);
314int64_t leader_idx = 0;
315PalfEnv *palf_env = NULL;
316{
317PalfHandleImplGuard leader;
318EXPECT_EQ(OB_SUCCESS, create_paxos_group(id, leader_idx, leader));
319}
320EXPECT_EQ(OB_SUCCESS, update_disk_options(leader_idx, 15));
321int64_t log_disk_size_used_for_tenants = log_pool->min_log_disk_size_for_all_tenants_;
322// 缩容还未成功,预期log_disk_size_used_for_tenants一定是16*PALF_PHY_BLOCK_SIZE
323PalfDiskOptions opts;
324EXPECT_EQ(OB_SUCCESS, get_disk_options(leader_idx, opts));
325if (opts.log_disk_usage_limit_size_ == 16*PALF_PHY_BLOCK_SIZE) {
326EXPECT_EQ(16*PALF_PHY_BLOCK_SIZE, log_disk_size_used_for_tenants);
327// 缩容不会立马生效
328usleep(2*1000*1000+ObLooper::INTERVAL_US*2);
329EXPECT_EQ(15*PALF_PHY_BLOCK_SIZE, log_pool->min_log_disk_size_for_all_tenants_);
330} else {
331PALF_LOG(INFO, "update_disk_options successfully", K(log_disk_size_used_for_tenants), K(opts));
332}
333
334// 扩容预期立马成功
335EXPECT_EQ(OB_SUCCESS, update_disk_options(leader_idx, 16));
336EXPECT_EQ(OB_SUCCESS, get_disk_options(leader_idx, opts));
337EXPECT_EQ(16*PALF_PHY_BLOCK_SIZE, log_disk_size_used_for_tenants);
338EXPECT_EQ(16*PALF_PHY_BLOCK_SIZE, opts.log_disk_usage_limit_size_);
339
340// 直接扩容为LogPool上限值
341const int64_t limit_log_disk_size = log_pool->log_pool_meta_.curr_total_size_;
342EXPECT_EQ(OB_SUCCESS, update_disk_options(leader_idx, limit_log_disk_size/PALF_PHY_BLOCK_SIZE));
343EXPECT_EQ(OB_SUCCESS, get_disk_options(leader_idx, opts));
344log_disk_size_used_for_tenants = log_pool->min_log_disk_size_for_all_tenants_;
345EXPECT_EQ(limit_log_disk_size, log_disk_size_used_for_tenants);
346EXPECT_EQ(limit_log_disk_size, opts.log_disk_usage_limit_size_);
347
348{
349PalfHandleImplGuard leader;
350EXPECT_EQ(OB_SUCCESS, get_leader(id, leader, leader_idx));
351// 生成10个文件
352EXPECT_EQ(OB_SUCCESS, submit_log(leader, 10*32, id, MAX_LOG_BODY_SIZE));
353EXPECT_EQ(OB_SUCCESS, wait_until_has_committed(leader, leader.palf_handle_impl_->get_max_lsn()));
354EXPECT_EQ(OB_SUCCESS, update_disk_options(leader_idx, 10));
355// 缩容一定不会成功,租户日志盘规格依旧为上限值
356usleep(2*1000*1000+ObLooper::INTERVAL_US * 2);
357EXPECT_EQ(OB_SUCCESS, get_palf_env(leader_idx, palf_env));
358EXPECT_EQ(PalfDiskOptionsWrapper::Status::SHRINKING_STATUS,
359palf_env->palf_env_impl_.disk_options_wrapper_.status_);
360EXPECT_EQ(OB_SUCCESS, get_disk_options(leader_idx, opts));
361log_disk_size_used_for_tenants = log_pool->min_log_disk_size_for_all_tenants_;
362EXPECT_EQ(limit_log_disk_size, log_disk_size_used_for_tenants);
363EXPECT_EQ(limit_log_disk_size, opts.log_disk_usage_limit_size_);
364EXPECT_EQ(OB_MACHINE_RESOURCE_NOT_ENOUGH, log_pool->create_tenant(MIN_DISK_SIZE_PER_PALF_INSTANCE));
365const LSN base_lsn(8*PALF_BLOCK_SIZE);
366EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->set_base_lsn(base_lsn));
367usleep(1000);
368EXPECT_EQ(OB_SUCCESS, submit_log(leader, 1, id, 1000));
369EXPECT_EQ(OB_SUCCESS, wait_lsn_until_flushed(leader.palf_handle_impl_->get_max_lsn(), leader));
370EXPECT_EQ(OB_SUCCESS, wait_until_disk_space_to(leader_idx, (10*PALF_PHY_BLOCK_SIZE*80+100)/100));
371usleep(ObLooper::INTERVAL_US * 2);
372EXPECT_EQ(PalfDiskOptionsWrapper::Status::NORMAL_STATUS,
373palf_env->palf_env_impl_.disk_options_wrapper_.status_);
374EXPECT_EQ(OB_SUCCESS, get_disk_options(leader_idx, opts));
375log_disk_size_used_for_tenants = log_pool->min_log_disk_size_for_all_tenants_;
376EXPECT_EQ(10*PALF_PHY_BLOCK_SIZE, log_disk_size_used_for_tenants);
377EXPECT_EQ(10*PALF_PHY_BLOCK_SIZE, opts.log_disk_usage_limit_size_);
378EXPECT_EQ(OB_SUCCESS, log_pool->create_tenant(MIN_DISK_SIZE_PER_PALF_INSTANCE));
379log_pool->abort_create_tenant(MIN_DISK_SIZE_PER_PALF_INSTANCE);
380
381// 扩容预计一定成功
382EXPECT_EQ(OB_SUCCESS, update_disk_options(leader_idx, limit_log_disk_size/PALF_PHY_BLOCK_SIZE));
383EXPECT_EQ(PalfDiskOptionsWrapper::Status::NORMAL_STATUS,
384palf_env->palf_env_impl_.disk_options_wrapper_.status_);
385EXPECT_EQ(OB_SUCCESS, get_disk_options(leader_idx, opts));
386log_disk_size_used_for_tenants = log_pool->min_log_disk_size_for_all_tenants_;
387EXPECT_EQ(limit_log_disk_size, log_disk_size_used_for_tenants);
388EXPECT_EQ(limit_log_disk_size, opts.log_disk_usage_limit_size_);
389EXPECT_EQ(OB_MACHINE_RESOURCE_NOT_ENOUGH, log_pool->create_tenant(MIN_DISK_SIZE_PER_PALF_INSTANCE));
390
391}
392
393}
394
395TEST_F(TestObSimpleLogDiskMgr, hidden_sys)
396{
397SET_CASE_LOG_FILE(TEST_NAME, "hidden_sys");
398int server_idx = 0;
399PalfEnv *palf_env = NULL;
400int64_t leader_idx = 0;
401int64_t id = ATOMIC_AAF(&palf_id_, 1);
402int64_t total_used_size = 0, total_size = 0;
403share::SCN create_scn = share::SCN::base_scn();
404EXPECT_EQ(OB_SUCCESS, get_palf_env(0, palf_env));
405{
406PalfHandleImplGuard leader;
407EXPECT_EQ(OB_SUCCESS, palf_env->get_stable_disk_usage(total_used_size, total_size));
408EXPECT_EQ(0, total_used_size);
409EXPECT_EQ(OB_SUCCESS, create_paxos_group(id, create_scn, leader_idx, leader));
410EXPECT_EQ(OB_SUCCESS, palf_env->get_stable_disk_usage(total_used_size, total_size));
411EXPECT_NE(0, total_used_size);
412EXPECT_EQ(OB_NOT_SUPPORTED, update_disk_options(0));
413}
414EXPECT_EQ(OB_SUCCESS, delete_paxos_group(id));
415EXPECT_EQ(OB_SUCCESS, update_disk_options(0));
416// tenant unit中记录的disk_opts直接生效
417PalfDiskOptions disk_opts;
418EXPECT_EQ(OB_SUCCESS, get_disk_options(0, disk_opts));
419EXPECT_EQ(0, disk_opts.log_disk_usage_limit_size_);
420EXPECT_EQ(PalfDiskOptionsWrapper::Status::SHRINKING_STATUS,
421palf_env->palf_env_impl_.disk_options_wrapper_.status_);
422usleep(palf::BlockGCTimerTask::BLOCK_GC_TIMER_INTERVAL_MS + 5*100000);
423usleep(ObLooper::INTERVAL_US * 2);
424EXPECT_EQ(PalfDiskOptionsWrapper::Status::NORMAL_STATUS,
425palf_env->palf_env_impl_.disk_options_wrapper_.status_);
426EXPECT_EQ(OB_SUCCESS, palf_env->get_stable_disk_usage(total_used_size, total_size));
427EXPECT_EQ(0, total_used_size);
428EXPECT_EQ(0, total_size);
429EXPECT_EQ(OB_SUCCESS, update_disk_options(8));
430PalfHandleImplGuard leader;
431EXPECT_EQ(OB_SUCCESS, create_paxos_group(id, create_scn, leader_idx, leader));
432EXPECT_EQ(OB_SUCCESS, palf_env->get_stable_disk_usage(total_used_size, total_size));
433EXPECT_NE(0, total_used_size);
434}
435
436} // namespace unittest
437} // namespace oceanbase
438
439int main(int argc, char **argv)
440{
441RUN_SIMPLE_LOG_CLUSTER_TEST(TEST_NAME);
442}
443