diff --git a/tools/server/server-models.cpp b/tools/server/server-models.cpp index 3d134acf36..9dca737f6f 100644 --- a/tools/server/server-models.cpp +++ b/tools/server/server-models.cpp @@ -1399,9 +1399,22 @@ bool server_models::remove(const std::string & name) { return true; } - // remove from disk (best-effort: cancelled downloads may have no cached files) - bool ok = common_download_remove(name); + // on the cancelled-download path the status flips to DOWNLOADED while the + // monitoring thread still has a mutex-guarded step left, so joining under + // the lock would deadlock - join outside, as load_models() does + std::thread th = std::move(it->second.th); mapping.erase(name); + lk.unlock(); + + // join first so the monitoring thread's final mutex-guarded cleanup cannot + // race the disk removal, then remove from disk without holding the lock + // (best-effort: cancelled downloads may have no cached files) + if (th.joinable()) { + th.join(); + } + + bool ok = common_download_remove(name); + if (!ok) { SRV_WRN("removing model name=%s from disk returned false (no cached files?)\n", name.c_str()); }