yiguolei commented on code in PR #66328:
URL: https://github.com/apache/doris/pull/66328#discussion_r3710130686
##########
be/src/exec/spill/spill_file_manager.cpp:
##########
@@ -162,6 +181,71 @@ void SpillFileManager::delete_spill_file(SpillFileSPtr
spill_file) {
spill_file->gc();
}
+void SpillFileManager::handoff_query_spill_directory(const std::string&
query_id,
+ SpillDataDir* data_dir) {
+ PendingQuerySpillDirectory pending_directory {
+ .query_dir = data_dir->get_spill_data_path(query_id),
+ .gc_dir = data_dir->get_spill_data_gc_path(
+ fmt::format("{}-{}", query_id,
UniqueId::gen_uid().to_string())),
+ };
+
+ auto status = Status::OK();
+
DBUG_EXECUTE_IF("fault_inject::spill_file_manager::handoff_query_spill_directory",
{
+ status = Status::Error<INTERNAL_ERROR>("injected query spill directory
handoff failure");
+ });
+ if (status.ok()) {
+ status = _try_handoff_query_spill_directory(pending_directory);
+ }
+ if (!status.ok()) {
+ {
+ std::lock_guard lock(_pending_query_spill_directories_mutex);
+
_pending_query_spill_directories.emplace_back(std::move(pending_directory));
+ }
+ LOG(WARNING) << fmt::format(
+ "failed to hand off spill query directory, dir {}, error: {}; "
+ "the spill GC will retry",
+ data_dir->get_spill_data_path(query_id), status.to_string());
+ }
+}
+
+Status SpillFileManager::_try_handoff_query_spill_directory(
+ const PendingQuerySpillDirectory& pending_directory) {
+ const auto& fs = io::global_local_filesystem();
+ auto status = fs->delete_empty_directory(pending_directory.query_dir);
+ if (status.ok()) {
+ return Status::OK();
+ }
+ if (!status.is<ErrorCode::DIRECTORY_NOT_EMPTY>()) {
+ return status;
+ }
+ return fs->rename(pending_directory.query_dir, pending_directory.gc_dir);
+}
+
+void SpillFileManager::_retry_pending_query_spill_directories() {
+ std::vector<PendingQuerySpillDirectory> pending_directories;
+ {
+ std::lock_guard lock(_pending_query_spill_directories_mutex);
+ pending_directories.swap(_pending_query_spill_directories);
+ }
+
+ std::vector<PendingQuerySpillDirectory> failed_directories;
+ for (auto& pending_directory : pending_directories) {
+ auto status = _try_handoff_query_spill_directory(pending_directory);
Review Comment:
你这样,如果一直是非empty,不就一直放在那放着了吗?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]