Exemple #1
0
/// Try so solve a Node
RenderAf * AfNodeSolve::trySolve( std::list<RenderAf*> & i_renders_list, MonitorContainer * i_monitoring)
{
	RenderAf * render = v_solve( i_renders_list, i_monitoring);

	if( NULL == render )
	{
		// Was not solved
		return NULL;
	}

	// Node solved successfully:

	// Store solve cycle
	m_solve_cycle = sm_solve_cycle;

	// Calculace new need value as node got some more resource
	// ( nodes shoud increment resource value in solve function )
	v_calcNeed();

	// Icrement solve cycle
	sm_solve_cycle++;

	// Returning that node was solved
	return render;
}
Exemple #2
0
void UserAf::v_refresh( time_t currentTime, AfContainer * pointer, MonitorContainer * monitoring)
{
    /*    if( isLocked() )
    	 {
    		  return;
    	 }*/
//printf("UserAf::refresh: \"%s\"\n", getName().toUtf8().data());
    int _numjobs = m_jobslist.getCount();
    if(( _numjobs == 0) && ( false == isPermanent()))
    {
        if( m_zombietime )
        {
            if( (currentTime-m_zombietime) > af::Environment::getUserZombieTime() )
            {
                appendLog( std::string("ZOMBIETIME: " + af::itos( af::Environment::getUserZombieTime()) + " seconds with no job."));
                v_setZombie( monitoring);
                return;
            }
        }
        else
        {
            m_zombietime = currentTime;
        }
        return;
    }
    else m_zombietime = 0;

    int _numrunningjobs = 0;
    int _runningtasksnumber = 0;
    {
        AfListIt jobsListIt( &m_jobslist);
        for( AfNodeSrv *job = jobsListIt.node(); job != NULL; jobsListIt.next(), job = jobsListIt.node())
        {
            if( ((JobAf*)job)->isRunning())
            {
                _numrunningjobs++;
                _runningtasksnumber += ((JobAf*)job)->getRunningTasksNumber();
            }
        }
    }

    if((( _numrunningjobs      != m_running_jobs_num       ) ||
            ( _numjobs             != m_jobs_num              ) ||
            ( _runningtasksnumber  != m_running_tasks_num   )) &&
            monitoring )
        monitoring->addEvent( af::Msg::TMonitorUsersChanged, m_id);

    m_jobs_num = _numjobs;
    m_running_jobs_num = _numrunningjobs;
    m_running_tasks_num = _runningtasksnumber;

    // Update solving parameters:
    v_calcNeed();
}
Exemple #3
0
void JobAf::v_refresh( time_t currentTime, AfContainer * pointer, MonitorContainer * monitoring)
{
	RenderContainer * renders = (RenderContainer*)pointer;
	
	if( m_deletion )
	{
		for( int b = 0; b < m_blocks_num; b++)
			m_blocks[b]->v_refresh( currentTime, renders, monitoring);
		if( getRunningTasksNumber() == 0 ) deleteNode( NULL, monitoring);
	}
	if( isLocked() ) return;
	
	// for database and monitoring
	uint32_t old_state = m_state;
	uint32_t jobchanged = 0;
	
	// check job dependences
	checkDepends();
	
	//check wait time
	{
		bool wasWaiting = m_state & AFJOB::STATE_WAITTIME_MASK;
		if( m_time_wait > currentTime ) m_state = m_state | AFJOB::STATE_WAITTIME_MASK;
		else m_state = m_state & (~AFJOB::STATE_WAITTIME_MASK);
		bool nowWaining = m_state & AFJOB::STATE_WAITTIME_MASK;
		if( wasWaiting != nowWaining) jobchanged = af::Monitor::EVT_jobs_change;
	}

	//
	// Update blocks (blocks will uptate its tasks):
	for( int b = 0; b < m_blocks_num; b++)
		if( m_blocks[b]->v_refresh( currentTime, renders, monitoring))
			jobchanged = af::Monitor::EVT_jobs_change;
	// Check block depends after all block refreshed,
	// as states can be changed during refresh.
	// ( some block can be DONE after refresh )
	for( int b = 0; b < m_blocks_num; b++)
		if( m_blocks[b]->checkDepends( monitoring))
			jobchanged = af::Monitor::EVT_jobs_change;
	
	//
	// job state calculation
	m_state = m_state |   AFJOB::STATE_DONE_MASK;
	m_state = m_state & (~AFJOB::STATE_RUNNING_MASK);
	m_state = m_state & (~AFJOB::STATE_WARNING_MASK);
	m_state = m_state & (~AFJOB::STATE_ERROR_MASK);
	m_state = m_state & (~AFJOB::STATE_READY_MASK);
	m_state = m_state & (~AFJOB::STATE_SKIPPED_MASK);
	
	for( int b = 0; b < m_blocks_num; b++)
	{
		uint32_t state_block = m_blocks_data[b]->getState();
		m_state  = m_state | (state_block &   AFJOB::STATE_RUNNING_MASK   );
		m_state  = m_state | (state_block &   AFJOB::STATE_WARNING_MASK   );
		m_state  = m_state | (state_block &   AFJOB::STATE_ERROR_MASK     );
		m_state  = m_state | (state_block &   AFJOB::STATE_READY_MASK     );
		m_state  = m_state | (state_block &   AFJOB::STATE_SKIPPED_MASK   );
		m_state  = m_state & (state_block | (~AFJOB::STATE_DONE_MASK)     );
	}
	
	if( m_state & AFJOB::STATE_WAITDEP_MASK  ) m_state = m_state & (~AFJOB::STATE_READY_MASK);
	if( m_state & AFJOB::STATE_WAITTIME_MASK ) m_state = m_state & (~AFJOB::STATE_READY_MASK);
	
	if( m_state & AFJOB::STATE_DONE_MASK )
	{
		/// if job was not done, but now is done, we set job time_done
		if(( old_state & AFJOB::STATE_DONE_MASK) == false )
		{
			m_time_done = currentTime;
			if( m_time_started == 0 )
			{
				m_time_started = m_time_done;
				appendLog("Started.");
			}
			appendLog("Done.");
			jobchanged = af::Monitor::EVT_jobs_change;
			store();
		}
	}
	else
		m_time_done = 0;
	
	// Reset started time if job was started, but now no tasks are running or done
	if(( m_time_started != 0 ) &&
	   ( false == (m_state & AFJOB::STATE_RUNNING_MASK)     ) &&
	   ( false == (m_state & AFJOB::STATE_DONE_MASK)        )  )
	{
		// Search if the job has at least one done task
		bool has_done_tasks = false;
		for( int b = 0; b < m_blocks_num; b++ )
		{
			if( m_blocks_data[b]->getProgressTasksDone() > 0 )
			{
				has_done_tasks = true;
				break;
			}
		}
		// If the job has done task(s) we not reset started time in any case
		if( false == has_done_tasks ) m_time_started = currentTime;
	}
	
	
	if( m_state != old_state )
	{
		jobchanged = af::Monitor::EVT_jobs_change;
		
		// If it is no job monitoring, job just came to server and it is first it refresh,
		// so no change event and database storing needed
		if( monitoring )
			store();
		
		// Proccess events:
		if( m_id != AFJOB::SYSJOB_ID ) // skip system job
			if( m_custom_data.size() || m_user->getCustomData().size())
			{
				std::vector<std::string> events;
				
				// Collect events names:
				if(( m_state & AFJOB::STATE_ERROR_MASK ) && ( false == ( old_state & AFJOB::STATE_ERROR_MASK )))
					events.push_back("JOB_ERROR");
				
				if(( m_state & AFJOB::STATE_DONE_MASK ) && ( false == ( old_state & AFJOB::STATE_DONE_MASK )))
					events.push_back("JOB_DONE");
				
				emitEvents(events);
			}
	}
	
	if( m_thumb_changed || m_report_changed )
	{
		jobchanged = af::Monitor::EVT_jobs_change;
		m_thumb_changed = false;
		m_report_changed = false;
	}
	
	// Check age and delete if life finished:
	if( m_id != AFJOB::SYSJOB_ID ) // skip system job
	{
		int result_lifetime = m_time_life;
		if( result_lifetime < 0 ) result_lifetime = m_user->getJobsLifeTime(); // get default value from user
		if((result_lifetime > 0) && ((currentTime - m_time_creation) > result_lifetime))
		{
			appendLog( std::string("Life %1 finished.") + af::time2strHMS( result_lifetime, true));
			m_user->appendLog( std::string("Job \"") + m_name + "\" life " + af::time2strHMS( result_lifetime, true) + " finished.");
			deleteNode( renders, monitoring);
			jobchanged = af::Monitor::EVT_jobs_del, getId(), getUid();
		}
	}
	
	if(( monitoring ) &&  ( jobchanged )) monitoring->addJobEvent( jobchanged, getId(), getUid());
	
	// Update solving parameters:
	v_calcNeed();
}