[PATCH] Add cachefilesd service.

  • Done
  • quality assurance status badge
Details
3 participants
  • Felix Lechner
  • Jean-Baptiste Note
  • Mathieu Othacehe
Owner
unassigned
Submitted by
Jean-Baptiste Note
Severity
normal
J
J
Jean-Baptiste Note wrote on 10 May 2020 21:19
(name . guixpatch)(address . guix-patches@gnu.org)(name . Mathieu Othacehe)(address . m.othacehe@gmail.com)
87v9l3zjg7.fsf@m4x.org
Dear guix developers, Mathieu,

Please find attached a first version of the cachefilesd service patch.
The second patch for documentation will be sent right after.

I have a few general newbie scheme questions:

- I gathered that #~ / #$ kinds of suspends evaluation / forces it -- is
there documentation about this somewhere ?

- There's something that looks like a splat operator (only seen in
conjuction with forcing evaluation in #$@) -- again i'd be interested
in more documentation about this feature -- is this a guix-specific
operator?

- I don't understand why there are ^L separating services in the scheme
files -- is this necessary? A convention? What purpose does it serve?

Regarding the patch itself:

- i'm not entirely sure the service belongs to services/linux.scm

- documentation is hastily written. I have found no way to indent
automatically the lisp code in the texi file, which is very painfull
-- would there be an emacs solution for this?

- there are no automated tests (beyond what I have done by hand
locally!), and there's no lint, so I don't really feel confident about
it :) Are there tests for services to alleviate my fears?

- I've copied some other service for modprobing the required kernel
modules before launching the daemon with a one-shot shepherd
service. Frankly i'm not happy about this solution, it seems to me
that it unnecessarily pollutes the shepherd configuration; maybe some
other mechanism (graft?) adjusting the modprobe configuration could be
better (better still, autoload the file). Any guidance would be nice
(including, that this solution is sufficient for now :))

I had great fun writing this, it reminded me of writing cookbooks during
my 'Chef' days. I must confess that the Chef DSL embedded in ruby seemed
more concise, and that it provided a way to write a cookbook
'out-of-tree' which was kind of less daunting for newcomers; however
it's already amazing that you have this kind of functionality!

Kind regards,
Jean-Baptiste
-----BEGIN PGP SIGNATURE-----

iQIzBAEBCAAdFiEEPxcq3dp4FVY5UpckkC0pVsuz75YFAl64U8gACgkQkC0pVsuz
75bJ4RAAoUmmXPdAGW3uD5W/YO8U8A1FhUr/qoq+1qkClSDv0Jt/qyKRca7hYrdZ
C0JAgfYGmdk/Qy0ltnRACR96pcZP4YUf5NWjTKNPQykOjucJISXsSUTSojljZHbT
c4ei7KjNMU0jRrrKZFqR4IlsVLYy1K4wFQfU4yLH9sU2ZgUd4R+Mb6eM1F7zWYog
qSHTp3+ZgAVB5BaZ9pDlDdsOAKU8WO5oy8in/GEFREoL5vjeBiueqLMSYI/epPWn
N94j96cM3I/sL/FaBs6Ib5cGvXox8TW54BoOx2HBTZMoo4iZkhDnSnFro8cZYa66
IeDta1xzfusDMmQibvMiw2w3D3w/mgLz+X5HO7kPTQrbg5XlK2kMdeiO6oUH5cw7
GA7ooB4MTIivZZeyqynXieUvcS2lIQ/1TS8TU6wgGNymUsrmym08+Y06Qtc9lyZh
nsIeFCmNEMqIXb/wIIjRgWtIX6movMmRNTCq7fBCXeTu50IvING1PNZsrToHN1qA
V9g49CBByBhVbEa661bldRwfVJgINoigI23BBzTZe0omabNym9RKdayAHdP099yY
zwC1e9KUUAK8UXU1X272lRjCElJy0+h5q++KVMdhiC8502nE2IJeLH1V2hZZOXkC
cywDxV5BhxISME24RFAXCrJxFUqdViZ3cU3dL1lmKDg+NPk7pzQ=
=sR04
-----END PGP SIGNATURE-----

J
J
Jean-Baptiste Note wrote on 10 May 2020 21:27
(address . 41180@debbugs.gnu.org)(name . Mathieu Othacehe)(address . m.othacehe@gmail.com)
87o8qvzj2p.fsf@m4x.org
Documentation patch.
From b169047ad64996860e6eb154bb4d20ad80463b47 Mon Sep 17 00:00:00 2001
From: Jean-Baptiste Note <jean-baptiste.note@m4x.org>
Date: Sun, 10 May 2020 18:43:08 +0000
Subject: [PATCH 2/2] doc: Add documentation for cachefilesd-service.

* doc/guix.texi (Linux Services): Add a new subsection and document the
cachefilesd service and its configuration.
---
doc/guix.texi | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)

Toggle diff (48 lines)
diff --git a/doc/guix.texi b/doc/guix.texi
index 0cba0ee1ec..4aaec43739 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -25724,6 +25724,41 @@ parameters, can be done as follow:
@end lisp
@end deffn
+@cindex cachefilesd
+@cindex cachefiles
+@cindex fscache
+@subsubheading cachefilesd Service
+
+The cachefilesd service allows one to load start @code{cachefilesd} for
+caching network filesystem data on local disks. This is especially
+useful for NFS and AFS shares, reducing read latency.
+
+@deffn {Scheme Variable} cachefilesd-service-type
+The service type for starting cachefilesd. For example starting the
+cachefiles daemon can be done as follow:
+
+@lisp
+(use-modules (gnu) (gnu services))
+(use-package-modules linux)
+(use-service-modules linux)
+
+(operating-system
+ ...
+ (services
+ (cons*
+ (service cachefilesd-service-type
+ (cachefilesd-configuration
+ (dir "/var/cache/fscache") ; the default value
+ (syslog? #f) ; don't require syslogd
+ (secctx "cachefiles_kernel_t")
+ (tag "mycache")
+ (brun 10)
+ (bcull 7)
+ (bstop 3)))
+ %base-services)))
+@end lisp
+@end deffn
+
@node Miscellaneous Services
@subsection Miscellaneous Services
--
2.26.2
-----BEGIN PGP SIGNATURE-----

iQIzBAEBCAAdFiEEPxcq3dp4FVY5UpckkC0pVsuz75YFAl64Va4ACgkQkC0pVsuz
75YRNg/9FtMmMlfwnaGw8WDWqCr9SXmEF9fUE8pcw5HLitsWSDveoIjbgVRbWbWg
Kwe5g+O248FwVrfT3yKznWTWj3Dfa44wpnMswDTulK9rTjTG4OE2Z7DpQd94IVVI
Q+x6i2/tKNPxoxNmJE3JdYFUNVo72ocBhygR6+Lb/6Bh3iw3Tx5PYy1xuDFGGVIj
KYiwl4NdVVjQ0mW2mjmH/vdjBaU4xZ0fqV4xHzE43m8ypGFY8kaP+Cnx9GB5mw+L
n40nlxfordb7txlhSN7QK4rTAMoxFax1wbfVGWiSrqG2vlLy1GJVgZZMSaS9e9tg
096iC+kvF+xbpkRIkbU1rppMX4N6ANIGCchRHjhY1TVk+WXHF5yBB7PxO8pcB6cA
0OkGLVMKe+56g+EVoBcvI/tWGoKcP1fr6z7kYK8qs5QM0321SpbDNbpvgNURVV3p
fHHCkK511/pkSTK5I2wNgyp10IkJgD4B90UqVzehiiaGscdMLc3ft5jEQg7ZB+SG
WVbw/mWUAtZkluyem8PsTNsrRGfawVYULHwJt60XLrqNopz/zwEUt4fsbTllnG4d
/wGx75GD67wCDnd6gjSFc8TDrEZA01Rh0B3mV+DY/w0qft2blCKoB813IVhxd4p4
gCOCUNEKBrbNE063No8nONY484hgT6QefFmHUBktDshogQYxCIA=
=w2wH
-----END PGP SIGNATURE-----

M
M
Mathieu Othacehe wrote on 11 May 2020 17:06
Re: [bug#41180] [PATCH] Add cachefilesd service.
(name . Jean-Baptiste Note)(address . jean-baptiste.note@m4x.org)(address . 41180@debbugs.gnu.org)
878shywly7.fsf@gnu.org
Hello Jean-Baptiste,

Thanks for this service!

Toggle quote (3 lines)
> - I gathered that #~ / #$ kinds of suspends evaluation / forces it -- is
> there documentation about this somewhere ?

#~ and #$ are related to the Gexp mechanism. It's documented here:
Toggle quote (5 lines)
> - There's something that looks like a splat operator (only seen in
> conjuction with forcing evaluation in #$@) -- again i'd be interested
> in more documentation about this feature -- is this a guix-specific
> operator?

#$@ is a shortcut for ungexp-splicing. It's also documented in the link
above. It can be a bit puzzling at start, don't hesitate to ask some
help on #guix channel.
Toggle quote (3 lines)
> - I don't understand why there are ^L separating services in the scheme
> files -- is this necessary? A convention? What purpose does it serve?

Yes, see the "Pagination" section in
"emacs-page-break-lines" to replace it by cleaner lines.

Toggle quote (4 lines)
> Regarding the patch itself:
>
> - i'm not entirely sure the service belongs to services/linux.scm

I think it's fine.

Toggle quote (4 lines)
> - there are no automated tests (beyond what I have done by hand
> locally!), and there's no lint, so I don't really feel confident about
> it :) Are there tests for services to alleviate my fears?

It would be nice to implement tests along with the new service
definition. You can have a look to (gnu tests cups) module for
instance. It tests the cups service by spawning a virtual-machine called
a "marionette". You could create a (gnu tests cachefilesd) doing a
similar job.

See "Running the Test Suite" in the info page for more details on how to
run the test suite.

Toggle quote (8 lines)
> - I've copied some other service for modprobing the required kernel
> modules before launching the daemon with a one-shot shepherd
> service. Frankly i'm not happy about this solution, it seems to me
> that it unnecessarily pollutes the shepherd configuration; maybe some
> other mechanism (graft?) adjusting the modprobe configuration could be
> better (better still, autoload the file). Any guidance would be nice
> (including, that this solution is sufficient for now :))

The ideal would be that cachefilesd loads the appropriated module. If
this is not possible, we can discuss extending
kernel-module-loader-service-type service. But for now I guess it's ok.

I hope it answers your questions, I'll review the rest of the service
later on.

Thanks,

Mathieu
M
M
Mathieu Othacehe wrote on 19 May 2020 14:12
(name . Jean-Baptiste Note)(address . jean-baptiste.note@m4x.org)(address . 41180@debbugs.gnu.org)
87k118unsc.fsf@gnu.org
Hello,

Overall, this looks nice! A few comments below. Note that you can merge
this patch with the documentation patch. It would also be nice to add
the associated system tests.

Toggle quote (9 lines)
> +(define-record-type* <cachefilesd-configuration>
> + cachefilesd-configuration make-cachefilesd-configuration
> + cachefilesd-configuration?
> +
> + ;; <package-path>
> + (cachefilesd cachefilesd-configuration-cachefilesd
> + (default cachefilesd))
> +

You could write something more concise here by removing empty lines and
adding the 'type' comment on the same line.

Toggle quote (3 lines)
> + (let ((secctx #$(cachefilesd-configuration-secctx config)))
> + (if secctx (format port "secctx ~a" secctx)))

You can use 'when' for one arm if conditions.

Toggle quote (6 lines)
> +
> + ;; XXX factor this
> + (format port "brun ~a%\n"
> + #$(number->string
> + (cachefilesd-configuration-brun config)))

It would indeed be nice to factor it, maybe by creating an association
table with the symbol name as CAR and the matching procedure as
CDR. Something like:

Toggle snippet (4 lines)
'(("frun" . cachefilesd-configuration-frun)
("bcull" . cachefilesd-configuration-bcull))

then you could iterate on that list.

Toggle quote (3 lines)
> + (if #$(cachefilesd-configuration-nocull? config)
> + (display "nocull\n" port))

Same as above. You can use 'when' or 'unless' instead of "(if test
stmt)".

Toggle quote (2 lines)
> + ;; Make sure the cache directory and pid dir exists

"dir" -> "directory".

Toggle quote (3 lines)
> + ;; XXX shepherd pid file handling: no idea how shepherd does it
> + ;; and if it's going to conflict with cachefilesd's

Shepherd documentation says:

Toggle snippet (7 lines)
When PID-FILE is true, it must be the name of a PID file associated
with the process being launched; the return value is the PID once
that file has been created. If PID-FILE does not show up in less
than PID-FILE-TIMEOUT seconds, the service is considered as failing
to start.

So I think you can remove this comment.

Thanks,

Mathieu
J
J
Jean-Baptiste Note wrote on 20 May 2020 22:39
(name . Mathieu Othacehe)(address . othacehe@gnu.org)(address . 41180@debbugs.gnu.org)
87367ucpdj.fsf@m4x.org
Hi Mathieu,

Thanks a lot for taking so much time to help me out and review this
patch.

Following your previous mail, I'm currently writing a test. I may follow
NFS's tests rather than CUPS -- (some of) NFS' tests just checks from
within the marionette that the service has been started, while CUPS
verifies from the outside that an external service is correctly running.

While I do prefer the CUPS test -- verify at the "user level" that the
service is provided -- it seems very complex to me to test cachefilesd
at a high level with a binary decision and no false positive. Venues for
this could be:

- maybe an NFS mount with the fsc option when cachefilesd is not
activated will fail -- I need to check that;

- or maybe mounting some NFS share with fsc, accessing it, and checking
afterwards that the cache has been filled by cached data -- this is
getting complex though, and probably not a clear-cut scenario.

I don't know how high you will set the bar and if a simple 'check that
the daemon is running' would be sufficient to you :)

Thanks a lot for the various documentation pointers and style
recommendation. I really appreciate all of this!

I will provide a comprehensive patch with your changes integrated, and a
test, as soon as i am happy with it -- or just give up writing the
perfect test.

Kind regards,
Jean-Baptiste
-----BEGIN PGP SIGNATURE-----

iQIzBAEBCAAdFiEEPxcq3dp4FVY5UpckkC0pVsuz75YFAl7FlYgACgkQkC0pVsuz
75YGZxAAhizoSDCp66Nzs6FFGlKHE21PfqOB1nNF88ak/8kYd/mo+TLMN4CILaeh
XlivhmK28z6XN8lyX2ou5P5VPgd7vK16uKUbu/l7rNsZPA8IuO6MnejSAeoPO3K6
2dYQyjgJKDYbwV9cRQUu8kcUrzOcjbvQmpX6mwZIIcdU4l/RystsH8ddDa/IrAfO
+YQ9VxiR7U8NCrMFJSnO2N/wl/h2OOygFg1LBO9HEGrbehJBFQnXSjTLsJNJRqV6
Iq6FEIghm3OqGIgFfBbVJ6wGptTPaZOBleUGjcmoI52KZMu5y8AxkqXEjr2ly3ym
J8qKdyW0hGxptBIYxICD78mjAe/JK/zwqqT4Z1DZnvbLQDTpcJn0+hHgGZBBFoK3
uIiI4FUjkFa+ML+8woFWCHA36DN62peU4XHilBYCgZWqGmh2RSMtSANjINp8uw6r
2XSUEMT1Wg8SRj3oynO8uGU/q/OBEqioelLRxEPO67YUgNoELcTbUwO0dmMqbUUf
7zP2Kz1sehT9762+9E7OpBTvPnk14xZNQK1IQb171AUmoIpaGMmUdT7VEq0CpyrV
WVWfSVopCWNbMIuAxfC/jQkCHDigBNeSOPZZ9LSzhg/qE7bj89VD/NsBbiY98Pdo
HI5/rM7yl0mLW+WIm3yD1SyL1cIusZ7lEO+MKKjAi2DIw379DMw=
=bVBr
-----END PGP SIGNATURE-----

M
M
Mathieu Othacehe wrote on 23 May 2020 08:44
(name . Jean-Baptiste Note)(address . jean-baptiste.note@m4x.org)(address . 41180@debbugs.gnu.org)
87lfljcfrc.fsf@gnu.org
Hello Jean-Baptiste,

Toggle quote (7 lines)
> Thanks a lot for the various documentation pointers and style
> recommendation. I really appreciate all of this!
>
> I will provide a comprehensive patch with your changes integrated, and a
> test, as soon as i am happy with it -- or just give up writing the
> perfect test.

Great :) I think that checking that the module is loaded, and the
cachefilesd service is running is already a first step. You can also
check for some properties in the sysfs, but unless you're already there,
maybe you don't need to push much further!

Thanks,

Mathieu
M
M
Mathieu Othacehe wrote on 2 Sep 2020 16:58
(name . Jean-Baptiste Note)(address . jean-baptiste.note@m4x.org)(address . 41180@debbugs.gnu.org)
87mu28ted0.fsf@gnu.org
Hello Jean-Baptiste,

Toggle quote (7 lines)
> Thanks a lot for the various documentation pointers and style
> recommendation. I really appreciate all of this!
>
> I will provide a comprehensive patch with your changes integrated, and a
> test, as soon as i am happy with it -- or just give up writing the
> perfect test.

Any progress on that one :)? Do not hesitate to ask some help here or on
#guix if needed.

Thanks,

Mathieu
F
F
Felix Lechner wrote on 9 Mar 2023 13:24
[PATCH v2] gnu: services: Add cachefilesd service. (Closes: #41180)
(address . 41180@debbugs.gnu.org)
2fddf19e501fecb23a3f14f112871880a0475e1f.1678364641.git.felix.lechner@lease-up.com
Thanks to Bruno Victal "mirai" for cooperating on this patch and for
generously sharing a wealth of insights about Guix services.

Thanks to Jean-Baptiste Note for an early version of this service!

Co-authored-by: Bruno Victal <mirai@makinata.eu>
---
doc/guix.texi | 90 +++++++++++++++++
gnu/local.mk | 1 +
gnu/services/linux.scm | 200 +++++++++++++++++++++++++++++++++++++-
gnu/tests/cachefilesd.scm | 71 ++++++++++++++
4 files changed, 361 insertions(+), 1 deletion(-)
create mode 100644 gnu/tests/cachefilesd.scm

Toggle diff (444 lines)
diff --git a/doc/guix.texi b/doc/guix.texi
index 6671ba9305..c1a68707d2 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -113,6 +113,7 @@ Copyright @copyright{} 2022?–?2023 Bruno Victal@*
Copyright @copyright{} 2022 Ivan Vilata-i-Balaguer@*
Copyright @copyright{} 2023 Giacomo Leidi@*
Copyright @copyright{} 2022 Antero Mejr@*
+Copyright @copyright{} 2023 Felix Lechner@*
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
@@ -37473,6 +37474,95 @@ parameters, can be done as follow:
@end lisp
@end defvar
+@cindex cachefilesd
+@cindex cachefiles
+@cindex fscache
+@subsubheading Cachefilesd Service
+
+The Cachefilesd service starts a daemon that caches network filesystem
+data locally. It is especially useful for NFS and AFS shares, where it
+reduces latencies for repeated access when reading files.
+
+The daemon can be started as follows:
+
+@lisp
+(service cachefilesd-service-type
+ (cachefilesd-configuration
+ (cache-directory "/var/cache/fscache")))
+@end lisp
+
+@defvar cachefilesd-service-type
+The service type for starting @command{cachefilesd}. The value for this
+service type is a @code{cachefilesd-configuration}, whose only required
+field is @var{cache-directory}.
+
+@end defvar
+
+@c %start of fragment
+@deftp {Data Type} cachefilesd-configuration
+Available @code{cachefilesd-configuration} fields are:
+
+@table @asis
+@item @code{cachefilesd} (default: @code{cachefilesd}) (type: file-like)
+The cachefilesd package to use.
+
+@item @code{debug-output?} (default: @code{#f}) (type: boolean)
+Print debugging output to stderr.
+
+@item @code{use-syslog?} (default: @code{#t}) (type: boolean)
+Log to syslog facility instead of stdout.
+
+@item @code{scan?} (default: @code{#t}) (type: boolean)
+Scan for cachable objects.
+
+@item @code{cache-directory} (type: maybe-string)
+Location of the cache directory.
+
+@item @code{cache-name} (default: @code{"CacheFiles"}) (type: maybe-string)
+Name of cache (keep unique).
+
+@item @code{security-context} (type: maybe-string)
+SELinux security context.
+
+@item @code{pause-culling-for-block-percentage} (default: @code{7}) (type: maybe-non-negative-integer)
+Pause culling when available blocks exceed this percentage.
+
+@item @code{pause-culling-for-file-percentage} (default: @code{7}) (type: maybe-non-negative-integer)
+Pause culling when available files exceed this percentage.
+
+@item @code{resume-culling-for-block-percentage} (default: @code{5}) (type: maybe-non-negative-integer)
+Start culling when available blocks drop below this percentage.
+
+@item @code{resume-culling-for-file-percentage} (default: @code{5}) (type: maybe-non-negative-integer)
+Start culling when available files drop below this percentage.
+
+@item @code{pause-caching-for-block-percentage} (default: @code{1}) (type: maybe-non-negative-integer)
+Pause further allocations when available blocks drop below this
+percentage.
+
+@item @code{pause-caching-for-file-percentage} (default: @code{1}) (type: maybe-non-negative-integer)
+Pause further allocations when available files drop below this
+percentage.
+
+@item @code{log2-table-size} (default: @code{12}) (type: maybe-non-negative-integer)
+Size of tables holding cullable objects in logarithm of base 2.
+
+@item @code{cull?} (default: @code{#t}) (type: boolean)
+Create free space by culling (consumes system load).
+
+@item @code{trace-function-entry-in-kernel-module?} (default: @code{#f}) (type: boolean)
+Trace function entry in the kernel module (for debugging).
+
+@item @code{trace-function-exit-in-kernel-module?} (default: @code{#f}) (type: boolean)
+Trace function exit in the kernel module (for debugging).
+
+@item @code{trace-internal-checkpoints-in-kernel-module?} (default: @code{#f}) (type: boolean)
+Trace internal checkpoints in the kernel module (for debugging).
+
+@end table
+@end deftp
+@c %end of fragment
+
@cindex rasdaemon
@cindex Platform Reliability, Availability and Serviceability daemon
@subsubheading Rasdaemon Service
diff --git a/gnu/local.mk b/gnu/local.mk
index 6c5a9ce024..a4e0e4ec55 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -759,6 +759,7 @@ GNU_SYSTEM_MODULES = \
%D%/tests.scm \
%D%/tests/audio.scm \
%D%/tests/base.scm \
+ %D%/tests/cachefilesd.scm \
%D%/tests/ci.scm \
%D%/tests/cups.scm \
%D%/tests/databases.scm \
diff --git a/gnu/services/linux.scm b/gnu/services/linux.scm
index 60e2093e1d..e581291a7b 100644
--- a/gnu/services/linux.scm
+++ b/gnu/services/linux.scm
@@ -5,6 +5,7 @@
;;; Copyright © 2021 raid5atemyhomework <raid5atemyhomework@protonmail.com>
;;; Copyright © 2021 B. Wilson <elaexuotee@wilsonb.com>
;;; Copyright © 2022 Josselin Poiret <dev@jpoiret.xyz>
+;;; Copyright © 2023 Felix Lechner <felix.lechner@lease-up.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -30,12 +31,14 @@ (define-module (gnu services linux)
#:use-module (guix ui)
#:use-module (gnu services)
#:use-module (gnu services base)
+ #:use-module (gnu services configuration)
#:use-module (gnu services shepherd)
#:use-module (gnu packages linux)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-26)
#:use-module (srfi srfi-34)
#:use-module (srfi srfi-35)
+ #:use-module (ice-9 format)
#:use-module (ice-9 match)
#:export (earlyoom-configuration
earlyoom-configuration?
@@ -52,6 +55,28 @@ (define-module (gnu services linux)
kernel-module-loader-service-type
+ cachefilesd-configuration
+ cachefilesd-configuration?
+ cachefilesd-configuration-cachefilesd
+ cachefilesd-configuration-debug-output?
+ cachefilesd-configuration-use-syslog?
+ cachefilesd-configuration-scan?
+ cachefilesd-configuration-cache-directory
+ cachefilesd-configuration-cache-name
+ cachefilesd-configuration-security-context
+ cachefilesd-configuration-pause-culling-for-block-percentage
+ cachefilesd-configuration-pause-culling-for-file-percentage
+ cachefilesd-configuration-resume-culling-for-block-percentage
+ cachefilesd-configuration-resume-culling-for-file-percentage
+ cachefilesd-configuration-pause-caching-for-block-percentage
+ cachefilesd-configuration-pause-caching-for-file-percentage
+ cachefilesd-configuration-log2-table-size
+ cachefilesd-configuration-cull?
+ cachefilesd-configuration-trace-function-entry-in-kernel-module
+ cachefilesd-configuration-trace-function-exit-in-kernel-module
+ cachefilesd-configuration-trace-internal-checkpoints-in-kernel-module
+ cachefilesd-service-type
+
rasdaemon-configuration
rasdaemon-configuration?
rasdaemon-configuration-record?
@@ -198,6 +223,179 @@ (define kernel-module-loader-service-type
(extend append)
(default-value '())))
+
+;;;
+;;; Cachefilesd, an FS-Cache daemon
+;;;
+
+(define (serialize-string variable-symbol value)
+ #~(format #f "~a ~a~%" #$(symbol->string variable-symbol) #$value))
+
+(define-maybe string)
+
+(define (non-negative-integer? val)
+ (and (exact-integer? val) (not (negative? val))))
+
+(define (serialize-non-negative-integer variable-symbol value)
+ #~(format #f "~a ~d~%" #$(symbol->string variable-symbol) #$value))
+
+(define-maybe non-negative-integer)
+
+(define (make-option-serializer option-symbol)
+ (lambda (variable-symbol text)
+ (if (maybe-value-set? text)
+ #~(format #f "~a ~a~%" #$(symbol->string option-symbol) #$text)
+ "")))
+
+(define (make-percentage-threshold-serializer threshold-symbol)
+ (lambda (variable-symbol percentage)
+ (if (maybe-value-set? percentage)
+ #~(format #f "~a ~a%~%" #$(symbol->string threshold-symbol) #$percentage)
+ "")))
+
+(define-configuration cachefilesd-configuration
+ (cachefilesd
+ (file-like cachefilesd)
+ "The cachefilesd package to use."
+ empty-serializer)
+
+ ;; command-line options
+ (debug-output?
+ (boolean #f)
+ "Print debugging output to stderr."
+ empty-serializer)
+
+ (use-syslog?
+ (boolean #t)
+ "Log to syslog facility instead of stdout."
+ empty-serializer)
+
+ ;; culling is part of the configuration file
+ ;; despite the name of the command-line option
+ (scan?
+ (boolean #t)
+ "Scan for cachable objects."
+ empty-serializer)
+
+ ;; sole required field in the configuration file
+ (cache-directory
+ maybe-string
+ "Location of the cache directory."
+ (make-option-serializer 'dir))
+
+ (cache-name
+ (maybe-string "CacheFiles")
+ "Name of cache (keep unique)."
+ (make-option-serializer 'tag))
+
+ (security-context
+ maybe-string
+ "SELinux security context."
+ (make-option-serializer 'secctx))
+
+ ;; percentage thresholds in the configuration file
+ (pause-culling-for-block-percentage
+ (maybe-non-negative-integer 7)
+ "Pause culling when available blocks exceed this percentage."
+ (make-percentage-threshold-serializer 'brun))
+
+ (pause-culling-for-file-percentage
+ (maybe-non-negative-integer 7)
+ "Pause culling when available files exceed this percentage."
+ (make-percentage-threshold-serializer 'frun))
+
+ (resume-culling-for-block-percentage
+ (maybe-non-negative-integer 5)
+ "Start culling when available blocks drop below this percentage."
+ (make-percentage-threshold-serializer 'bcull))
+
+ (resume-culling-for-file-percentage
+ (maybe-non-negative-integer 5)
+ "Start culling when available files drop below this percentage."
+ (make-percentage-threshold-serializer 'fcull))
+
+ (pause-caching-for-block-percentage
+ (maybe-non-negative-integer 1)
+ "Pause further allocations when available blocks drop below this percentage."
+ (make-percentage-threshold-serializer 'bstop))
+
+ (pause-caching-for-file-percentage
+ (maybe-non-negative-integer 1)
+ "Pause further allocations when available files drop below this percentage."
+ (make-percentage-threshold-serializer 'fstop))
+
+ ;; run time optimizations in the configuration file
+ (log2-table-size
+ (maybe-non-negative-integer 12)
+ "Size of tables holding cullable objects in logarithm of base 2."
+ (make-option-serializer 'culltable))
+
+ (cull?
+ (boolean #t)
+ "Create free space by culling (consumes system load)."
+ (lambda (variable-symbol value)
+ (if value "" "nocull\n")))
+
+ ;; kernel module debugging in the configuration file
+ (trace-function-entry-in-kernel-module?
+ (boolean #f)
+ "Trace function entry in the kernel module (for debugging)."
+ empty-serializer)
+
+ (trace-function-exit-in-kernel-module?
+ (boolean #f)
+ "Trace function exit in the kernel module (for debugging)."
+ empty-serializer)
+
+ (trace-internal-checkpoints-in-kernel-module?
+ (boolean #f)
+ "Trace internal checkpoints in the kernel module (for debugging)."
+ empty-serializer))
+
+(define (serialize-cachefilesd-configuration configuration)
+ (mixed-text-file
+ "cachefilesd.conf"
+ (serialize-configuration configuration cachefilesd-configuration-fields)))
+
+(define (cachefilesd-shepherd-service config)
+ "Return a list of <shepherd-service> for cachefilesd for CONFIG."
+ (match-record
+ config <cachefilesd-configuration> (cachefilesd
+ debug-output?
+ use-syslog?
+ scan?
+ cache-directory)
+ (let ((configuration-file (serialize-cachefilesd-configuration config)))
+ (shepherd-service
+ (documentation "Run the cachefilesd daemon for FS-Cache.")
+ (provision '(cachefilesd))
+ (requirement (append '(file-systems)
+ (if use-syslog? '(syslogd) '())))
+ (start #~(begin
+ (and=> #$(maybe-value cache-directory) mkdir-p)
+ (make-forkexec-constructor
+ `(#$(file-append cachefilesd "/sbin/cachefilesd")
+ ;; do not detach
+ "-n"
+ #$@(if debug-output? '("-d") '())
+ #$@(if use-syslog? '() '("-s"))
+ #$@(if scan? '() '("-N"))
+ "-f" #$configuration-file))))
+ (stop #~(make-kill-destructor))))))
+
+(define cachefilesd-service-type
+ (service-type
+ (name 'cachefilesd)
+ (description
+ "Run the FS-Cache backend daemon @command{cachefilesd}.")
+ (extensions
+ (list
+ (service-extension kernel-module-loader-service-type
+ (const '("cachefiles")))
+ (service-extension shepherd-root-service-type
+ (compose list cachefilesd-shepherd-service))))
+ (default-value (cachefilesd-configuration))))
+
;;;
;;; Reliability, Availability, and Serviceability (RAS) daemon
@@ -243,7 +441,7 @@ (define rasdaemon-service-type
;;;
-;;; Kernel module loader.
+;;; Zram device
;;;
(define-record-type* <zram-device-configuration>
diff --git a/gnu/tests/cachefilesd.scm b/gnu/tests/cachefilesd.scm
new file mode 100644
index 0000000000..7f5d513067
--- /dev/null
+++ b/gnu/tests/cachefilesd.scm
@@ -0,0 +1,71 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2017 Peter Mikkelsen <petermikkelsen10@gmail.com>
+;;; Copyright © 2022 Bruno Victal <mirai@makinata.eu>
+;;; Copyright © 2023 Felix Lechner <felix.lechner@lease-up.com>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu tests cachefilesd)
+ #:use-module (gnu tests)
+ #:use-module (gnu system)
+ #:use-module (gnu system vm)
+ #:use-module (gnu services)
+ #:use-module (gnu services linux)
+ #:use-module (guix gexp)
+ #:export (%test-cachefilesd))
+
+(define %cachefilesd-os
+ (simple-operating-system
+ (service cachefilesd-service-type
+ (cachefilesd-configuration
+ (cache-directory "/var/cache/fscache")))))
+
+(define (run-cachefilesd-test)
+ "Run tests in %cachefilesd-os, which has cachefilesd running."
+ (define os
+ (marionette-operating-system
+ %cachefilesd-os
+ #:imported-modules '((gnu services herd))))
+
+ (define vm
+ (virtual-machine os))
+
+ (define test
+ (with-imported-modules '((gnu build marionette))
+ #~(begin
+ (use-modules (srfi srfi-64)
+ (gnu build marionette))
+ (define marionette
+ (make-marionette (list #$vm)))
+
+ (test-runner-current (system-test-runner #$output))
+ (test-begin "cachefilesd")
+
+ (test-assert "service is running"
+ (marionette-eval
+ '(begin
+ (use-modules (gnu services herd))
+ (start-service 'cachefilesd))
+ marionette))
+
+ (test-end))))
+ (gexp->derivation "cachefilesd-test" test))
+
+(define %test-cachefilesd
+ (system-test
+ (name "cachefilesd")
+ (description "Test that the cachefilesd runs when started.")
+ (value (run-cachefilesd-test))))
--
2.39.1
F
F
Felix Lechner wrote on 30 Apr 2023 06:10
Closing in favor of Bug#63182
(address . 41180-done@debbugs.gnu.org)
CAFHYt57-gRfpz5J_riOv48v8sjDmFbeOBw=d1czVJNAzu2xmMw@mail.gmail.com
Hi,

This bug is too old to trigger a CI job. The patch also needed
adjustments. Please check Bug#63182 for more progress.

Closing this bug. Thanks!

Kind regards
Felix
Closed
?