add a RequestJobBase base class for requests jobs
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user