Overview
Comment: | Replaced cron logic with crude but robust approach. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | run-mgr |
Files: | files | file ages | folders |
SHA1: |
358e040c6cfb815f5a75d46afefac9e9 |
User & Date: | matt on 2017-02-19 23:47:52 |
Other Links: | branch diff | manifest | tags |
Context
2017-02-20
| ||
13:47 | Suppressed some noisy output Closed-Leaf check-in: a7eabde3a3 user: matt tags: run-mgr | |
07:03 | Merged first version of mtutil into v1.64 Closed-Leaf check-in: 45b3d258d9 user: matt tags: v1.64-defunct | |
2017-02-19
| ||
23:47 | Replaced cron logic with crude but robust approach. check-in: 358e040c6c user: matt tags: run-mgr | |
2017-02-18
| ||
22:40 | Added basic crontab based launching check-in: 5d3a3776be user: matt tags: run-mgr | |
Changes
Modified common.scm from [0892af02f7] to [0f03b1a388].
︙ | ︙ | |||
1694 1695 1696 1697 1698 1699 1700 | ;; ;; min hour dayofmonth month dayofweek ;; 0-59 0-23 1-31 1-12 0-6 ### NOTE: dayofweek does not include 7 ;; ;; #t => yes, run the job ;; #f => no, do not run the job ;; | | | > | | > | | | | | | > > > > > | < | | > | | | | < > > | | > | | | < > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 | ;; ;; min hour dayofmonth month dayofweek ;; 0-59 0-23 1-31 1-12 0-6 ### NOTE: dayofweek does not include 7 ;; ;; #t => yes, run the job ;; #f => no, do not run the job ;; (define (common:cron-event cron-str now-seconds-in last-done) ;; ref-seconds = #f is NOW. (let* ((cron-items (map string->number (string-split cron-str))) (now-seconds (or now-seconds-in (current-seconds))) (now-time (seconds->local-time now-seconds)) (last-done-time (seconds->local-time last-done)) (all-times (make-hash-table))) (print "cron-items: " cron-items "(length cron-items): " (length cron-items)) (if (not (eq? (length cron-items) 5)) ;; don't even try to figure out junk strings #f (match-let ((( cmin chour cdayofmonth cmonth cdayofweek) cron-items) ;; 0 1 2 3 4 5 6 ((nsec nmin nhour ndayofmonth nmonth nyr ndayofweek n7 n8 n9) (vector->list now-time)) ((lsec lmin lhour ldayofmonth lmonth lyr ldayofweek l7 l8 l9) (vector->list last-done-time))) ;; create all possible time slots ;; remove invalid slots due to (for example) day of week ;; get the start and end entries for the ref-seconds (current) time ;; if last-done > ref-seconds => this is an ERROR! ;; does the last-done time fall in the legit region? ;; yes => #f do not run again this command ;; no => #t ok to run the command (for-each ;; month (lambda (month) (for-each ;; dayofmonth (lambda (dom) (for-each (lambda (hr) ;; hour (for-each (lambda (minute) ;; minute (let ((copy-now (apply vector (vector->list now-time)))) (vector-set! copy-now 0 0) ;; force seconds to zero (vector-set! copy-now 1 minute) (vector-set! copy-now 2 hr) (vector-set! copy-now 3 dom) ;; dom is already corrected for zero referenced (vector-set! copy-now 4 month) (let* ((copy-now-secs (local-time->seconds copy-now)) (new-copy (seconds->local-time copy-now-secs))) ;; remake the time vector (if (or (not cdayofweek) (equal? (vector-ref new-copy 6) cdayofweek)) ;; if the day is specified and a match OR if the day is NOT specified (if (or (not cdayofmonth) (equal? (vector-ref new-copy 3) (+ 1 cdayofmonth))) ;; if the month is specified and a match OR if the month is NOT specified (hash-table-set! all-times copy-now-secs new-copy)))))) (if cmin `(,cmin) ;; if given cmin, have to use it (list (- nmin 1) nmin (+ nmin 1))))) ;; minute (if chour `(,chour) (list (- nhour 1) nhour (+ nhour 1))))) ;; hour (if cdayofmonth `(,cdayofmonth) (list (- ndayofmonth 1) ndayofmonth (+ ndayofmonth 1))))) (if cmonth `(,cmonth) (list (- nmonth 1) nmonth (+ nmonth 1)))) (let ((before #f) (is-in #f)) (for-each (lambda (moment) (if (and before (<= before now-seconds) (>= moment now-seconds)) (begin (print) (print "Before: " (time->string (seconds->local-time before))) (print "Now: " (time->string (seconds->local-time now-seconds))) (print "After: " (time->string (seconds->local-time moment))) (print "Last: " (time->string (seconds->local-time last-done))) (if (< last-done before) (set! is-in before)) )) (set! before moment)) (sort (hash-table-keys all-times) <)) is-in))))) ;;====================================================================== ;; C O L O R S ;;====================================================================== (define (common:name->iup-color name) (case (string->symbol (string-downcase name)) ((red) "223 33 49") |
︙ | ︙ |
Modified mtut.scm from [63cded8057] to [e6a134e6d3].
︙ | ︙ | |||
239 240 241 242 243 244 245 | ;; (define (make-runname pre post) (time->string (seconds->local-time (current-seconds)) "%Yw%V.%w-%H%M")) ;; collect, translate, collate and assemble a pkt from the command-line ;; | | > > > > | | > | 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 | ;; (define (make-runname pre post) (time->string (seconds->local-time (current-seconds)) "%Yw%V.%w-%H%M")) ;; collect, translate, collate and assemble a pkt from the command-line ;; (define (command-line->pkt action args-alist sched-in) (let* ((sched (cond ((vector? sched-in)(local-time->seconds sched-in)) ;; we recieved a time ((number? sched-in) sched-in) (else (current-seconds)))) (args-data (if args-alist args-alist (hash-table->alist args:arg-hash))) (alldat (apply append (list 'a action 'U (current-user-name) 'D sched) (map (lambda (x) (let* ((param (car x)) (value (cdr x)) (pmeta (assoc param *arg-keys*)) (smeta (assoc param *switch-keys*)) (meta (if (or pmeta smeta) (cdr (or pmeta smeta)) |
︙ | ︙ | |||
285 286 287 288 289 290 291 | ;; NEED TIMESTAMP ON PKTS for efficient loading of packets into db. ;; make a run request pkt from basic data ;; | | | > | 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 | ;; NEED TIMESTAMP ON PKTS for efficient loading of packets into db. ;; make a run request pkt from basic data ;; (define (create-run-pkt mtconf area runkey runname mode-patt tag-expr pktsdir reason contour sched) (let ((area-path (configf:lookup mtconf "areas" area))) (let-values (((uuid pkt) (command-line->pkt "run" (append `(("-target" . ,runkey) ("-run-name" . ,runname) ("-start-dir" . ,area-path) ("-msg" . ,reason) ("-contour" . ,contour)) (if mode-patt `(("-mode-patt" . ,mode-patt)) '()) (if tag-expr `(("-tag-expr" . ,tag-expr)) '()) (if (not (or mode-patt tag-expr)) `(("-item-patt" . "%")) '())) sched))) (with-output-to-file (conc pktsdir "/" uuid ".pkt") (lambda () (print pkt)))))) ;; collect all needed data and create run pkts for contours with changed inputs ;; |
︙ | ︙ | |||
364 365 366 367 368 369 370 | (if (not (eq? (length valparts) 6)) (print "ERROR: bad sense spec \"" (string-intersperse sense " ") "\"") (let* ((run-name (car valparts)) (crontab (string-intersperse (cdr valparts))) (last-run (if (null? starttimes) ;; never run 0 (apply max (map cdr starttimes)))) | | > | | | | | > > | | > | | | 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 | (if (not (eq? (length valparts) 6)) (print "ERROR: bad sense spec \"" (string-intersperse sense " ") "\"") (let* ((run-name (car valparts)) (crontab (string-intersperse (cdr valparts))) (last-run (if (null? starttimes) ;; never run 0 (apply max (map cdr starttimes)))) (need-run (common:cron-event crontab #f last-run)) (runname (if need-run (conc "sched" (time->string (seconds->local-time (current-seconds)) "%M%H%d"))))) (print "last-run: " last-run " need-run: " need-run) (if need-run (configf:section-var-set! torun contour runkey `(,(conc ruletype ":" (string-intersperse (cdr valparts) "-")) ,runname ,need-run)))))) ((file file-or) ;; one or more files must be newer than the reference (let* ((file-globs (cdr valparts)) (youngestdat (common:get-youngest file-globs)) (youngestmod (car youngestdat))) ;; (print "youngestmod: " youngestmod " starttimes: " starttimes) (if (null? starttimes) ;; this target has never been run (configf:section-var-set! torun contour runkey `("file:neverrun" ,runname)) (for-each (lambda (starttime) ;; look at the time the last run was kicked off for this contour (if (> youngestmod (cdr starttime)) (begin (print "starttime younger than youngestmod: " starttime " Youngestmod: " youngestmod) (configf:section-var-set! torun contour runkey `(,(conc ruletype ":" (cadr youngestdat)) ,runname #f))))) starttimes)) )) ((file-and) ;; all files must be newer than the reference (let* ((file-globs (cdr valparts)) (youngestdat (common:get-youngest file-globs)) (youngestmod (car youngestdat)) (success #t)) ;; any cases of not true, set flag to #f for AND ;; (print "youngestmod: " youngestmod " starttimes: " starttimes) (if (null? starttimes) ;; this target has never been run (configf:section-var-set! torun contour runkey `("file:neverrun" ,runname #f)) (for-each (lambda (starttime) ;; look at the time the last run was kicked off for this contour (if (< youngestmod (cdr starttime)) (set! success #f))) starttimes)) (if success (begin (print "starttime younger than youngestmod: " starttime " Youngestmod: " youngestmod) (configf:section-var-set! torun contour runkey `(,(conc ruletype ":" (cadr youngestdat)) ,runname #f)))))) ))) keydats))) (hash-table-keys rgconf)) ;; now have to run populated (for-each (lambda (contour) (let* ((mode-tag (string-split (or (configf:lookup mtconf "contours" contour) "") "/")) (mode-patt (if (eq? (length mode-tag) 2)(cadr mode-tag) #f)) (tag-expr (if (null? mode-tag) #f (car mode-tag)))) (for-each (lambda (runkeydat) (let* ((runkey (car runkeydat)) (info (cadr runkeydat))) (for-each (lambda (area) (if (< (length info) 3) (print "ERROR: bad info data for " contour ", " runkey ", " area) (let ((runname (cadr info)) (reason (car info)) (sched (caddr info))) (print "runkey: " runkey " contour: " contour " info: " info " area: " area " tag-expr: " tag-expr " mode-patt: " mode-patt) (create-run-pkt mtconf area runkey runname mode-patt tag-expr pktsdir reason contour sched)))) areas))) (configf:get-section torun contour)))) (hash-table-keys torun)))))) (define (pkt->cmdline pkta) (fold (lambda (a res) |
︙ | ︙ |
Modified runconfigs.config from [598465160d] to [9aede9683d].
︙ | ︙ | |||
12 13 14 15 16 17 18 | # hour 0-23 # day of month 1-31 # month 1-12 (or names, see below) # day of week 0-7 (0 or 7 is Sun, or use names) # every friday at midnight run all all:scheduled auto 0 0 0 0 5 | | | 12 13 14 15 16 17 18 19 | # hour 0-23 # day of month 1-31 # month 1-12 (or names, see below) # day of week 0-7 (0 or 7 is Sun, or use names) # every friday at midnight run all all:scheduled auto 0 0 0 0 5 quick:scheduled auto 47 * * * * |