This is an automated email from the ASF dual-hosted git repository. amarkovics pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git
commit d45587a248943496bf06310e13ebd3ad6b173dd6 Author: Marton Szasz <[email protected]> AuthorDate: Wed Apr 20 19:08:30 2022 +0200 MINIFICPP-1807 improve stat() error logging Closes #1311 ...and change a few filesystem utilities. - renamed utils::file::to_sys_time_point to to_sys - passing file_time_type by value, because it's just an integer - added a fix for libc++14, which behaves more like libstdc++ when it comes to file_clock Signed-off-by: Adam Markovics <[email protected]> --- extensions/libarchive/UnfocusArchiveEntry.cpp | 3 ++- extensions/standard-processors/processors/GetFile.cpp | 19 +++++++++---------- extensions/standard-processors/processors/ListFile.h | 2 +- libminifi/include/utils/file/FileUtils.h | 9 +++++---- libminifi/src/utils/file/FileUtils.cpp | 12 ++++++------ 5 files changed, 23 insertions(+), 22 deletions(-) diff --git a/extensions/libarchive/UnfocusArchiveEntry.cpp b/extensions/libarchive/UnfocusArchiveEntry.cpp index 2f6c1ac74..fc1f94b94 100644 --- a/extensions/libarchive/UnfocusArchiveEntry.cpp +++ b/extensions/libarchive/UnfocusArchiveEntry.cpp @@ -25,6 +25,7 @@ #include <memory> #include <string> #include <set> +#include <system_error> #include "archive.h" #include "archive_entry.h" @@ -181,7 +182,7 @@ int64_t UnfocusArchiveEntry::WriteCallback::operator()(const std::shared_ptr<io: if (entryMetadata.entryType == AE_IFREG && entryMetadata.entrySize > 0) { size_t stat_ok = stat(entryMetadata.tmpFileName.c_str(), &st); if (stat_ok != 0) { - logger_->log_error("Error statting %s: %d", entryMetadata.tmpFileName, stat_ok); + logger_->log_error("Error statting %s: %s", entryMetadata.tmpFileName, std::system_category().default_error_condition(errno).message()); } archive_entry_copy_stat(entry, &st); } diff --git a/extensions/standard-processors/processors/GetFile.cpp b/extensions/standard-processors/processors/GetFile.cpp index 2d59cdc25..49a529412 100644 --- a/extensions/standard-processors/processors/GetFile.cpp +++ b/extensions/standard-processors/processors/GetFile.cpp @@ -25,6 +25,7 @@ #include <queue> #include <map> #include <memory> +#include <regex> #include <set> #include <string> @@ -231,19 +232,17 @@ std::queue<std::string> GetFile::pollListing(uint64_t batch_size) { bool GetFile::fileMatchesRequestCriteria(std::string fullName, std::string name, const GetFileRequest &request) { logger_->log_trace("Checking file: %s", fullName); -#ifdef WIN32 - struct _stat64 statbuf; - if (_stat64(fullName.c_str(), &statbuf) != 0) { + std::error_code ec; + uint64_t file_size = std::filesystem::file_size(fullName, ec); + if (ec) { + logger_->log_error("file_size of %s: %s", fullName, ec.message()); return false; } -#else - struct stat statbuf; - if (stat(fullName.c_str(), &statbuf) != 0) { + const auto modifiedTime = std::filesystem::last_write_time(fullName, ec); + if (ec) { + logger_->log_error("last_write_time of %s: %s", fullName, ec.message()); return false; } -#endif - uint64_t file_size = gsl::narrow<uint64_t>(statbuf.st_size); - auto modifiedTime = std::chrono::system_clock::time_point() + std::chrono::seconds(gsl::narrow<uint64_t>(statbuf.st_mtime)); if (request.minSize > 0 && file_size < request.minSize) return false; @@ -251,7 +250,7 @@ bool GetFile::fileMatchesRequestCriteria(std::string fullName, std::string name, if (request.maxSize > 0 && file_size > request.maxSize) return false; - auto fileAge = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - modifiedTime); + auto fileAge = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::file_clock::now() - modifiedTime); if (request.minAge > 0ms && fileAge < request.minAge) return false; if (request.maxAge > 0ms && fileAge > request.maxAge) diff --git a/extensions/standard-processors/processors/ListFile.h b/extensions/standard-processors/processors/ListFile.h index cef41b6b1..83b3d8606 100644 --- a/extensions/standard-processors/processors/ListFile.h +++ b/extensions/standard-processors/processors/ListFile.h @@ -60,7 +60,7 @@ class ListFile : public core::Processor { private: struct ListedFile : public utils::ListedObject { [[nodiscard]] std::chrono::time_point<std::chrono::system_clock> getLastModified() const override { - return std::chrono::time_point_cast<std::chrono::milliseconds>(utils::file::FileUtils::to_sys_time_point(last_modified_time)); + return std::chrono::time_point_cast<std::chrono::milliseconds>(utils::file::FileUtils::to_sys(last_modified_time)); } [[nodiscard]] std::string getKey() const override { diff --git a/libminifi/include/utils/file/FileUtils.h b/libminifi/include/utils/file/FileUtils.h index c4b1b68cb..6ba8a3654 100644 --- a/libminifi/include/utils/file/FileUtils.h +++ b/libminifi/include/utils/file/FileUtils.h @@ -116,8 +116,9 @@ inline char get_separator(bool /*force_posix*/ = false) { return '/'; } #endif -time_t to_time_t(const std::filesystem::file_time_type& time); -std::chrono::time_point<std::chrono::system_clock> to_sys_time_point(const std::filesystem::file_time_type& time); +time_t to_time_t(std::filesystem::file_time_type time); + +std::chrono::system_clock::time_point to_sys(std::filesystem::file_time_type time); inline std::string normalize_path_separators(std::string path, bool force_posix = false) { const auto normalize_separators = [force_posix](const char c) { @@ -161,7 +162,7 @@ inline int64_t delete_dir(const std::string &path, bool delete_files_recursively } inline std::chrono::time_point<std::chrono::file_clock, - std::chrono::seconds> last_write_time_point(const std::string &path) { + std::chrono::seconds> last_write_time_point(const std::string &path) { std::error_code ec; auto result = std::filesystem::last_write_time(path, ec); if (ec.value() == 0) { @@ -170,7 +171,7 @@ inline std::chrono::time_point<std::chrono::file_clock, return std::chrono::time_point<std::chrono::file_clock, std::chrono::seconds>{}; } -inline const std::optional<std::filesystem::file_time_type> last_write_time(const std::string &path) { +inline std::optional<std::filesystem::file_time_type> last_write_time(const std::string &path) { std::error_code ec; auto result = std::filesystem::last_write_time(path, ec); if (ec.value() == 0) { diff --git a/libminifi/src/utils/file/FileUtils.cpp b/libminifi/src/utils/file/FileUtils.cpp index 2dc6f41f8..33602a9fe 100644 --- a/libminifi/src/utils/file/FileUtils.cpp +++ b/libminifi/src/utils/file/FileUtils.cpp @@ -86,20 +86,20 @@ bool contains(const std::filesystem::path& file_path, std::string_view text_to_s return check_range(left.size(), left.size() + right.size()); } -time_t to_time_t(const std::filesystem::file_time_type& file_time) { +time_t to_time_t(std::filesystem::file_time_type file_time) { #if defined(WIN32) - return std::chrono::system_clock::to_time_t(to_sys_time_point(file_time)); -#elif defined(_LIBCPP_VERSION) + return std::chrono::system_clock::to_time_t(to_sys(file_time)); +#elif defined(_LIBCPP_VERSION) && _LIBCPP_VERSION < 14000 return std::chrono::file_clock::to_time_t(file_time); #else - return std::chrono::system_clock::to_time_t(to_sys_time_point(file_time)); + return std::chrono::system_clock::to_time_t(to_sys(file_time)); #endif } -std::chrono::time_point<std::chrono::system_clock> to_sys_time_point(const std::filesystem::file_time_type& file_time) { +std::chrono::time_point<std::chrono::system_clock> to_sys(std::filesystem::file_time_type file_time) { #if defined(WIN32) return std::chrono::time_point_cast<std::chrono::system_clock::duration>(file_time - std::filesystem::file_time_type::clock::now() + std::chrono::system_clock::now()); -#elif defined(_LIBCPP_VERSION) +#elif defined(_LIBCPP_VERSION) && _LIBCPP_VERSION < 14000 return std::chrono::system_clock::from_time_t(std::chrono::file_clock::to_time_t(file_time)); #else return std::chrono::file_clock::to_sys(file_time);
