add defense code for tmp file in case of misuse.

This commit is contained in:
obdev
2021-07-15 20:24:13 +08:00
committed by wangzelin.wzl
parent 09bc1e96dc
commit 3a827ef0d2
3 changed files with 93 additions and 29 deletions

View File

@ -1423,6 +1423,59 @@ TEST_F(TestTmpFile, test_drop_tenant_file)
ASSERT_EQ(0, ObTmpFileStore::get_instance().tenant_file_stores_.size());
}
TEST_F(TestTmpFile, test_handle_double_wait)
{
int ret = OB_SUCCESS;
int64_t dir = -1;
int64_t fd = -1;
ObTmpFileIOInfo io_info;
ObTmpFileIOHandle handle;
ret = ObTmpFileManager::get_instance().alloc_dir(dir);
ASSERT_EQ(OB_SUCCESS, ret);
ret = ObTmpFileManager::get_instance().open(fd, dir);
ASSERT_EQ(OB_SUCCESS, ret);
char *write_buf = new char [256];
for (int i = 0; i < 256; ++i) {
write_buf[i] = static_cast<char>(i);
}
char *read_buf = new char [256];
io_info.fd_ = fd;
io_info.tenant_id_ = 1;
io_info.io_desc_.category_ = USER_IO;
io_info.io_desc_.wait_event_no_ = 2;
io_info.buf_ = write_buf;
io_info.size_ = 256;
const int64_t timeout_ms = 5000;
int64_t write_time = ObTimeUtility::current_time();
ret = ObTmpFileManager::get_instance().write(io_info, timeout_ms);
write_time = ObTimeUtility::current_time() - write_time;
ASSERT_EQ(OB_SUCCESS, ret);
io_info.buf_ = read_buf;
int64_t read_time = ObTimeUtility::current_time();
ret = ObTmpFileManager::get_instance().pread(io_info, 0, timeout_ms, handle);
read_time = ObTimeUtility::current_time() - read_time;
ASSERT_EQ(OB_SUCCESS, ret);
ASSERT_EQ(256, handle.get_data_size());
int cmp = memcmp(handle.get_buffer(), write_buf, 256);
ASSERT_EQ(0, cmp);
ASSERT_EQ(OB_ERR_UNEXPECTED, handle.wait(timeout_ms));
STORAGE_LOG(INFO, "test_handle_double_wait");
STORAGE_LOG(INFO, "io time", K(write_time), K(read_time));
ObTmpTenantFileStore *store = NULL;
OB_TMP_FILE_STORE.get_store(1, store);
store->print_block_usage();
ObMallocAllocator::get_instance()->print_tenant_memory_usage(1);
ObMallocAllocator::get_instance()->print_tenant_ctx_memory_usage(1);
ObMallocAllocator::get_instance()->print_tenant_memory_usage(500);
ObMallocAllocator::get_instance()->print_tenant_ctx_memory_usage(500);
ObTmpFileManager::get_instance().remove(fd);
}
} // end namespace unittest
} // end namespace oceanbase