GNU bug report logs - #41180
[PATCH] Add cachefilesd service.

Previous Next

Package: guix-patches;

Reported by: Jean-Baptiste Note <jean-baptiste.note <at> m4x.org>

Date: Sun, 10 May 2020 19:21:01 UTC

Severity: normal

Tags: patch

Done: Felix Lechner <felix.lechner <at> lease-up.com>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 41180 in the body.
You can then email your comments to 41180 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to guix-patches <at> gnu.org:
bug#41180; Package guix-patches. (Sun, 10 May 2020 19:21:01 GMT) Full text and rfc822 format available.

Acknowledgement sent to Jean-Baptiste Note <jean-baptiste.note <at> m4x.org>:
New bug report received and forwarded. Copy sent to guix-patches <at> gnu.org. (Sun, 10 May 2020 19:21:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Jean-Baptiste Note <jean-baptiste.note <at> m4x.org>
To: guixpatch <guix-patches <at> gnu.org>
Cc: Mathieu Othacehe <m.othacehe <at> gmail.com>
Subject: [PATCH] Add cachefilesd service.
Date: Sun, 10 May 2020 19:19:36 +0000
[Message part 1 (text/plain, inline)]
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
[0001-gnu-Add-cachefilesd-service.patch (text/x-patch, attachment)]
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#41180; Package guix-patches. (Sun, 10 May 2020 19:28:02 GMT) Full text and rfc822 format available.

Message #8 received at 41180 <at> debbugs.gnu.org (full text, mbox):

From: Jean-Baptiste Note <jean-baptiste.note <at> m4x.org>
To: 41180 <at> debbugs.gnu.org
Cc: Mathieu Othacehe <m.othacehe <at> gmail.com>
Subject: Re: [PATCH] Add cachefilesd service.
Date: Sun, 10 May 2020 19:27:42 +0000
[Message part 1 (text/plain, inline)]
Documentation patch.

[0002-doc-Add-documentation-for-cachefilesd-service.patch (text/x-patch, attachment)]
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#41180; Package guix-patches. (Mon, 11 May 2020 15:07:01 GMT) Full text and rfc822 format available.

Message #11 received at 41180 <at> debbugs.gnu.org (full text, mbox):

From: Mathieu Othacehe <othacehe <at> gnu.org>
To: Jean-Baptiste Note <jean-baptiste.note <at> m4x.org>
Cc: 41180 <at> debbugs.gnu.org
Subject: Re: [bug#41180] [PATCH] Add cachefilesd service.
Date: Mon, 11 May 2020 17:06:08 +0200
Hello Jean-Baptiste,

Thanks for this service!

> - 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:
 https://guix.gnu.org/manual/en/html_node/G_002dExpressions.html.
 
> - 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.
 
> - 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
https://mumble.net/~campbell/scheme/style.txt. You can install
"emacs-page-break-lines" to replace it by cleaner lines.

> Regarding the patch itself:
>
> - i'm not entirely sure the service belongs to services/linux.scm

I think it's fine.

> - 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.

> - 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




Information forwarded to guix-patches <at> gnu.org:
bug#41180; Package guix-patches. (Tue, 19 May 2020 12:13:02 GMT) Full text and rfc822 format available.

Message #14 received at 41180 <at> debbugs.gnu.org (full text, mbox):

From: Mathieu Othacehe <othacehe <at> gnu.org>
To: Jean-Baptiste Note <jean-baptiste.note <at> m4x.org>
Cc: 41180 <at> debbugs.gnu.org
Subject: Re: [bug#41180] [PATCH] Add cachefilesd service.
Date: Tue, 19 May 2020 14:12:03 +0200
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.

> +(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.

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

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

> +
> +           ;; 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:

--8<---------------cut here---------------start------------->8---
'(("frun" . cachefilesd-configuration-frun)
  ("bcull" . cachefilesd-configuration-bcull))
--8<---------------cut here---------------end--------------->8---

then you could iterate on that list.

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

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

> +        ;; Make sure the cache directory and pid dir exists

"dir" -> "directory".

> +            ;; XXX shepherd pid file handling: no idea how shepherd does it
> +            ;; and if it's going to conflict with cachefilesd's

Shepherd documentation says:

--8<---------------cut here---------------start------------->8---
     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.
--8<---------------cut here---------------end--------------->8---

So I think you can remove this comment.

Thanks,

Mathieu




Information forwarded to guix-patches <at> gnu.org:
bug#41180; Package guix-patches. (Wed, 20 May 2020 20:40:02 GMT) Full text and rfc822 format available.

Message #17 received at 41180 <at> debbugs.gnu.org (full text, mbox):

From: Jean-Baptiste Note <jean-baptiste.note <at> m4x.org>
To: Mathieu Othacehe <othacehe <at> gnu.org>
Cc: 41180 <at> debbugs.gnu.org
Subject: Re: [bug#41180] [PATCH] Add cachefilesd service.
Date: Wed, 20 May 2020 20:39:36 +0000
[Message part 1 (text/plain, inline)]
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
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#41180; Package guix-patches. (Sat, 23 May 2020 06:45:01 GMT) Full text and rfc822 format available.

Message #20 received at 41180 <at> debbugs.gnu.org (full text, mbox):

From: Mathieu Othacehe <othacehe <at> gnu.org>
To: Jean-Baptiste Note <jean-baptiste.note <at> m4x.org>
Cc: 41180 <at> debbugs.gnu.org
Subject: Re: [bug#41180] [PATCH] Add cachefilesd service.
Date: Sat, 23 May 2020 08:44:07 +0200
Hello Jean-Baptiste,

> 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




Information forwarded to guix-patches <at> gnu.org:
bug#41180; Package guix-patches. (Wed, 02 Sep 2020 14:59:02 GMT) Full text and rfc822 format available.

Message #23 received at 41180 <at> debbugs.gnu.org (full text, mbox):

From: Mathieu Othacehe <othacehe <at> gnu.org>
To: Jean-Baptiste Note <jean-baptiste.note <at> m4x.org>
Cc: 41180 <at> debbugs.gnu.org
Subject: Re: [bug#41180] [PATCH] Add cachefilesd service.
Date: Wed, 02 Sep 2020 16:58:19 +0200
Hello Jean-Baptiste,

> 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




Information forwarded to guix-patches <at> gnu.org:
bug#41180; Package guix-patches. (Thu, 09 Mar 2023 12:25:02 GMT) Full text and rfc822 format available.

Message #26 received at 41180 <at> debbugs.gnu.org (full text, mbox):

From: Felix Lechner <felix.lechner <at> lease-up.com>
To: 41180 <at> debbugs.gnu.org
Cc: Bruno Victal <mirai <at> makinata.eu>,
 Felix Lechner <felix.lechner <at> lease-up.com>
Subject: [PATCH v2] gnu: services: Add cachefilesd service. (Closes: #41180)
Date: Thu,  9 Mar 2023 04:24:11 -0800
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 <at> 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

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 <at> protonmail.com>
 ;;; Copyright © 2021 B. Wilson <elaexuotee <at> wilsonb.com>
 ;;; Copyright © 2022 Josselin Poiret <dev <at> jpoiret.xyz>
+;;; Copyright © 2023 Felix Lechner <felix.lechner <at> 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 <at> gmail.com>
+;;; Copyright © 2022 Bruno Victal <mirai <at> makinata.eu>
+;;; Copyright © 2023 Felix Lechner <felix.lechner <at> 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





Reply sent to Felix Lechner <felix.lechner <at> lease-up.com>:
You have taken responsibility. (Sun, 30 Apr 2023 04:12:01 GMT) Full text and rfc822 format available.

Notification sent to Jean-Baptiste Note <jean-baptiste.note <at> m4x.org>:
bug acknowledged by developer. (Sun, 30 Apr 2023 04:12:02 GMT) Full text and rfc822 format available.

Message #31 received at 41180-done <at> debbugs.gnu.org (full text, mbox):

From: Felix Lechner <felix.lechner <at> lease-up.com>
To: 41180-done <at> debbugs.gnu.org
Subject: Closing in favor of Bug#63182
Date: Sat, 29 Apr 2023 21:10:20 -0700
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




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Sun, 28 May 2023 11:24:05 GMT) Full text and rfc822 format available.

This bug report was last modified 326 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.