Valider b54a16be rédigé par cerdic's avatar cerdic
Parcourir les fichiers

Report de r20135 : Plusieurs bugs autour des tache cron qui doivent se relancer car non finies :

queue_genie_replan_job :
quand appele avec =0 passer tel quel l'argument pour ne pas reinserer si la meme tache est en cours
ne s'executer qu'une seule fois par hit pour une fonction donnee

dans genie_queue_watch : appeler la fonction queue_genie_replan_job avec =0 pour ne pas recreer une tache de priorité nulle si une autre est deja en cours d'execution (eventuellement de priorité non nulle)

dans queue :
les jobs en cours d'execution avaient une date nulle en raison d'une coquille, ce qui les faisait croire morts et ils etaient relancés avec une priorité nulle en cas de concurrence avec une autre fin de job
relancer les jobs non finis au time() courant
parent 8695c45b
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+23 −16
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -138,8 +138,11 @@ function genie_queue_watch_dist(){
	if ($deja_la) return; // re-entrance si l'insertion des jobs echoue (pas de table spip_jobs a l'upgrade par exemple)
	$deja_la = true;
	$taches = taches_generales();
	$programmees = sql_allfetsel('fonction','spip_jobs',sql_in('fonction',array_keys($taches)));
	$programmees = array_map('reset',$programmees);
	foreach($taches as $tache=>$periode){
		queue_genie_replan_job($tache,$periode,time()-round(rand(1,$periode)));
		if (!in_array($tache,$programmees))
			queue_genie_replan_job($tache,$periode,time()-round(rand(1,$periode)),0);
	}
	$deja_la = false;
	return 1;
@@ -156,18 +159,22 @@ function genie_queue_watch_dist(){
 *   date du dernier appel (timestamp)
 * @param int $time
 *   date de replanification
 *   si null calculee automaitquement a partir de $last et $period
 *   si 0  = asap mais on n'insere pas le job si deja en cours d'execution
 * @param int $priority
 *   priorite
 * @return void
 */
function queue_genie_replan_job($function,$period,$last=null,$time=0, $priority=0){
		if (!$time){
			if (!is_null($last))
				$time = $last+$period;
			else
function queue_genie_replan_job($function,$period,$last=0,$time=null, $priority=0){
	static $done = array();
	if (isset($done[$function])) return;
	$done[$function] = true;
	if (is_null($time)){
		$time=time();
		if ($last)
			$time = max($last+$period,$time);
	}
		if (is_null($last))
	if (!$last)
		$last = $time-$period;
	spip_log("replan_job $function $period $last $time $priority",'queue');
	include_spip('inc/queue');
+2 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -321,7 +321,7 @@ function queue_schedule($force_jobs = null){
				#spip_log("JQ schedule job ".$nbj." OK",'jq');
				// on reinsert dans la base aussitot avec un status=_JQ_PENDING
				$row['status'] = _JQ_PENDING;
				$row['date'] = $time;
				$row['date'] = date('Y-m-d H:i:s',$time);
				sql_insertq('spip_jobs', $row);

				// on a la main sur le job :
@@ -362,7 +362,7 @@ function queue_close_job(&$row,$time,$result=0){
		include_spip('inc/genie');
		if ($result<0)
			// relancer tout de suite, mais en baissant la priorite
			queue_genie_replan_job($row['fonction'],$periode,0-$result/*last*/,0/*ASAP*/,$row['priorite']-1);
			queue_genie_replan_job($row['fonction'],$periode,$time,time(),$row['priorite']-1);
		else
			// relancer avec la periode prevue
			queue_genie_replan_job($row['fonction'],$periode,$time);