<
classTImpl>
56 returnGetJobImpl(deadline, holder);
58ReturnNotFullyCheckedServers();
60 returnGetJobImpl(deadline, holder);
65 typedeflist<CNetScheduleGetJob::SEntry>
TTimeline;
68 template<
classTImpl>
84 bool Done() {
return true; }
85 bool HasJob()
const{
return false; }
91 template<
classTImpl>
99 TTimeline& timeline, TImpl& get_job_impl) :
148affinity_ladder(
m_GetJobImpl.m_API->m_AffinityLadder);
155 returnaffinity_ladder.back().second;
172affinity_ladder(
m_GetJobImpl.m_API->m_AffinityLadder);
177 if(
job.
affinity== affinity_ladder[priority].first) {
183}
while(priority-- > 0);
213 template<
classTImpl>
214 template<
classTJobHolder>
222 if(
state== eStopped) {
227 if(
state== eRestarted) {
234 if(
i== m_ImmediateActions.end()) {
235 returnholder.HasJob() ? eJob : eAgain;
238 if(*
i== m_DiscoveryAction) {
239NextDiscoveryIteration();
246 boolincrement =
false;
251 const string& prio_aff_list = holder.Affinity();
252 const boolany_affinity = !holder.HasJob();
254 if(m_Impl.CheckEntry(*
i, prio_aff_list, any_affinity,
255holder.job, holder.job_status)) {
256 if(
i== m_ImmediateActions.begin()) {
263m_ImmediateActions.splice(m_ImmediateActions.begin(),
264m_ImmediateActions,
i);
276 i->deadline =
CDeadline(m_Impl.m_Timeout, 0);
277 i->all_affinities_checked = any_affinity;
278m_ScheduledActions.splice(m_ScheduledActions.end(),
279m_ImmediateActions,
i);
285m_ImmediateActions.erase(
i);
289m_ImmediateActions.erase(
i);
291 if(holder.HasJob()) {
299 while(!m_ScheduledActions.empty() &&
300m_ScheduledActions.front().deadline.GetRemainingTime().IsZero()) {
301m_ImmediateActions.splice(m_ImmediateActions.end(),
302m_ScheduledActions, m_ScheduledActions.begin());
306 while(
CNetServerserver = m_Impl.ReadNotifications()) {
307MoveToImmediateActions(server);
310 i= holder.Next(increment);
314 template<
classTImpl>
315 template<
classTJobHolder>
317 const CDeadline& deadline, TJobHolder& holder)
320 EResultret = GetJobImmediately(holder);
326 autoentry_has_more_jobs = [&](
const SEntry& entry) {
327 returnm_Impl.MoreJobs(entry);
331 if(find_if(m_ScheduledActions.begin(), m_ScheduledActions.end(),
332entry_has_more_jobs) == m_ScheduledActions.end()) {
340 _ASSERT(!m_ScheduledActions.empty());
343 CDeadlinenext_event_time = m_ScheduledActions.front().deadline;
344 boollast_wait = deadline < next_event_time;
345 if(last_wait) next_event_time = deadline;
347 if(
CNetServerserver = m_Impl.WaitForNotifications(next_event_time)) {
349MoveToImmediateActions(server);
350}
while((server = m_Impl.ReadNotifications()));
351}
else if(last_wait) {
354m_ImmediateActions.splice(m_ImmediateActions.end(),
355m_ScheduledActions, m_ScheduledActions.begin());
362TTimeline::iterator
i= timeline.begin();
364 while(
i!= timeline.end()) {
366TServers::iterator j = find(servers.begin(), servers.end(), address);
369 if(j != servers.end()) {
373timeline.erase(
i++);
378 template<
classTImpl>
382m_ImmediateActions.clear();
383m_ScheduledActions.clear();
384NextDiscoveryIteration();
387 template<
classTImpl>
392TTimeline::iterator
i= find(m_ScheduledActions.begin(),
393m_ScheduledActions.end(), entry);
396 if(
i!= m_ScheduledActions.end()) {
397m_ImmediateActions.splice(m_ImmediateActions.end(),
398m_ScheduledActions,
i);
402TTimeline::iterator j = find(m_ImmediateActions.begin(),
403m_ImmediateActions.end(), entry);
406 if(j == m_ImmediateActions.end()) {
407m_ImmediateActions.push_back(entry);
411 template<
classTImpl>
417m_Impl.m_API.GetService().Iterate(
419servers.push_back((*it)->m_ServerInPool->m_Address);
423 Filter(m_ImmediateActions, servers);
424 Filter(m_ScheduledActions, servers);
427 for(TServers::const_iterator
i= servers.begin();
428 i!= servers.end(); ++
i) {
429m_ImmediateActions.push_back(*
i);
433m_DiscoveryAction.deadline =
CDeadline(m_Impl.m_Timeout, 0);
434m_ScheduledActions.push_back(m_DiscoveryAction);
437 template<
classTImpl>
444 while(
i!= m_ScheduledActions.end()) {
445 if(
i->all_affinities_checked) {
448m_ImmediateActions.splice(m_ImmediateActions.end(),
449m_ScheduledActions,
i++);
CNetScheduleAPI::EJobStatus * job_status
CAnyAffinityJob(CNetScheduleJob &j, CNetScheduleAPI::EJobStatus *js, TTimeline &timeline)
const string & Affinity() const
CMostAffinityJob(CNetScheduleJob &j, CNetScheduleAPI::EJobStatus *js, TTimeline &timeline, TImpl &get_job_impl)
TIterator Next(bool increment)
CNetScheduleJob m_PreviousJob
CNetScheduleAPI::EJobStatus * job_status
const string & Affinity() const
EResult GetJobImpl(const CDeadline &deadline, TJobHolder &holder)
void NextDiscoveryIteration()
EResult GetJobImmediately(TJobHolder &holder)
void MoveToImmediateActions(SNetServerImpl *server_impl)
void ReturnNotFullyCheckedServers()
CNetScheduleGetJob::EResult GetJob(const CDeadline &deadline, CNetScheduleJob &job, CNetScheduleAPI::EJobStatus *job_status, bool any_affinity)
#define ERR_POST(message)
Error posting with file, line number information but without error codes.
const string & GetMsg(void) const
Get message string.
void Warning(CExceptionArgs_Base &args)
EJobStatus
Job status codes.
string job_id
Output job key.
#define numeric_limits
Pre-declaration of the "numeric_limits<>" template Forcibly overrides (using preprocessor) the origin...
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
bool IsExpired(void) const
Check if the deadline is expired.
vector< CSeq_align const * >::const_iterator TIterator
list< SSocketAddress > TServers
TTimeline::iterator TIterator
list< CNetScheduleGetJob::SEntry > TTimeline
void Filter(TTimeline &timeline, TServers &servers)
vector< pair< string, string > > TAffinityLadder
CRef< SNetServerInPool > m_ServerInPool
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4