add a RequestJobBase base class for requests jobs

This commit is contained in:
2023-09-28 07:47:06 +02:00
parent 5e45ad3417
commit e600aebaae
5 changed files with 203 additions and 35 deletions

View File

@@ -150,6 +150,11 @@ void Job::Add(long job_id, Request * request, pt::Space & job, size_t priority)
void Job::RegisterRequestJob(long job_id, RequestJobBase & request_job)
{
request_jobs.insert(std::make_pair(job_id, &request_job));
}
size_t Job::Size(size_t priority) const
{
@@ -270,30 +275,7 @@ void Job::DoJob(JobTask & task, size_t priority)
if( task.job_type == JobTask::JOB_TYPE_REQUEST_CONTINUATION )
{
if( task.request )
{
Cur local_cur;
local_cur.request = task.request;
local_cur.request->run_state = Request::RunState::job_run;
local_cur.session = task.request->session;
local_cur.mount = task.request->mount;
res = plugin->Call(model_connector, &log, &local_cur, WINIX_JOB, &task.job, nullptr, task.job_type, task.job_id);
log << logsave;
{
Winix::Lock lock(synchro);
Cur old_cur = *cur;
*cur = local_cur;
DoRequestContinuationJob(task, priority);
*cur = old_cur;
}
}
else
{
log << log2 << "Job: request continuation task doesn't have a request set, skipping the job and request continuation" << logend;
log << log2 << "Job: this is an internal error, the request if exists in the queue will never be removed" << logend;
}
res = DoRequestJobs(task, task.job_id, priority);
}
else
{
@@ -314,6 +296,50 @@ void Job::DoJob(JobTask & task, size_t priority)
}
// second thread (objects not locked)
PluginRes Job::DoRequestJobs(JobTask & task, long job_id, size_t priority)
{
PluginRes res;
if( task.request )
{
auto jobs_iterator = request_jobs.lower_bound(job_id);
while( jobs_iterator != request_jobs.end() && jobs_iterator->first == job_id )
{
task.request->run_state = Request::RunState::job_run;
jobs_iterator->second->set_dependency(this);
jobs_iterator->second->set_request(task.request);
jobs_iterator->second->do_job();
jobs_iterator++;
}
Cur local_cur;
local_cur.request = task.request;
local_cur.request->run_state = Request::RunState::job_run;
local_cur.session = task.request->session;
local_cur.mount = task.request->mount;
{
Winix::Lock lock(synchro);
log << logsave;
Cur old_cur = *cur;
*cur = local_cur;
DoRequestContinuationJob(task, priority);
*cur = old_cur;
}
}
else
{
log << log2 << "Job: request continuation task doesn't have a request set, skipping the job and request continuation" << logend;
log << log2 << "Job: this is an internal error, the request if exists in the queue will never be removed" << logend;
}
return res;
}
// second thread (objects locked)
// use main_log (after locking) for the logs to be in the correct order
void Job::DoRequestContinuationJob(JobTask & job_task, size_t priority)
@@ -396,7 +422,6 @@ void Job::RemoveOldRequest(Request * request)
} // namespace Winix