modify recall

This commit is contained in:
lnk
2025-11-05 15:24:59 +08:00
parent 02d2b021cd
commit 93143fcba6

View File

@@ -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<std::string, std::map<std::string, std::vector<tag_dir_info>>> g_device_dir_cache;
// ★新增:尝试从缓存获取目录文件列表;命中返回 true即便是空列表
static bool dircache_try_get(const std::string& dev_id,
const std::string& dir,
std::vector<tag_dir_info>& out)
{
std::lock_guard<std::mutex> 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<tag_dir_info>& files)
{
std::lock_guard<std::mutex> 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<std::mutex> 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<int>(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<int>(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<tag_dir_info> 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<int>(RecallStatus::FAILED);
@@ -5009,10 +5060,24 @@ void check_recall_file() {
if (front.cur_dir_index < static_cast<int>(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<tag_dir_info> 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<int>(RecallStatus::FAILED);
@@ -5129,10 +5194,24 @@ void check_recall_file() {
front.list_result = ActionResult::PENDING;
if (front.cur_dir_index < static_cast<int>(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<tag_dir_info> 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<int>(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<tag_dir_info> 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<int>(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