modify recall
This commit is contained in:
@@ -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);
|
out_key.append(monitor).append("_").append(ymd).append("_").append(hms);
|
||||||
return true;
|
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.busytype = static_cast<int>(DeviceState::IDLE);
|
||||||
dev.isbusy = 0;
|
dev.isbusy = 0;
|
||||||
dev.busytimecount = 0;
|
dev.busytimecount = 0;
|
||||||
|
|
||||||
|
dircache_clear_device(dev.terminal_id); // ★新增:该装置的目录缓存生命周期到此结束,清空
|
||||||
|
|
||||||
continue;//这个装置处理下一个装置
|
continue;//这个装置处理下一个装置
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4962,11 +4998,26 @@ void check_recall_file() {
|
|||||||
// 立即发起第一个目录请求
|
// 立即发起第一个目录请求
|
||||||
if (front.cur_dir_index < static_cast<int>(front.dir_candidates.size())) {
|
if (front.cur_dir_index < static_cast<int>(front.dir_candidates.size())) {
|
||||||
front.cur_dir = front.dir_candidates[front.cur_dir_index];//从第一个目录开始
|
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
|
std::vector<tag_dir_info> cached;
|
||||||
<< " monitor=" << lm.monitor_id
|
if (dircache_try_get(dev.terminal_id, front.cur_dir, cached)) {
|
||||||
<< " dir=" << front.cur_dir << std::endl;
|
// 命中缓存:直接当作“目录 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 {
|
} else {
|
||||||
// 无目录可查
|
// 无目录可查
|
||||||
front.recall_status = static_cast<int>(RecallStatus::FAILED);
|
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())) {
|
if (front.cur_dir_index < static_cast<int>(front.dir_candidates.size())) {
|
||||||
front.cur_dir = front.dir_candidates[front.cur_dir_index];
|
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
|
std::vector<tag_dir_info> cached;
|
||||||
<< " dir=" << front.cur_dir << std::endl;
|
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 {
|
} else {
|
||||||
// 所有目录都失败
|
// 所有目录都失败
|
||||||
front.recall_status = static_cast<int>(RecallStatus::FAILED);
|
front.recall_status = static_cast<int>(RecallStatus::FAILED);
|
||||||
@@ -5129,10 +5194,24 @@ void check_recall_file() {
|
|||||||
front.list_result = ActionResult::PENDING;
|
front.list_result = ActionResult::PENDING;
|
||||||
if (front.cur_dir_index < static_cast<int>(front.dir_candidates.size())) {
|
if (front.cur_dir_index < static_cast<int>(front.dir_candidates.size())) {
|
||||||
front.cur_dir = front.dir_candidates[front.cur_dir_index];
|
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
|
std::vector<tag_dir_info> cached;
|
||||||
<< " dir=" << front.cur_dir << std::endl;
|
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 {
|
} else {
|
||||||
// 所有目录都“无匹配文件”
|
// 所有目录都“无匹配文件”
|
||||||
front.recall_status = static_cast<int>(RecallStatus::FAILED);
|
front.recall_status = static_cast<int>(RecallStatus::FAILED);
|
||||||
@@ -5391,12 +5470,29 @@ void check_recall_file() {
|
|||||||
front.cur_dir_index = 0; //正在尝试的目录下标
|
front.cur_dir_index = 0; //正在尝试的目录下标
|
||||||
front.cur_dir = front.dir_candidates[0]; //第一个目录
|
front.cur_dir = front.dir_candidates[0]; //第一个目录
|
||||||
front.list_result = ActionResult::PENDING; //目录状态:等待返回
|
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
|
std::vector<tag_dir_info> cached;
|
||||||
<< " dir=" << front.cur_dir
|
if (dircache_try_get(dev.terminal_id, front.cur_dir, cached)) {
|
||||||
<< " start=" << front.StartTime
|
front.dir_files[front.cur_dir] = std::move(cached);
|
||||||
<< " end=" << front.EndTime << std::endl;
|
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 {
|
} else {
|
||||||
front.recall_status = static_cast<int>(RecallStatus::FAILED); //目录列表空,失败
|
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)) { // 从缓存取目录列表
|
if(filemenu_cache_take(id, names)) { // 从缓存取目录列表
|
||||||
running_front->dir_files[running_front->cur_dir] = std::move(names);
|
running_front->dir_files[running_front->cur_dir] = std::move(names);
|
||||||
running_front->list_result = ActionResult::OK;
|
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
|
std::cout << "[RESP][FILEMENU->(EVENT/STATS)FILE][OK] dev=" << id
|
||||||
<< " monitor=" << running_monitor->monitor_id
|
<< " monitor=" << running_monitor->monitor_id
|
||||||
<< " dir=" << running_front->cur_dir
|
<< " dir=" << running_front->cur_dir
|
||||||
@@ -5817,6 +5916,9 @@ void on_device_response_minimal(int response_code,
|
|||||||
} else {
|
} else {
|
||||||
running_front->dir_files[running_front->cur_dir] = {};
|
running_front->dir_files[running_front->cur_dir] = {};
|
||||||
running_front->list_result = ActionResult::OK;
|
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
|
std::cout << "[RESP][FILEMENU->(EVENT/STATS)FILE][WARN] dev=" << id
|
||||||
<< " monitor=" << running_monitor->monitor_id
|
<< " monitor=" << running_monitor->monitor_id
|
||||||
<< " dir=" << running_front->cur_dir
|
<< " dir=" << running_front->cur_dir
|
||||||
|
|||||||
Reference in New Issue
Block a user