From 0c8ea308a234cf26b44f4982c0d88e08684ff400 Mon Sep 17 00:00:00 2001 From: Yongqiang YANG Date: Tue, 19 Aug 2025 14:57:53 +0800 Subject: [PATCH] [fix](hdfs) remove cached file handle when read fails --- be/src/io/fs/hdfs_file_reader.cpp | 15 ++++++++++++--- be/src/io/fs/hdfs_file_reader.h | 3 ++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/be/src/io/fs/hdfs_file_reader.cpp b/be/src/io/fs/hdfs_file_reader.cpp index ac75e2e722b9d7..ffcb1fbea138b8 100644 --- a/be/src/io/fs/hdfs_file_reader.cpp +++ b/be/src/io/fs/hdfs_file_reader.cpp @@ -82,9 +82,18 @@ Status HdfsFileReader::close() { return Status::OK(); } -#ifdef USE_HADOOP_HDFS Status HdfsFileReader::read_at_impl(size_t offset, Slice result, size_t* bytes_read, const IOContext* io_ctx) { + auto status = do_read_at_impl(offset, result, bytes_read, io_ctx); + if (!status.ok()) { + _accessor.destroy(); + } + return status; +} + +#ifdef USE_HADOOP_HDFS +Status HdfsFileReader::do_read_at_impl(size_t offset, Slice result, size_t* bytes_read, + const IOContext* io_ctx) { DCHECK(!closed()); if (offset > _handle->file_size()) { return Status::IOError("offset exceeds file size(offset: {}, file size: {}, path: {})", @@ -130,8 +139,8 @@ Status HdfsFileReader::read_at_impl(size_t offset, Slice result, size_t* bytes_r #else // The hedged read only support hdfsPread(). // TODO: rethink here to see if there are some difference between hdfsPread() and hdfsRead() -Status HdfsFileReader::read_at_impl(size_t offset, Slice result, size_t* bytes_read, - const IOContext* io_ctx) { +Status HdfsFileReader::do_read_at_impl(size_t offset, Slice result, size_t* bytes_read, + const IOContext* io_ctx) { DCHECK(!closed()); if (offset > _handle->file_size()) { return Status::IOError("offset exceeds file size(offset: {}, file size: {}, path: {})", diff --git a/be/src/io/fs/hdfs_file_reader.h b/be/src/io/fs/hdfs_file_reader.h index 0f4a3f14019b6d..0fb77446eb5609 100644 --- a/be/src/io/fs/hdfs_file_reader.h +++ b/be/src/io/fs/hdfs_file_reader.h @@ -55,7 +55,8 @@ class HdfsFileReader : public FileReader { protected: Status read_at_impl(size_t offset, Slice result, size_t* bytes_read, const IOContext* io_ctx) override; - + Status do_read_at_impl(size_t offset, Slice result, size_t* bytes_read, + const IOContext* io_ctx); void _collect_profile_before_close() override; private: