From b54a16bed29f19e7b8a0e499827f8574ff55c53e Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Fri, 15 Feb 2013 13:14:02 +0000
Subject: [PATCH] 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
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

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
---
 ecrire/inc/genie.php | 39 +++++++++++++++++++++++----------------
 ecrire/inc/queue.php |  4 ++--
 2 files changed, 25 insertions(+), 18 deletions(-)

diff --git a/ecrire/inc/genie.php b/ecrire/inc/genie.php
index 799ca6922b..c19e27b6dd 100644
--- a/ecrire/inc/genie.php
+++ b/ecrire/inc/genie.php
@@ -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,25 +159,29 @@ 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
-				$time=time();
-		}
-		if (is_null($last))
-			$last = $time-$period;
-		spip_log("replan_job $function $period $last $time $priority",'queue');
-		include_spip('inc/queue');
-		// on replanifie un job cron
-		// uniquement si il n'y en a pas deja un avec le meme nom
-		// independament de l'argument
-		queue_add_job($function, _T('tache_cron_secondes', array('function'=>$function, 'nb'=>$period)), array($last), "genie/", 'function_only', $time, $priority);
+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 (!$last)
+		$last = $time-$period;
+	spip_log("replan_job $function $period $last $time $priority",'queue');
+	include_spip('inc/queue');
+	// on replanifie un job cron
+	// uniquement si il n'y en a pas deja un avec le meme nom
+	// independament de l'argument
+	queue_add_job($function, _T('tache_cron_secondes', array('function'=>$function, 'nb'=>$period)), array($last), "genie/", 'function_only', $time, $priority);
 }
 
 
diff --git a/ecrire/inc/queue.php b/ecrire/inc/queue.php
index 079ad94e0b..27e8d97eea 100644
--- a/ecrire/inc/queue.php
+++ b/ecrire/inc/queue.php
@@ -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);
-- 
GitLab