From 93143fcba6af35aa43b3128e914cb9e39e3e4058 Mon Sep 17 00:00:00 2001 From: lnk Date: Wed, 5 Nov 2025 15:24:59 +0800 Subject: [PATCH] modify recall --- LFtid1056/cloudfront/code/cfg_parser.cpp | 142 +++++++++++++++++++---- 1 file changed, 122 insertions(+), 20 deletions(-) diff --git a/LFtid1056/cloudfront/code/cfg_parser.cpp b/LFtid1056/cloudfront/code/cfg_parser.cpp index 1d7ae2c..5b391c5 100644 --- a/LFtid1056/cloudfront/code/cfg_parser.cpp +++ b/LFtid1056/cloudfront/code/cfg_parser.cpp @@ -4684,7 +4684,40 @@ static bool make_target_key_from_filename(const std::string& fname, std::string& out_key.append(monitor).append("_").append(ymd).append("_").append(hms); return true; } -//////////////////////////////////////////////////////////////////////////////////////////////////////////////补招文件匹配事件 +//////////////////////////////////////////////////////////////////////////////////////////////////////////////补招文件新增优化20251105 +// ★新增:设备级目录缓存(dev_id -> { dir -> files }) +static std::mutex g_device_dir_cache_mtx; +static std::map>> g_device_dir_cache; + +// ★新增:尝试从缓存获取目录文件列表;命中返回 true(即便是空列表) +static bool dircache_try_get(const std::string& dev_id, + const std::string& dir, + std::vector& out) +{ + std::lock_guard lk(g_device_dir_cache_mtx); + auto it_dev = g_device_dir_cache.find(dev_id); + if (it_dev == g_device_dir_cache.end()) return false; + auto it_dir = it_dev->second.find(dir); + if (it_dir == it_dev->second.end()) return false; + out = it_dir->second; // 可能为空,但表示“已问过/已缓存” + return true; +} + +// ★新增:把目录文件列表写入缓存(空列表也写入,代表“已询问且为空”) +static void dircache_store(const std::string& dev_id, + const std::string& dir, + const std::vector& files) +{ + std::lock_guard lk(g_device_dir_cache_mtx); + g_device_dir_cache[dev_id][dir] = files; // 覆盖式记录 +} + +// ★新增:清空某个装置的目录缓存(当该装置所有补招文件记录都处理完毕时调用) +static void dircache_clear_device(const std::string& dev_id) +{ + std::lock_guard lk(g_device_dir_cache_mtx); + g_device_dir_cache.erase(dev_id); +} //////////////////////////////////////////////////////////////////////////////////////////////////////////////补招文件逻辑 @@ -4925,6 +4958,9 @@ void check_recall_file() { dev.busytype = static_cast(DeviceState::IDLE); dev.isbusy = 0; dev.busytimecount = 0; + + dircache_clear_device(dev.terminal_id); // ★新增:该装置的目录缓存生命周期到此结束,清空 + continue;//这个装置处理下一个装置 } @@ -4962,11 +4998,26 @@ void check_recall_file() { // 立即发起第一个目录请求 if (front.cur_dir_index < static_cast(front.dir_candidates.size())) { front.cur_dir = front.dir_candidates[front.cur_dir_index];//从第一个目录开始 - // ★★ 只发一个目录请求,并等待外部线程回写结果与文件名列表 - ClientManager::instance().add_file_menu_action_to_device(dev.terminal_id, front.cur_dir); - std::cout << "[check_recall_stat] LIST req dev=" << dev.terminal_id - << " monitor=" << lm.monitor_id - << " dir=" << front.cur_dir << std::endl; + + // ★新增:先查设备级目录缓存 + std::vector cached; + if (dircache_try_get(dev.terminal_id, front.cur_dir, cached)) { + // 命中缓存:直接当作“目录 OK”,不下发请求 + front.dir_files[front.cur_dir] = std::move(cached); + front.list_result = ActionResult::OK; + std::cout << "[dircache] HIT dev=" << dev.terminal_id + << " dir=" << front.cur_dir + << " entries=" << front.dir_files[front.cur_dir].size() << std::endl; + break; + } else { + + // ★★ 只发一个目录请求,并等待外部线程回写结果与文件名列表 + ClientManager::instance().add_file_menu_action_to_device(dev.terminal_id, front.cur_dir); + std::cout << "[check_recall_stat] LIST req dev=" << dev.terminal_id + << " monitor=" << lm.monitor_id + << " dir=" << front.cur_dir << std::endl; + break; + } } else { // 无目录可查 front.recall_status = static_cast(RecallStatus::FAILED); @@ -5009,10 +5060,24 @@ void check_recall_file() { if (front.cur_dir_index < static_cast(front.dir_candidates.size())) { front.cur_dir = front.dir_candidates[front.cur_dir_index]; - ClientManager::instance().add_file_menu_action_to_device(dev.terminal_id, front.cur_dir); - std::cout << "[check_recall_stat] LIST retry dev=" << dev.terminal_id - << " monitor=" << lm.monitor_id - << " dir=" << front.cur_dir << std::endl; + + // ★新增:先查缓存 + std::vector cached; + if (dircache_try_get(dev.terminal_id, front.cur_dir, cached)) { + front.dir_files[front.cur_dir] = std::move(cached); + front.list_result = ActionResult::OK; + std::cout << "[dircache] HIT dev=" << dev.terminal_id + << " dir=" << front.cur_dir + << " entries=" << front.dir_files[front.cur_dir].size() << std::endl; + break; + } else { + + ClientManager::instance().add_file_menu_action_to_device(dev.terminal_id, front.cur_dir); + std::cout << "[check_recall_stat] LIST retry dev=" << dev.terminal_id + << " monitor=" << lm.monitor_id + << " dir=" << front.cur_dir << std::endl; + break; + } } else { // 所有目录都失败 front.recall_status = static_cast(RecallStatus::FAILED); @@ -5129,10 +5194,24 @@ void check_recall_file() { front.list_result = ActionResult::PENDING; if (front.cur_dir_index < static_cast(front.dir_candidates.size())) { front.cur_dir = front.dir_candidates[front.cur_dir_index]; - ClientManager::instance().add_file_menu_action_to_device(dev.terminal_id, front.cur_dir); - std::cout << "[check_recall_stat] LIST next dev=" << dev.terminal_id - << " monitor=" << lm.monitor_id - << " dir=" << front.cur_dir << std::endl; + + // ★新增:先查缓存 + std::vector cached; + if (dircache_try_get(dev.terminal_id, front.cur_dir, cached)) { + front.dir_files[front.cur_dir] = std::move(cached); + front.list_result = ActionResult::OK; + std::cout << "[dircache] HIT dev=" << dev.terminal_id + << " dir=" << front.cur_dir + << " entries=" << front.dir_files[front.cur_dir].size() << std::endl; + break; + } else { + + ClientManager::instance().add_file_menu_action_to_device(dev.terminal_id, front.cur_dir); + std::cout << "[check_recall_stat] LIST next dev=" << dev.terminal_id + << " monitor=" << lm.monitor_id + << " dir=" << front.cur_dir << std::endl; + break; + } } else { // 所有目录都“无匹配文件” front.recall_status = static_cast(RecallStatus::FAILED); @@ -5391,12 +5470,29 @@ void check_recall_file() { front.cur_dir_index = 0; //正在尝试的目录下标 front.cur_dir = front.dir_candidates[0]; //第一个目录 front.list_result = ActionResult::PENDING; //目录状态:等待返回 - ClientManager::instance().add_file_menu_action_to_device(dev.terminal_id, front.cur_dir);//调用目录请求接口 - std::cout << "[check_recall_stat] LIST start dev=" << dev.terminal_id - << " monitor=" << lm.monitor_id - << " dir=" << front.cur_dir - << " start=" << front.StartTime - << " end=" << front.EndTime << std::endl; + + // ★新增:先查缓存 + std::vector cached; + if (dircache_try_get(dev.terminal_id, front.cur_dir, cached)) { + front.dir_files[front.cur_dir] = std::move(cached); + front.list_result = ActionResult::OK; + std::cout << "[dircache] HIT dev=" << dev.terminal_id + << " dir=" << front.cur_dir + << " entries=" << front.dir_files[front.cur_dir].size() << std::endl; + + break; // ★新增:命中缓存后,本轮就此结束(每终端本轮仅推进一条) + + } else { + + ClientManager::instance().add_file_menu_action_to_device(dev.terminal_id, front.cur_dir);//调用目录请求接口 + std::cout << "[check_recall_stat] LIST start dev=" << dev.terminal_id + << " monitor=" << lm.monitor_id + << " dir=" << front.cur_dir + << " start=" << front.StartTime + << " end=" << front.EndTime << std::endl; + + break; // ★新增:已下发请求,本轮结束,等回执/下一轮 + } } else { front.recall_status = static_cast(RecallStatus::FAILED); //目录列表空,失败 @@ -5809,6 +5905,9 @@ void on_device_response_minimal(int response_code, if(filemenu_cache_take(id, names)) { // 从缓存取目录列表 running_front->dir_files[running_front->cur_dir] = std::move(names); running_front->list_result = ActionResult::OK; + + dircache_store(id, running_front->cur_dir, running_front->dir_files[running_front->cur_dir]); // ★新增:缓存(非空或空都按实际存) + std::cout << "[RESP][FILEMENU->(EVENT/STATS)FILE][OK] dev=" << id << " monitor=" << running_monitor->monitor_id << " dir=" << running_front->cur_dir @@ -5817,6 +5916,9 @@ void on_device_response_minimal(int response_code, } else { running_front->dir_files[running_front->cur_dir] = {}; running_front->list_result = ActionResult::OK; + + dircache_store(id, running_front->cur_dir, running_front->dir_files[running_front->cur_dir]); // ★新增:缓存空列表 + std::cout << "[RESP][FILEMENU->(EVENT/STATS)FILE][WARN] dev=" << id << " monitor=" << running_monitor->monitor_id << " dir=" << running_front->cur_dir