]> granicus.if.org Git - fcron/commitdiff
Added option jitter
authorthib <thib@thib-eee.(none)>
Sun, 29 Mar 2009 20:31:53 +0000 (21:31 +0100)
committerthib <thib@thib-eee.(none)>
Sun, 29 Mar 2009 20:31:53 +0000 (21:31 +0100)
conf.c
database.c
doc/en/fcrontab.5.sgml
doc/fcron-doc.mod.in
fileconf.c
global.h
save.c
save.h

diff --git a/conf.c b/conf.c
index d50ec94dee1a3cf881becec94be3e3ddde23a6dd..84575e6cc8592da0da0f4f4c5b6aba825508c18a 100644 (file)
--- a/conf.c
+++ b/conf.c
@@ -661,6 +661,12 @@ read_file(const char *file_name, cf_t *cf)
            cl->cl_timefreq = (time_t) bufi;
            break;
 
+       case S_JITTER_T:
+           /* read the jitter (uchar) to use to set next execution time */
+           Read(bufi, size, "Error while reading jitter field");
+           cl->cl_jitter = (unsigned char) bufi;
+           break;
+
        case S_MINS_T:
            Read(cl->cl_mins, size, "Error while reading mins field");
            break;
index 638ddddfe0686baf9eccfc5f38e0dd1e5d5325a6..65d8afd129a1a5e56949cc719d92fa51b934055d 100644 (file)
@@ -1153,6 +1153,13 @@ set_next_exe(cl_t *line, char option, int info_fd)
            nextexe += ( (i= int_end_timet - nextexe) > 0) ? 
                (time_t)(((float)i * (float)rand())/(float)RAND_MAX) : 0;
        }
+       else if (is_td(line->cl_option) && line->cl_runfreq != 1 && line->cl_jitter > 0){
+           /* &-lines only:
+            * run the command between nextexe and nextexe+jitter seconds,
+            * as a way not to have 100 jobs all starting exactly at 
+            * the second 0 of the minute they should run */
+           nextexe += (time_t)(((float)line->cl_jitter * (float)rand())/(float)RAND_MAX);
+       }
 
        line->cl_nextexe = nextexe + (line->cl_file->cf_tzdiff * 3600);
 
index 751c8e7801ac7676b5387a389222404afe192145..77b7e35e6946b685d20a8e0c74f924ff5d8eb090 100644 (file)
@@ -478,6 +478,15 @@ useful when used in conjunction with option &optvolatile;.</para>
                    </listitem>
                </varlistentry>
 
+               <varlistentry id="fcrontab.5.jitter">
+                   <term>jitter</term>
+                   <listitem>
+                       <para><emphasis><type>integer</type></emphasis>(<constant>0</constant>)</para>
+                       <para>Run the task between 0 and jitter seconds later than it should have been run. This options only applies to &-lines and is intended for systems where many jobs are supposed to be started at the same minute: the jitter option will randomly spread the start of all those jobs across the first jitter seconds of the minute instead of starting all of them at the first second of the minute. The argument must be between 0 and 255 (inclusive).</para>
+                       <para>&seealso; option &optrandom;.</para>
+                   </listitem>
+               </varlistentry>
+
                <varlistentry id="fcrontab.5.lavg">
                    <term>lavg</term>
                    <listitem>
@@ -611,6 +620,7 @@ execution interval. Besides, you must know that the random scheme may be quite
 easy to guess for skilled people: thus, you shouldn't rely on this option
 to make important things secure. However, it shouldn't be a problem
 for most uses.</para>
+                       <para>&seealso; option &optjitter;.</para>
                    </listitem>
                </varlistentry>
 
index 40c4fa288c55718e7848ae1edcfc771053a4c612..a09b301fe6e5c4a24c5506a517a2def846a0be66 100644 (file)
@@ -74,6 +74,7 @@
 <!ENTITY optexesev '<link linkend="fcrontab.5.exesev"><varname>exesev</varname></link>'>
 <!ENTITY optfirst '<link linkend="fcrontab.5.first"><varname>first</varname></link>'>
 <!ENTITY optforcemail '<link linkend="fcrontab.5.forcemail"><varname>forcemail</varname></link>'>
+<!ENTITY optjitter '<link linkend="fcrontab.5.jitter"><varname>jitter</varname></link>'>
 <!ENTITY optlavg '<link linkend="fcrontab.5.lavg"><varname>lavg</varname></link>'>
 <!ENTITY optlavg1 '<link linkend="fcrontab.5.lavgX"><varname>lavg1</varname></link>'>
 <!ENTITY optlavg5 '<link linkend="fcrontab.5.lavgX"><varname>lavg5</varname></link>'>
index cfa3be4cfd385e9daf490fc93b5582a3777d9f9b..f1489a61864ccd3649e8f6665c33fd4ec6efbdf6 100644 (file)
@@ -904,6 +904,14 @@ read_opt(char *ptr, cl_t *cl)
                fprintf(stderr, "  Opt : \"%s\" %d\n", opt_name, i);
        }
 
+       else if( strcmp(opt_name, "jitter") == 0 ) {
+           if(!in_brackets ||(ptr=get_num(ptr, &i, UCHAR_MAX, 0, NULL))==NULL)
+               Handle_err;
+           cl->cl_jitter = i;
+           if (debug_opt)
+               fprintf(stderr, "  Opt : \"%s\" %d\n", opt_name, i);
+       }
+
        /* handle %-line : we check if we are really in a %-line (which we do not do
         * for other options), because writing "&hourly" in a fcrontab results in an
         * error (hourly ignored) hard to find, and, in any case, annoying. */
index cf177f7d7afbf2b770abcc13c0c3cee3419b0f5f..fba2b01bd4f533b699e9329ca7d377db7f54fc95 100644 (file)
--- a/global.h
+++ b/global.h
@@ -221,6 +221,7 @@ typedef struct cl_t {
     unsigned char  cl_lavg[LAVG_SIZE];/*load averages needed (1,5,15 mins)   */
     unsigned char  cl_numexe;     /* entries in queues & running processes   */
     char           cl_nice;       /* nice value to control priority          */
+    unsigned char  cl_jitter;     /* run randomly late up to jitter seconds  */
     /* see bitstring(3) man page for more details */
     bitstr_t      bit_decl(cl_mins, 60); /* 0-59                            */
     bitstr_t      bit_decl(cl_hrs, 24);  /* 0-23                            */
diff --git a/save.c b/save.c
index f50c669f53904e7e35a819aba8bc8a261597fa70..ef2d28ef859a17d3b16e8c2ac8c4f63268e505c0 100644 (file)
--- a/save.c
+++ b/save.c
@@ -263,6 +263,9 @@ write_file_to_disk(int fd, struct cf_t *file, time_t time_date)
        if ( line->cl_tz != NULL ) {
            Save_str(fd, S_TZ_T, line->cl_tz, write_buf, &write_buf_used);
        }
+       if ( line->cl_jitter > 0 ) {
+           Save_lint(fd, S_JITTER_T, line->cl_jitter, write_buf, &write_buf_used);
+       }
                     
        if ( is_freq(line->cl_option) ) {
            /* save the frequency to run the line */
diff --git a/save.h b/save.h
index 8a8e21bf760c9c0fe0876b7ef7619ac3ddc90a15..e6ca454a714e4e2852d300ed0f339f12e5f9de40 100644 (file)
--- a/save.h
+++ b/save.h
@@ -81,5 +81,6 @@ extern int save_file_safe(cf_t *file, char *final_path, char *prog_name, uid_t o
 #define S_OPTION_T     2017  /* options for that line (see option.h) */
 #define S_FIRST_T      2018  /* wait time before first execution */
 #define S_TZ_T         2019  /* time zone of the line */
+#define S_JITTER_T     2020  /* jitter of the line */
 
 #endif /* __SAVE_H__ */