[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: ZFS on Guix
From: |
raid5atemyhomework |
Subject: |
Re: ZFS on Guix |
Date: |
Wed, 10 Feb 2021 07:37:42 +0000 |
Hello Danny,
> I just wanted to say that I'm not ignoring your patch, I'm just not qualified
> to review it. I hope someone steps up to it--otherwise I can't really tell
> whether (mbegin %state-monad...) inside a random service procedure is a good
> idea.
>
> Then again, provenance-service-type does it and there it seems to be fine...
For ***this*** very specific case it is because of a random weirdness of
`system-service-type`.
Specifically, the *value* of that service-type is an association list of
filenames and their contained store values. However, an ***extension*** of
that service-type must be a monadic action that results in an association list
of filename-contents.
Here is relevant code in `gnu/services`:
```scheme
(define (system-derivation entries mextensions)
"Return as a monadic value the derivation of the 'system' directory
containing the given entries."
(mlet %store-monad ((extensions (mapm/accumulate-builds identity
mextensions)))
(lower-object
(file-union "system"
(append entries (concatenate extensions))))))
(define system-service-type
;; This is the ultimate service type, the root of the service DAG. The
;; service of this type is extended by monadic name/item pairs. These items
;; end up in the "system directory" as returned by
;; 'operating-system-derivation'.
(service-type (name 'system)
(extensions '())
(compose identity)
(extend system-derivation)
(description
"Build the operating system top-level directory, which in
turn refers to everything the operating system needs: its kernel, initrd,
system profile, boot script, and so on.")))
```
So *extensions* must be monads (due to `mapm/accumulate-builds` on the
`mextensions`) but the raw value must be a simple non-monadic assoc list.
The patch moves some generated files ("kernel" and "hurd") from the value of
the `system-service-type` to an extension of `system-service-type`, thus the
extra `mbegin %store-monad`. It needs to be `%store-monad` since that is the
monad used by the `system-derivation` function.
See:
```scheme
(define (kernel-builder-configuration->system-entry config)
"Return the kernel and hurd entries of the 'system' directory."
(mbegin %store-monad
#;...))
#;...
(define kernel-loadable-module-service-type
(service-type (name 'kernel-loadable-modules)
(extensions
(list (service-extension system-service-type
kernel-builder-configuration->system-entry))) ;; <-- OVER HERE
(compose concatenate)
(extend kernel-builder-configuration-add-modules)
(description
"Register packages containing kernel-loadable modules and adds
them+to the system.")))
```
So it is not just some "random service procedure", it is because that is the
interface exposed by `system-service-type` for its extensions, extensions of
`system-service-type` have to yield a monadic action. `mbegin` is one of the
simpler monadic actions. It is also in the "correct place" as best as I can
tell, since only service types in `gnu/services.scm` dare to extend
`system-service-type`.
`provenance-service-type` does this as well because it *also* extends
`system-service-type`. This is basically done here simply because that is what
`system-service-type` expects.
Thanks
raid5atemyhomework