jacktengg commented on code in PR #47462: URL: https://github.com/apache/doris/pull/47462#discussion_r1966471574
########## be/src/olap/memtable_flush_executor.cpp: ########## @@ -137,6 +139,39 @@ Status FlushToken::wait() { return Status::OK(); } +Status FlushToken::_try_reserve_memory(const std::shared_ptr<ResourceContext>& resource_context, + int64_t size) { + auto* thread_context = doris::thread_context(); + auto* memtable_flush_executor = + ExecEnv::GetInstance()->storage_engine().memtable_flush_executor(); + Status st; + do { + // only try to reserve process memory + st = thread_context->try_reserve_process_memory(size); + if (st.ok()) { + memtable_flush_executor->inc_flushing_task(); + break; + } + if (_is_shutdown() || + resource_context->memory_context()->mem_tracker()->is_query_cancelled()) { + st = Status::Cancelled("flush memtable already cancelled"); + break; + } + // Make sure at least one memtable is flushing even reserve memory failed. + if (memtable_flush_executor->check_and_inc_has_any_flushing_task()) { + // If there are already any flushing task, Wait for some time and retry. + LOG_EVERY_T(INFO, 60) << fmt::format( + "Failed to reserve memory {} for flush memtable, retry after 100ms", + PrettyPrinter::print_bytes(size)); + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } else { + st = Status::OK(); Review Comment: 是的,至少保证一个 memtable 可以执行下刷,避免卡死。 -- 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: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org