From 226b2f965f43a4c57d8fa774469dc6ca91662fa8 Mon Sep 17 00:00:00 2001 From: Yongqiang YANG Date: Tue, 19 Aug 2025 14:59:38 +0800 Subject: [PATCH] [fix](hdfs) remove cached file handle when read fails (#54926) --- be/src/io/fs/hdfs_file_reader.cpp | 17 +++++++++++++---- be/src/io/fs/hdfs_file_reader.h | 3 +++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/be/src/io/fs/hdfs_file_reader.cpp b/be/src/io/fs/hdfs_file_reader.cpp index 977ed3d51e339d..87a5756496ea5b 100644 --- a/be/src/io/fs/hdfs_file_reader.cpp +++ b/be/src/io/fs/hdfs_file_reader.cpp @@ -114,9 +114,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*/) { + const IOContext* io_ctx) { + auto st = do_read_at_impl(offset, result, bytes_read, io_ctx); + if (!st.ok()) { + _accessor.destroy(); + } + return st; +} + +#ifdef USE_HADOOP_HDFS +Status HdfsFileReader::do_read_at_impl(size_t offset, Slice result, size_t* bytes_read, + const IOContext* /*io_ctx*/) { if (closed()) [[unlikely]] { return Status::InternalError("read closed file: {}", _path.native()); } @@ -169,8 +178,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*/) { if (closed()) [[unlikely]] { return Status::InternalError("read closed file: ", _path.native()); } diff --git a/be/src/io/fs/hdfs_file_reader.h b/be/src/io/fs/hdfs_file_reader.h index 8ccbe4ade8839a..8556eea0de6ac5 100644 --- a/be/src/io/fs/hdfs_file_reader.h +++ b/be/src/io/fs/hdfs_file_reader.h @@ -63,6 +63,9 @@ class HdfsFileReader final : public FileReader { void _collect_profile_before_close() override; + Status do_read_at_impl(size_t offset, Slice result, size_t* bytes_read, + const IOContext* io_ctx); + private: #ifdef USE_HADOOP_HDFS struct HDFSProfile {