Changeset 39423 in spip-zone


Ignore:
Timestamp:
Jul 21, 2010, 11:32:08 AM (10 years ago)
Author:
cedric@…
Message:

optimisation : passer le champ status en int avec un index pour accelerer les traitements et eviter les slow queries

Location:
_plugins_/job_queue
Files:
2 deleted
4 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/job_queue/base/queue.php

    r38162 r39423  
    2929                "priorite"      => "smallint(6) NOT NULL default 0",
    3030                "date" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // date au plus tot
    31                 "status" => "varchar(15) NOT NULL default 'scheduled'",
     31                "status" => "tinyint NOT NULL default 1",
    3232                );
    3333
     
    9696                        ecrire_meta($nom_meta_base_version,$current_version="0.3.2",'non');
    9797                }
     98                if (version_compare($current_version,"0.3.3",'<')){
     99                        include_spip('inc/queue'); // define _JQ_PENDING
     100                        // virer d'abord l'index existant
     101                        sql_alter("table spip_jobs drop index status");
     102                        // ne pas refaire un update si la migration a deja eu lieu
     103                        if (!sql_countsel('spip_jobs', 'status=1')){
     104                                // renommer le champ le temps de la migration
     105                                sql_alter("table spip_jobs change status status_old varchar(15) NOT NULL default 'scheduled'");
     106                                // ajouter le nouveau status avec un nom provisoire
     107                                sql_alter("table spip_jobs add status_new tinyint NOT NULL default 1");
     108                                // synchroniser les deux status
     109                                sql_update('spip_jobs',array('status_new'=>intval(_JQ_PENDING)),"status_old='pending'");
     110                        }
     111                        // renommer le status
     112                        sql_alter("table spip_jobs change status_new status tinyint NOT NULL default 1");
     113                        // placer un index dessus
     114                        sql_alter("table spip_jobs add index status (status)");
     115                        // virer le vieux status
     116                        sql_alter("table spip_jobs drop status_old");
     117                        ecrire_meta($nom_meta_base_version,$current_version="0.3.3",'non');
     118                }
    98119
    99120        }
  • _plugins_/job_queue/inc/queue.php

    r38751 r39423  
    77 */
    88
     9@define('_JQ_SCHEDULED',1);
     10@define('_JQ_PENDING',0);
    911
    1012/**
     
    4850                AND
    4951                        sql_countsel('spip_jobs',
    50                                 'status=\'scheduled\' AND fonction='.sql_quote($function)
     52                                'status='.intval(_JQ_SCHEDULED).' AND fonction='.sql_quote($function)
    5153                                .(($no_duplicate==='function_only')?'':
    5254                                 ' AND md5args='.sql_quote($md5args).' AND inclure='.sql_quote($file)))
     
    6769                        'priorite'=>max(-10,min(10,intval($priority))),
    6870                        'date'=>$date,
    69                         'status'=>'scheduled',
     71                        'status'=>_JQ_SCHEDULED,
    7072                ));
    7173
     
    235237        // pour qu'il ne bloque pas les autres jobs en attente
    236238        if (is_array($force_jobs) AND count($force_jobs))
    237                 $cond = "status='scheduled' AND ".sql_in("id_job", $force_jobs);
     239                $cond = "status=".intval(_JQ_SCHEDULED)." AND ".sql_in("id_job", $force_jobs);
    238240        else {
    239241                $now = date('Y-m-d H:i:s',$time);
    240                 $cond = "status='scheduled' AND date<".sql_quote($now);
     242                $cond = "status=".intval(_JQ_SCHEDULED)." AND date<".sql_quote($now);
    241243        }
    242244
     
    247249                        $nbj++;
    248250                        // il faut un verrou, a base de sql_delete
    249                         if (sql_delete('spip_jobs',"status='scheduled' AND id_job=".intval($row['id_job']))){
     251                        if (sql_delete('spip_jobs',"id_job=".intval($row['id_job']."AND status=".intval(_JQ_SCHEDULED)))){
    250252                                #spip_log("JQ schedule job ".$nbj." OK",'jq');
    251                                 // on reinsert dans la base aussitot avec un status='pending'
    252                                 $row['status'] = 'pending';
     253                                // on reinsert dans la base aussitot avec un status=_JQ_PENDING
     254                                $row['status'] = _JQ_PENDING;
    253255                                $row['date'] = $time;
    254256                                sql_insertq('spip_jobs', $row);
     
    277279
    278280/**
    279  * Terminer un job au status 'pending' :
     281 * Terminer un job au status _JQ_PENDING :
    280282 *  - le reprogrammer si c'est un cron
    281283 *  - supprimer ses liens
     
    362364        $time = time();
    363365
    364         // traiter les jobs morts au combat (pending depuis plus de 180s)
     366        // traiter les jobs morts au combat (_JQ_PENDING depuis plus de 180s)
    365367        // pour cause de timeout ou autre erreur fatale
    366         $res = sql_select("*","spip_jobs","status='pending' AND date<".sql_quote(date('Y-m-d H:i:s',$time-180)));
     368        $res = sql_select("*","spip_jobs","status=".intval(_JQ_PENDING)." AND date<".sql_quote(date('Y-m-d H:i:s',$time-180)));
    367369        while ($row = sql_fetch($res))
    368370                queue_close_job($row,$time);
     
    370372        // chercher la date du prochain job si pas connu
    371373        if (is_null($next) OR !isset($GLOBALS['meta']['queue_next_job_time'])){
    372                 $date = sql_getfetsel('date','spip_jobs',"status='scheduled'",'','date','0,1');
     374                $date = sql_getfetsel('date','spip_jobs',"status=".intval(_JQ_SCHEDULED),'','date','0,1');
    373375                $next = strtotime($date);
    374376        }
     
    376378                if ($next){
    377379                        if (is_null($nb_jobs_scheduled))
    378                                 $nb_jobs_scheduled = sql_countsel('spip_jobs',"status='scheduled' AND date<".sql_quote(date('Y-m-d H:i:s',$time)));
     380                                $nb_jobs_scheduled = sql_countsel('spip_jobs',"status=".intval(_JQ_SCHEDULED)." AND date<".sql_quote(date('Y-m-d H:i:s',$time)));
    379381                        elseif ($next<=$time)
    380382                                $nb_jobs_scheduled++;
  • _plugins_/job_queue/plugin.xml

    r38923 r39423  
    33  <auteur>Cedric&amp;Fil</auteur>
    44  <version>0.4.5</version>
    5   <version_base>0.3.2</version_base>
     5  <version_base>0.3.3</version_base>
    66  <etat>test</etat>
    77  <description>Gestion d'une queue de Jobs</description>
  • _plugins_/job_queue/prive/exec/job_queue.html

    r38923 r39423  
    1313        <ul class="liste_items">
    1414                <BOUCLE_jobs(JOBS){par date}{pagination 20}>
    15                         <li class="item #STATUS">
    16                                 <div class="date">[(#DATE|date_relative)][ (#STATUS|=={pending}|oui)(en cours)]</div>
     15                        <li class="item[ (#STATUS|?{'scheduled','pending'})]">
     16                                <div class="date">[(#DATE|date_relative)][ (#STATUS|non)(en cours)]</div>
    1717                                [<strong class="description">(#DESCRIPTIF|PtoBR)</strong>]
    1818                                [<span class="small">| #FONCTION((#ARGS|unserialize|implode{','}))</span>]
Note: See TracChangeset for help on using the changeset viewer.