From 7b37f560212ef568bb8172629a27f572317a1a1c Mon Sep 17 00:00:00 2001 From: HaHaJeff Date: Tue, 25 Jul 2023 14:42:37 +0000 Subject: [PATCH] pread return OB_SUCCESS when read offset is equal to file length. --- .../ob_log_external_storage_handler.cpp | 7 +++++-- .../ob_log_external_storage_handler.h | 1 + .../ob_log_external_storage_io_task.cpp | 2 +- .../test_log_external_storage_handler.cpp | 18 +++++++++++++++--- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/logservice/ob_log_external_storage_handler.cpp b/src/logservice/ob_log_external_storage_handler.cpp index 93e658035f..b8bb866543 100644 --- a/src/logservice/ob_log_external_storage_handler.cpp +++ b/src/logservice/ob_log_external_storage_handler.cpp @@ -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))) { diff --git a/src/logservice/ob_log_external_storage_handler.h b/src/logservice/ob_log_external_storage_handler.h index 9c2c4e1de9..aed2885fe4 100644 --- a/src/logservice/ob_log_external_storage_handler.h +++ b/src/logservice/ob_log_external_storage_handler.h @@ -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 // diff --git a/src/logservice/ob_log_external_storage_io_task.cpp b/src/logservice/ob_log_external_storage_io_task.cpp index ff6c8ca59f..e9f4e5bd80 100644 --- a/src/logservice/ob_log_external_storage_io_task.cpp +++ b/src/logservice/ob_log_external_storage_io_task.cpp @@ -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; diff --git a/unittest/logservice/test_log_external_storage_handler.cpp b/unittest/logservice/test_log_external_storage_handler.cpp index a3787032d2..d72f631ef7 100644 --- a/unittest/logservice/test_log_external_storage_handler.cpp +++ b/unittest/logservice/test_log_external_storage_handler.cpp @@ -61,8 +61,15 @@ public: { // 假设8M每秒的读取速度 const int64_t sleep_us = read_buf_size / (8); + int ret = OB_SUCCESS; usleep(sleep_us); - real_read_size = read_buf_size; + 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));