pread return OB_SUCCESS when read offset is equal to file length.

This commit is contained in:
HaHaJeff
2023-07-25 14:42:37 +00:00
committed by ob-robot
parent ce2579a7d6
commit 7b37f56021
4 changed files with 22 additions and 6 deletions

View File

@ -182,9 +182,12 @@ int ObLogExternalStorageHandler::pread(const common::ObString &uri,
CLOG_LOG(WARN, "ObLogExternalStorageHandler invalid argument", K(uri), K(storage_info), K(offset), KP(buf), K(read_buf_size));
} else if (OB_FAIL(handle_adapter_->get_file_size(uri, storage_info, file_size))) {
CLOG_LOG(WARN, "get_file_size failed", K(uri), K(storage_info), K(offset), KP(buf), K(read_buf_size));
} else if (offset >= file_size) {
ret = OB_INVALID_ARGUMENT;
} else if (offset > file_size) {
ret = OB_FILE_LENGTH_INVALID;
CLOG_LOG(WARN, "read position lager than file size, invalid argument", K(file_size), K(offset), K(uri));
} else if (offset == file_size) {
real_read_size = 0;
CLOG_LOG(TRACE, "read position equal to file size, no need read data", K(file_size), K(offset), K(uri));
} else if (FALSE_IT(time_guard.click("after get file size"))) {
// NB: limit read size.
} else if (FALSE_IT(real_read_buf_size = std::min(file_size - offset, read_buf_size))) {

View File

@ -92,6 +92,7 @@ public:
// OB_BACKUP_PERMISSION_DENIED, permission denied.
// OB_BACKUP_FILE_NOT_EXIST, uri not exist.
// OB_OSS_ERROR, oss error.
// OB_FILE_LENGTH_INVALID, read offset is greater than file size.
// OB_NOT_INIT
// OB_NOT_RUNNING
//

View File

@ -336,7 +336,7 @@ int ObLogExternalStorageIOTaskHandleAdapter::pread(const ObString &uri,
const int64_t read_buf_size,
int64_t &real_read_size)
{
ObTimeGuard time_guard("oss pread", 100 * 1000);
ObTimeGuard time_guard("storage pread", 100 * 1000);
int ret = OB_SUCCESS;
real_read_size = 0;
ObIODevice *io_device = NULL;

View File

@ -61,8 +61,15 @@ public:
{
// 假设8M每秒的读取速度
const int64_t sleep_us = read_buf_size / (8);
int ret = OB_SUCCESS;
usleep(sleep_us);
if (offset == palf::PALF_PHY_BLOCK_SIZE) {
real_read_size = 0;
} else if (offset > palf::PALF_PHY_BLOCK_SIZE) {
ret = OB_FILE_LENGTH_INVALID;
} else {
real_read_size = read_buf_size;
}
// while (true) {
// int64_t old_real_read_size = ATOMIC_LOAD(&real_read_size);
// int64_t new_real_read_size = old_real_read_size + read_buf_size;
@ -165,8 +172,10 @@ TEST(TestLogExternalStorageHandler, test_log_external_storage_handler)
EXPECT_EQ(OB_SUCCESS, handler.pread(uri, empty_storage_info, offset, read_buf, read_buf_size, real_read_size));
int64_t invalid_offset = -1;
EXPECT_EQ(OB_INVALID_ARGUMENT, handler.pread(uri, storage_info, invalid_offset, read_buf, read_buf_size, real_read_size));
invalid_offset = 100*1024*1024;
EXPECT_EQ(OB_INVALID_ARGUMENT, handler.pread(uri, storage_info, invalid_offset, read_buf, read_buf_size, real_read_size));
// 读偏移等于文件长度,返回成功,real_read_size=0
int64_t valid_offset = 64*1024*1024;
EXPECT_NE(OB_INVALID_ARGUMENT, handler.pread(uri, storage_info, valid_offset, read_buf, read_buf_size, real_read_size));
EXPECT_EQ(0, real_read_size);
char *invalid_read_buf = NULL;
EXPECT_EQ(OB_INVALID_ARGUMENT, handler.pread(uri, storage_info, offset, invalid_read_buf, read_buf_size, real_read_size));
int64_t invalid_read_buf_size = 0;
@ -215,6 +224,9 @@ TEST(TestLogExternalStorageHandler, test_log_external_storage_handler)
// 验证公有函数
{
real_read_size = 0;
int64_t invalid_offset = 100*1024*1024;
EXPECT_EQ(OB_FILE_LENGTH_INVALID, handler.pread(uri, storage_info, invalid_offset, read_buf, read_buf_size, real_read_size));
EXPECT_EQ(OB_SUCCESS, handler.pread(uri, storage_info, offset, read_buf, read_buf_size, real_read_size));
EXPECT_EQ(read_buf_size, real_read_size);
CLOG_LOG(INFO, "after first read", K(read_buf_size), K(real_read_size));