[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Reproducer for failing shepherd startup
From: |
Felix Lechner |
Subject: |
Reproducer for failing shepherd startup |
Date: |
Fri, 28 Jun 2024 08:17:41 -0700 |
Hi Maya, Ludo' and Attila,
On Thu, Jun 27 2024, Maya wrote:
> I still don't know how to fix the issue properly, but at least I can
> reconfigure my system now <3
I have a reproducer! In the code below, please change "sunday" to "0",
together with this line in your "services":
(service mdadm-resync-service-type)
When reconfiguring, you should see something like:
guix deploy: warning: an error occurred while upgrading services on
'YOUR-FQDN': %exception #<inferior-object #<&action-exception-error
service: root action: eval key: %exception args: ("#<&message
message: \"calendar-event: 0: invalid day of week\">")>>
That system should refuse to boot. Interestingly, the Shepherd will
block in such a way that even the Magic SysRq key 'i' which is normally
enough will not stop it. I have to go all the way *backwards* to 'b' in
the sequence B-U-S-I-E-R. [1]
Ludo', thank you for making the #:days-of the week symbolic [2] and also
for fixing the Shepherd to be able to show status and reboot again! [3]
Kind regards
Felix
[1] https://lists.gnu.org/archive/html/guix-devel/2024-04/msg00214.html
[2]
https://git.savannah.gnu.org/cgit/shepherd.git/commit/?h=devel&id=2e844430ec8aa4aebb7a8c185f54d6f91bbc3cfe
[3] https://lists.gnu.org/archive/html/info-gnu/2024-06/msg00009.html
* * *
(define (mdadm-resync-shepherd-service config)
(shepherd-service
(provision '(mdadm-resync))
(requirement '(file-systems user-processes))
(modules '((ice-9 ftw)
(ice-9 regex)
(shepherd service timer)))
(start #~(make-timer-constructor
;; Every first Sunday of the month at 1 AM.
(calendar-event #:days-of-month '(1 2 3 4 5 6 7)
#:days-of-week '(sunday)
#:hours '(1))
(lambda _
;; some helpers and error handling
(define (info message)
(let ((timestamp (strftime "%Y-%m-%dT%H:%M:%S%zZ" (localtime
(current-time)))))
(format (current-error-port) "~a ~a~%" timestamp message)))
(define (resync array)
(let ((port (open-output-file (string-append "/sys/block/"
array "/md/sync_action"))))
(display "check" port)
(close-port port))
(info (string-append "Started MD resync for " array ".")))
(let* ((is-mdadm-device? (lambda (file)
(string-match "^md.+" file)))
(arrays (scandir "/dev" is-mdadm-device?)))
(map resync arrays)))))
(stop #~(make-timer-destructor))
;; (actions
;; (list (shepherd-action
;; (name 'trigger)
;; (documentation "Trigger the action associated with this timer.")
;; (procedure #~(identity trigger-timer)))))
(documentation "MD array resync")))
(define mdadm-resync-service-type
(service-type
(name 'mdadm-resync)
(description "MD array resync")
(extensions
(list
(service-extension shepherd-root-service-type
(compose list mdadm-resync-shepherd-service))))
(default-value #f)))