Skip to content
Extraits de code Groupes Projets
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
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -138,8 +138,11 @@ function genie_queue_watch_dist(){ ...@@ -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) 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; $deja_la = true;
$taches = taches_generales(); $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){ 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; $deja_la = false;
return 1; return 1;
...@@ -156,25 +159,29 @@ function genie_queue_watch_dist(){ ...@@ -156,25 +159,29 @@ function genie_queue_watch_dist(){
* date du dernier appel (timestamp) * date du dernier appel (timestamp)
* @param int $time * @param int $time
* date de replanification * 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 * @param int $priority
* priorite * priorite
* @return void * @return void
*/ */
function queue_genie_replan_job($function,$period,$last=null,$time=0, $priority=0){ function queue_genie_replan_job($function,$period,$last=0,$time=null, $priority=0){
if (!$time){ static $done = array();
if (!is_null($last)) if (isset($done[$function])) return;
$time = $last+$period; $done[$function] = true;
else if (is_null($time)){
$time=time(); $time=time();
} if ($last)
if (is_null($last)) $time = max($last+$period,$time);
$last = $time-$period; }
spip_log("replan_job $function $period $last $time $priority",'queue'); if (!$last)
include_spip('inc/queue'); $last = $time-$period;
// on replanifie un job cron spip_log("replan_job $function $period $last $time $priority",'queue');
// uniquement si il n'y en a pas deja un avec le meme nom include_spip('inc/queue');
// independament de l'argument // on replanifie un job cron
queue_add_job($function, _T('tache_cron_secondes', array('function'=>$function, 'nb'=>$period)), array($last), "genie/", 'function_only', $time, $priority); // 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);
} }
......
...@@ -321,7 +321,7 @@ function queue_schedule($force_jobs = null){ ...@@ -321,7 +321,7 @@ function queue_schedule($force_jobs = null){
#spip_log("JQ schedule job ".$nbj." OK",'jq'); #spip_log("JQ schedule job ".$nbj." OK",'jq');
// on reinsert dans la base aussitot avec un status=_JQ_PENDING // on reinsert dans la base aussitot avec un status=_JQ_PENDING
$row['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); sql_insertq('spip_jobs', $row);
// on a la main sur le job : // on a la main sur le job :
...@@ -362,7 +362,7 @@ function queue_close_job(&$row,$time,$result=0){ ...@@ -362,7 +362,7 @@ function queue_close_job(&$row,$time,$result=0){
include_spip('inc/genie'); include_spip('inc/genie');
if ($result<0) if ($result<0)
// relancer tout de suite, mais en baissant la priorite // 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 else
// relancer avec la periode prevue // relancer avec la periode prevue
queue_genie_replan_job($row['fonction'],$periode,$time); queue_genie_replan_job($row['fonction'],$periode,$time);
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter