From 0709ef7dd251cd2731ff4e393a3137ce84bfa75c Mon Sep 17 00:00:00 2001 From: Kaijie Chen Date: Tue, 18 Feb 2025 15:15:11 +0800 Subject: [PATCH] [improve](load) print error string in local fs error messages (#47918) Issue Number: DORIS-18704 Problem Summary: Human-readable error messages should be displayed alongside the error code in local file system errors. Example (before): ``` [E-232]failed to write /path/be/storage/data/xxx/xxxx/xxxxx/xxxxxx.dat ``` Example (after): ``` [E-232]failed to write /path/be/storage/data/xxx/xxxx/xxxxx/xxxxxx.dat: No space left on device ``` The error message now includes a more informative description, providing users with a clearer understanding of the issue. --- be/src/io/fs/err_utils.cpp | 28 +++++++++++++++------------- be/src/io/fs/err_utils.h | 1 + 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/be/src/io/fs/err_utils.cpp b/be/src/io/fs/err_utils.cpp index fbae0ff927d668..d4c5c7ad3e0fe8 100644 --- a/be/src/io/fs/err_utils.cpp +++ b/be/src/io/fs/err_utils.cpp @@ -78,36 +78,38 @@ std::string glob_err_to_str(int code) { } Status localfs_error(const std::error_code& ec, std::string_view msg) { + auto message = fmt::format("{}: {}", msg, ec.message()); if (ec == std::errc::io_error) { - return Status::Error(msg); + return Status::Error(message); } else if (ec == std::errc::no_such_file_or_directory) { - return Status::Error(msg); + return Status::Error(message); } else if (ec == std::errc::file_exists) { - return Status::Error(msg); + return Status::Error(message); } else if (ec == std::errc::no_space_on_device) { - return Status::Error(msg); + return Status::Error(message); } else if (ec == std::errc::permission_denied) { - return Status::Error(msg); + return Status::Error(message); } else { - return Status::Error("{}: {}", msg, ec.message()); + return Status::Error(message); } } Status localfs_error(int posix_errno, std::string_view msg) { + char buf[1024]; + auto message = fmt::format("{}: {}", msg, strerror_r(errno, buf, 1024)); switch (posix_errno) { case EIO: - return Status::Error(msg); + return Status::Error(message); case ENOENT: - return Status::Error(msg); + return Status::Error(message); case EEXIST: - return Status::Error(msg); + return Status::Error(message); case ENOSPC: - return Status::Error(msg); + return Status::Error(message); case EACCES: - return Status::Error(msg); + return Status::Error(message); default: - return Status::Error("{}: {}", msg, - std::strerror(posix_errno)); + return Status::Error(message); } } diff --git a/be/src/io/fs/err_utils.h b/be/src/io/fs/err_utils.h index 18a6727c4ffe76..4a7c597879a7ec 100644 --- a/be/src/io/fs/err_utils.h +++ b/be/src/io/fs/err_utils.h @@ -31,6 +31,7 @@ namespace io { std::string errno_to_str(); std::string errcode_to_str(const std::error_code& ec); +int error_code_to_errno(const std::error_code& ec); std::string hdfs_error(); std::string glob_err_to_str(int code);