pread return OB_SUCCESS when read offset is equal to file length.
This commit is contained in:
@ -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));
|
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))) {
|
} 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));
|
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) {
|
} else if (offset > file_size) {
|
||||||
ret = OB_INVALID_ARGUMENT;
|
ret = OB_FILE_LENGTH_INVALID;
|
||||||
CLOG_LOG(WARN, "read position lager than file size, invalid argument", K(file_size), K(offset), K(uri));
|
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"))) {
|
} else if (FALSE_IT(time_guard.click("after get file size"))) {
|
||||||
// NB: limit read size.
|
// NB: limit read size.
|
||||||
} else if (FALSE_IT(real_read_buf_size = std::min(file_size - offset, read_buf_size))) {
|
} else if (FALSE_IT(real_read_buf_size = std::min(file_size - offset, read_buf_size))) {
|
||||||
|
|||||||
@ -92,6 +92,7 @@ public:
|
|||||||
// OB_BACKUP_PERMISSION_DENIED, permission denied.
|
// OB_BACKUP_PERMISSION_DENIED, permission denied.
|
||||||
// OB_BACKUP_FILE_NOT_EXIST, uri not exist.
|
// OB_BACKUP_FILE_NOT_EXIST, uri not exist.
|
||||||
// OB_OSS_ERROR, oss error.
|
// OB_OSS_ERROR, oss error.
|
||||||
|
// OB_FILE_LENGTH_INVALID, read offset is greater than file size.
|
||||||
// OB_NOT_INIT
|
// OB_NOT_INIT
|
||||||
// OB_NOT_RUNNING
|
// OB_NOT_RUNNING
|
||||||
//
|
//
|
||||||
|
|||||||
@ -336,7 +336,7 @@ int ObLogExternalStorageIOTaskHandleAdapter::pread(const ObString &uri,
|
|||||||
const int64_t read_buf_size,
|
const int64_t read_buf_size,
|
||||||
int64_t &real_read_size)
|
int64_t &real_read_size)
|
||||||
{
|
{
|
||||||
ObTimeGuard time_guard("oss pread", 100 * 1000);
|
ObTimeGuard time_guard("storage pread", 100 * 1000);
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
real_read_size = 0;
|
real_read_size = 0;
|
||||||
ObIODevice *io_device = NULL;
|
ObIODevice *io_device = NULL;
|
||||||
|
|||||||
@ -61,8 +61,15 @@ public:
|
|||||||
{
|
{
|
||||||
// 假设8M每秒的读取速度
|
// 假设8M每秒的读取速度
|
||||||
const int64_t sleep_us = read_buf_size / (8);
|
const int64_t sleep_us = read_buf_size / (8);
|
||||||
|
int ret = OB_SUCCESS;
|
||||||
usleep(sleep_us);
|
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) {
|
// while (true) {
|
||||||
// int64_t old_real_read_size = ATOMIC_LOAD(&real_read_size);
|
// int64_t old_real_read_size = ATOMIC_LOAD(&real_read_size);
|
||||||
// int64_t new_real_read_size = old_real_read_size + read_buf_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));
|
EXPECT_EQ(OB_SUCCESS, handler.pread(uri, empty_storage_info, offset, read_buf, read_buf_size, real_read_size));
|
||||||
int64_t invalid_offset = -1;
|
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));
|
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;
|
// 读偏移等于文件长度,返回成功,real_read_size=0
|
||||||
EXPECT_EQ(OB_INVALID_ARGUMENT, handler.pread(uri, storage_info, invalid_offset, read_buf, read_buf_size, real_read_size));
|
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;
|
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));
|
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;
|
int64_t invalid_read_buf_size = 0;
|
||||||
@ -215,6 +224,9 @@ TEST(TestLogExternalStorageHandler, test_log_external_storage_handler)
|
|||||||
// 验证公有函数
|
// 验证公有函数
|
||||||
{
|
{
|
||||||
real_read_size = 0;
|
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(OB_SUCCESS, handler.pread(uri, storage_info, offset, read_buf, read_buf_size, real_read_size));
|
||||||
EXPECT_EQ(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));
|
CLOG_LOG(INFO, "after first read", K(read_buf_size), K(real_read_size));
|
||||||
|
|||||||
Reference in New Issue
Block a user