aboutsummaryrefslogtreecommitdiff
path: root/gn/services
diff options
context:
space:
mode:
Diffstat (limited to 'gn/services')
-rw-r--r--gn/services/file-systems.scm653
1 files changed, 653 insertions, 0 deletions
diff --git a/gn/services/file-systems.scm b/gn/services/file-systems.scm
new file mode 100644
index 0000000..386f2ac
--- /dev/null
+++ b/gn/services/file-systems.scm
@@ -0,0 +1,653 @@
+(define-module (gn services file-systems)
+ #:use-module (guix gexp)
+ #:use-module (guix records)
+ #:use-module (gnu services)
+ #:use-module (gnu services shepherd)
+ #:use-module (gnu system accounts)
+ #:use-module (gnu system shadow)
+ #:use-module (gnu packages admin)
+ #:use-module (gnu packages linux)
+ #:use-module (gn packages file-systems)
+ #:use-module (ice-9 match)
+ #:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-9)
+
+ #:export (lizardfs-configuration
+ lizardfs-configuration?
+ lizardfs-service-type
+
+ lizardfs-mfschunkserver-config-file
+ lizardfs-mfschunkserver-config-file?
+ lizardfs-mfshdd-config-file
+ lizardfs-mfshdd-config-file?
+ lizardfs-mfsmaster-config-file
+ lizardfs-mfsmaster-config-file?
+ lizardfs-mfsmetalogger-config-file
+ lizardfs-mfsmetalogger-config-file?))
+
+
+(define %lizardfs-accounts
+ (list (user-group
+ (name "lizardfs")
+ (system? #t))
+ (user-account
+ (name "lizardfs")
+ (group "lizardfs")
+ (system? #t)
+ (comment "Lizardfs User")
+ (home-directory "/var/lib/lizardfs")
+ (shell (file-append shadow "/sbin/nologin")))))
+
+(define-record-type* <lizardfs-mfsmetalogger-config-file>
+ lizardfs-mfsmetalogger-config-file
+ make-lizardfs-mfsmetalogger-config-file
+ lizardfs-mfsmetalogger-config-file?
+ (working-user lizardfs-mfsmetalogger-config-file-working-user
+ (default "lizardfs"))
+ (working-group lizardfs-mfsmetalogger-config-file-working-group
+ (default "lizardfs"))
+ (syslog-identifier lizardfs-mfsmetalogger-config-file-syslog-identifier
+ (default "mfsmetalogger"))
+ (lock-memory lizardfs-mfsmetalogger-config-file-lock-memory
+ (default #f)) ; 0 or 1
+ (nice-level lizardfs-mfsmetalogger-config-file-nice-level
+ (default -19))
+ (data-path lizardfs-mfsmetalogger-config-file-data-path
+ (default "/var/lib/lizardfs"))
+ (back-logs lizardfs-mfsmetalogger-config-file-back-logs
+ (default 50))
+ (back-meta-keep-previous lizardfs-mfsmetalogger-config-file-back-meta-keep-previous
+ (default 3))
+ (meta-download-frequency lizardfs-mfsmetalogger-config-file-meta-download-frequency
+ (default 24))
+ (master-reconnection-delay lizardfs-mfsmetalogger-config-file-master-reconnection-delay
+ (default 5))
+ (master-host lizardfs-mfsmetalogger-config-file-master-host
+ (default "mfsmaster"))
+ (master-port lizardfs-mfsmetalogger-config-file-master-port
+ (default 9419))
+ (master-timeout lizardfs-mfsmetalogger-config-file-master-timeout
+ (default 60)))
+
+(define-gexp-compiler (lizardfs-mfsmetalogger-config-file-compiler
+ (file <lizardfs-mfsmetalogger-config-file>) system target)
+ (match file
+ (($ <lizardfs-mfsmetalogger-config-file> working-user working-group syslog-identifier lock-memory nice-level data-path back-logs back-meta-keep-previous meta-download-frequency master-reconnection-delay master-host master-port master-timeout)
+ (gexp->derivation
+ "mfsmetalogger.cfg"
+ #~(call-with-output-file #$output
+ (lambda (port)
+ (display
+ (string-append
+ "# This file generated by GNU Guix\n\n"
+ (ungexp-splicing
+ `(,@`("WORKING_USER = " ,working-user "\n")
+ ,@`("WORKING_GROUP = " ,working-group "\n")
+ ,@`("SYSLOG_IDENT = " ,syslog-identifier "\n")
+ ,@(if lock-memory
+ `("LOCK_MEMORY = 1\n")
+ `("LOCK_MEMORY = 0\n"))
+ ,@`("NICE_LEVEL = " ,(number->string nice-level) "\n")
+ ,@`("DATA_PATH = " ,data-path "\n")
+ ,@`("BACK_LOGS = " ,(number->string back-logs) "\n")
+ ,@`("BACK_META_KEEP_PREVIOUS = " ,(number->string back-meta-keep-previous) "\n")
+ ,@`("META_DOWNLOAD_FREQ = " ,(number->string meta-download-frequency) "\n")
+ ,@`("MASTER_RECONNECTION_DELAY = " ,(number->string master-reconnection-delay) "\n")
+ ,@`("MASTER_HOST = " ,master-host "\n")
+ ,@`("MASTER_PORT = " ,(number->string master-port) "\n")
+ ,@`("MASTER_TIMEOUT = " ,(number->string master-timeout) "\n"))))
+ port)))
+ #:local-build? #t))))
+
+(define-record-type* <lizardfs-mfschunkserver-config-file>
+ lizardfs-mfschunkserver-config-file
+ make-lizardfs-mfschunkserver-config-file
+ lizardfs-mfschunkserver-config-file?
+ (label lizardfs-mfschunkserver-label
+ (default "_"))
+ (working-user lizardfs-mfschunkserver-config-file-working-user
+ (default "lizardfs"))
+ (working-group lizardfs-mfschunkserver-config-file-working-group
+ (default "lizardfs"))
+ (syslog-identifier lizardfs-mfschunkserver-config-file-syslog-identifier
+ (default "mfschunkserver"))
+ (lock-memory lizardfs-mfschunkserver-config-file-lock-memory
+ (default #f)) ; 0 or 1
+ (nice-level lizardfs-mfschunkserver-config-file-nice-level
+ (default -19))
+ (data-path lizardfs-mfschunkserver-config-file-data-path
+ (default "/var/lib/lizardfs"))
+ (master-reconnection-delay lizardfs-mfschunkserver-config-file-master-reconnection-delay
+ (default 5))
+ (bind-host lizardfs-mfschunkserver-bind-host
+ (default "*"))
+ (master-host lizardfs-mfschunkserver-config-file-master-host
+ (default "mfsmaster"))
+ (master-port lizardfs-mfschunkserver-config-file-master-port
+ (default 9420))
+ (master-timeout lizardfs-mfschunkserver-config-file-master-timeout
+ (default 60))
+ (csserv-listen-host lizardfs-mfschunkserver-config-csserv-listen-host
+ (default "*"))
+ (csserv-listen-port lizardfs-mfschunkserver-config-csserv-listen-port
+ (default 9422))
+ (hdd-conf-filename lizardfs-mfschunkserver-config-hdd-conf-filename
+ (default "/etc/lizardfs/mfshdd.cfg")) ; This should be our generated one
+ (hdd-leave-space-default lizardfs-mfschunkserver-config-hdd-leave-space-default
+ (default "4GiB"))
+ (hdd-test-freq lizardfs-mfschunkserver-config-hdd-test-freq
+ (default 10))
+ (hdd-advise-no-cache lizardfs-mfschunkserver-config-hdd-advise-no-cache
+ (default #t)) ; 0 or 1
+ (hdd-punch-holes lizardfs-mfschunkserver-config-hdd-punch-holes
+ (default #t)) ; 0 or 1
+ (enable-load-factor lizardfrs-mfschunkserver-config-enable-load-factor
+ (default #f)) ; 0 or 1
+ (replication-bandwidth-limit-kbps
+ lizardfs-mfschunkserver-config-replication-bandwidth-limit-kbps
+ (default 8192))
+ (nr-of-network-workers lizardfs-mfschunkserver-config-nr-of-network-workers
+ (default 1))
+ (nr-of-hdd-workers-per-network-worker
+ lizardfs-mfschunkerver-config-nr-of-hdd-workers-per-network-pworker
+ (default 20))
+ (read-ahead-kb lizardfs-mfschunkserver-config-read-ahead-kb
+ (default 0))
+ (max-read-behind-kb lizardfs-mfschunkserver-config-max-read-behind-kb
+ (default 0))
+ (create-new-chunks-in-moosefs-format
+ lizardfs-mfschunkserver-config-crate-new-chunks-in-moosefs-format
+ (default #t)) ; 0 or 1
+ (perform-fsync lizardfs-mfschunkserver-config-perform-fsync
+ (default #t)) ; 0 or 1
+ )
+
+(define-gexp-compiler (lizardfs-mfschunkserver-config-file-compiler
+ (file <lizardfs-mfschunkserver-config-file>) system target)
+ (match file
+ (($ <lizardfs-mfschunkserver-config-file> label working-user working-group syslog-identifier lock-memory nice-level data-path master-reconnection-delay bind-host master-host master-port master-timeout csserv-listen-host csserv-listen-port hdd-conf-filename hdd-leave-space-default hdd-test-freq hdd-advise-no-cache hdd-punch-holes enable-load-factor replication-bandwidth-limit-kbps nr-of-network-workers nr-of-hdd-workers-per-network-worker read-ahead-kb max-read-behind-kb create-new-chunks-in-moosefs-format perform-fsync)
+ (gexp->derivation
+ "mfschunkserver.cfg"
+ #~(call-with-output-file #$output
+ (lambda (port)
+ (display
+ (string-append
+ "# This file generated by GNU Guix\n\n"
+ (ungexp-splicing
+ `(,@`("LABEL = " ,label "\n")
+ ,@`("WORKING_USER = " ,working-user "\n")
+ ,@`("WORKING_GROUP = " ,working-group "\n")
+ ,@`("SYSLOG_IDENT = " ,syslog-identifier "\n")
+ ,@(if lock-memory
+ `("LOCK_MEMORY = 1\n")
+ `("LOCK_MEMORY = 0\n"))
+ ,@`("NICE_LEVEL = " ,(number->string nice-level) "\n")
+ ,@`("DATA_PATH = " ,data-path "\n")
+ ,@`("MASTER_RECONNECTION_DELAY = " ,(number->string master-reconnection-delay) "\n")
+ ,@`("MASTER_HOST = " ,master-host "\n")
+ ,@`("MASTER_PORT = " ,(number->string master-port) "\n")
+ ,@`("MASTER_TIMEOUT = " ,(number->string master-timeout) "\n")
+ ,@`("CSSERV_LISTEN_HOST = " ,csserv-listen-host "\n")
+ ,@`("CSSERV_LISTEN_PORT = " ,(number->string csserv-listen-port) "\n")
+ ,@`("HDD_CONF_FILENAME = " ,hdd-conf-filename "\n")
+ ,@`("HDD_LEAVE_SPACE_DEFAULT = " ,hdd-leave-space-default "\n")
+ ,@`("HDD_TEST_FREQ = " ,(number->string hdd-test-freq) "\n")
+ ,@(if hdd-advise-no-cache
+ `("HDD_ADVISE_NO_CACHE = 1\n")
+ `("HDD_ADVISE_NO_CACHE = 0\n"))
+ ,@(if hdd-punch-holes
+ `("HDD_PUNCH_HOLES = 1\n")
+ `("HDD_PUNCH_HOLES = 0\n"))
+ ,@(if enable-load-factor
+ `("ENABLE_LOAD_FACTOR = 1\n")
+ `("ENABLE_LOAD_FACTOR = 0\n"))
+ ,@`("REPLICATION_BANDWIDTH_LIMIT_KBPS = " ,(number->string replication-bandwidth-limit-kbps) "\n")
+ ,@`("NR_OF_NETWORK_WORKERS = " ,(number->string nr-of-network-workers) "\n")
+ ,@`("NR_OF_HDD_WORKERS_PER_NETWORK_WORKER = " ,(number->string nr-of-hdd-workers-per-network-worker) "\n")
+ ,@`("READ_AHEAD_KB = " ,(number->string read-ahead-kb) "\n")
+ ,@`("MAX_READ_BEHIND_KB = " ,(number->string max-read-behind-kb) "\n")
+ ,@(if create-new-chunks-in-moosefs-format
+ `("CREATE_NEW_CHUNKS_IN_MOOSEFS_FORMAT = 1\n")
+ `("CREATE_NEW_CHUNKS_IN_MOOSEFS_FORMAT = 0\n"))
+ ,@(if perform-fsync
+ `("PERFORM_FSYNC = 1\n")
+ `("PERFORM_FSYNC = 0\n")))))
+ port)))
+ #:local-build? #t))))
+
+(define-record-type* <lizardfs-mfshdd-config-file>
+ lizardfs-mfshdd-config-file
+ make-lizardfs-mfshdd-config-file
+ lizardfs-mfshdd-config-file?
+ (disks-to-use lizardfs-mfshdd-config-file-disks-to-use
+ (default '()))
+ (disks-to-remove lizardfs-mfshdd-config-file-disks-to-remove
+ (default '())))
+
+(define-gexp-compiler (lizardfs-mfshdd-config-file-compiler
+ (file <lizardfs-mfshdd-config-file>) system target)
+ (match file
+ (($ <lizardfs-mfshdd-config-file> disks-to-use disks-to-remove)
+ (gexp->derivation
+ "mfshdd.cfg"
+ #~(call-with-output-file #$output
+ (lambda (port)
+ (display
+ (string-append
+ "# This file generated by GNU Guix\n\n"
+ (ungexp-splicing
+ `(,@(append-map
+ (lambda (disk)
+ `(,disk "\n"))
+ disks-to-use)
+ ,@(append-map
+ (lambda (disk)
+ `("*" ,disk "\n"))
+ disks-to-remove))))
+ port)))
+ #:local-build? #t))))
+
+(define-record-type* <lizardfs-mfsmaster-config-file>
+ lizardfs-mfsmaster-config-file
+ make-lizardfs-mfsmaster-config-file
+ lizardfs-mfsmaster-config-file?
+ (personality lizardsf-mfsmaster-config-personality
+ (default ""))
+ (admin-password lizardfs-mfsmaster-config-admin-password
+ (default ""))
+ (working-user lizardfs-mfsmaster-config-working-user
+ (default "lizardfs"))
+ (working-group lizardfs-mfsmaster-config-working-group
+ (default "lizardfs"))
+ (syslog-ident lizardfs-mfsmaster-config-syslog-ident
+ (default "mfsmaster"))
+ (lock-memory lizardfs-mfsmaster-config-lock-memory
+ (default #f)) ; 0 or 1
+ (nice-level lizardfs-mfsmaster-config-nice-level
+ (default -19))
+ (exports-filename lizardfs-mfsmaster-config-exports-filename
+ (default "/etc/lizardfs/mfsexports.cfg")) ; our created one?
+ (topology-filename lizardfs-mfsmaster-config-topology-filename
+ (default "/etc/lizardfs/mfstopology.cfg")) ; our created one?
+ (custom-goals-filename lizardfs-mfsmaster-config-custom-goals-filename
+ (default "/etc/lizardfs/mfsgoals.cfg")) ; our created one?
+ (data-path lizardfs-mfsmaster-config-data-path
+ (default "/var/lib/lizardfs"))
+ (prefer-local-chunkserver lizardfs-mfsmaster-prefer-local-chunkserver
+ (default #t)) ; 0 or 1
+ (auto-recovery lizardfs-mfsmaster-config-auto-recovery
+ (default #f)) ; 0 or 1
+ (back-logs lizardfs-mfsmaster-config-back-logs
+ (default 50))
+ (back-meta-keep-previous lizardfs-mfsmaster-config-back-meta-keep-previous
+ (default 1))
+ (operations-delay-init lizardfs-mfsmaster-config-operations-delay-init
+ (default 300))
+ (operations-delay-disconnect lizardfs-mfsmaster-config-operations-delay-disconnect
+ (default 3600))
+ (matoml-listen-host lizardfs-mfsmaster-config-matoml-listen-host
+ (default "*"))
+ (matoml-listen-port lizardfs-mfsmaster-config-matoml-listen-port
+ (default 9419))
+ (matoml-log-preserve-seconds lizardfs-mfsmaster-config-matoml-log-preserve-seconds
+ (default 600))
+ (matocs-listen-host lizardfs-mfsmaster-config-matocs-listen-host
+ (default "*"))
+ (matocs-listen-port lizardfs-mfsmaster-config-matocs-listen-port
+ (default 9420))
+ (matocl-listen-host lizardfs-mfsmaster-config-matocl-listen-host
+ (default "*"))
+ (matocl-listen-port lizardfs-mfsmaster-config-matocl-listen-port
+ (default 9421))
+ (matots-listen-host lizardfs-mfsmaster-config-matots-listen-host
+ (default "*"))
+ (matots-listen-port lizardfs-mfsmaster-config-matots-listen-port
+ (default 9424))
+ (chunks-loop-max-cps lizardfs-mfsmaster-config-chunks-loop-max-cps
+ (default 100000))
+ (chunks-loop-min-time lizardfs-mfsmaster-config-chunks-loop-min-time
+ (default 300))
+ (chunks-loop-peroid lizardfs-mfsmaster-config-chunks-loop-period
+ (default 1000))
+ (chunks-loop-max-cpu lizardfs-mfsmaster-config-chunks-loop-max-cpu
+ (default 60))
+ (chunks-soft-del-limit lizardfs-mfsmaster-config-chunks-soft-del-limit
+ (default 10))
+ (chunks-hard-del-limit lizardfs-mfsmaster-config-chunks-hard-del-limit
+ (default 25))
+ (chunks-write-rep-limit lizardfs-mfsmaster-config-chunks-write-rep-limit
+ (default 2))
+ (chunks-read-rep-limit lizardfs-mfsmaster-config-chunks-read-rep-limit
+ (default 10))
+ (endangered-chunks-priority lizardfs-mfsmaster-config-endangered-chunks-priority
+ (default 0))
+ (endangered-chunks-max-capacity lizardfs-mfsmaster-config-endangered-chunks-max-capacity
+ (default "1Mi"))
+ (acceptable-difference lizardfs-mfsmaster-config-acceptable-difference
+ (default 0.1))
+ (chunks-rebalancing-between-labels lizardfs-mfsmaster-config-chunks-rebalancing-between-labels
+ (default 0))
+ (free-inodes-period lizardfs-mfsmaster-config-free-inodes-period
+ (default 60))
+ (no-atime lizardfs-mfsmaster-config-no-atime
+ (default #f)) ; 0 or 1
+ (session-sustain-time lizardfs-mfsmaster-config-session-sustain-time
+ (default 86400))
+ (reject-old-client lizardfs-mfsmaster-config-reject-old-clients
+ (default #f)) ; 0 or 1
+ (globaliolimits-filename lizardfs-mfsmaster-config-globaliolimits-filename
+ (default "/etc/lizardfs/globaliolimits.cfg")) ; our generated one?
+ (globaliolimits-renegotiation-period-settings
+ lizardfs-mfsmaster-config-globaliolmits-renegotiation-period-settings
+ (default 0.1))
+ (globaliolimits-accumulate-ms lizardfs-mfsmaster-config-globaliolimits-accumulate-ms
+ (default 250))
+ (mfsmetarestore-path lizardfs-mfsmaster-config-mfsmeaterestore-path
+ (default (file-append lizardfs "/sbin/mfsmetarestore")))
+ (master-reconnection-delay lizardfs-mfsmaster-config-master-reconnection-delay
+ (default 5))
+ (master-host lizardfs-mfsmaster-config-master-host
+ (default "mfsmaster"))
+ (master-port lizardfs-mfsmaster-config-master-port
+ (default 9419))
+ (master-timeout lizardfs-mfsmaster-config-master-timeout
+ (default 60))
+ (metadata-checksum-interval lizardfs-mfsmaster-config-metadata-checksum-interval
+ (default 50))
+ (metadata-checksum-recalculation-speed lizardfs-mfsmaster-config-metadata-recalculation-speed
+ (default 100))
+ (disable-metadata-checksum-verification lizardfs-mfsmaster-config-disable-metadata-checksum-verification
+ (default #f)) ; 0 or 1
+ (metadata-save-request-min-period lizardfs-mfsmaster-config-metadata-save-request-min-period
+ (default 1800))
+ (use-bdb-for-name-storage lizardfs-mfsmaster-config-use-bdb-for-name-storage
+ (default #t)) ; 0 or 1
+ (bdb-name-storage-cache lizardfs-mfsmaster-config-bdb-name-storage-cache
+ (default 10))
+ (avoid-same-ip-chunkservers lizardfs-mfsmaster-config-avoid-same-ip-chunkservers
+ (default #f)) ; 0 or 1
+ (load-factor-penalty lizardfs-mfsmaster-config-load-factor-penalty
+ (default 0)) ; between 0, 0.5, inclusive
+ (redundancy-level lizardfs-mfsmaster-config-redundancy-level
+ (default 0))
+ (snapshot-initial-batch-size-limit lizardfs-mfsmaster-config-snapshot-initial-batch-size-limit
+ (default 10000))
+ (file-test-loop-min-time lizardfs-mfsmaster-config-file-test-loop-min-time
+ (default 3600)))
+
+
+(define-gexp-compiler (lizardfs-mfsmaster-config-file-compiler
+ (file <lizardfs-mfsmaster-config-file>) system target)
+ (match file
+ (($ <lizardfs-mfsmaster-config-file> personality admin-password working-user working-group syslog-ident lock-memory nice-level exports-filename topology-filename custom-goals-filename data-path prefer-local-chunkserver auto-recovery back-logs back-meta-keep-previous operations-delay-init operations-delay-disconnect matoml-listen-host matoml-listen-port matoml-log-preserve-seconds matocs-listen-host matocs-listen-port matocl-listen-host matocl-listen-port matots-listen-host matots-listen-port chunks-loop-max-cps chunks-loop-min-time chunks-loop-period chunks-loop-max-cpu chunks-soft-del-limit chunks-hard-del-limit chunks-write-rep-limit chunks-read-rep-limit endangered-chunks-priority endangered-chunks-max-capacity acceptable-difference chunks-rebalancing-between-labels free-inodes-period no-atime session-sustain-time reject-old-client globaliolimits-filename globaliolimits-renegotiation-period-settings globaliolimits-accumulate-ms mfsmetarestore-path master-reconnection-delay master-host master-port master-timeout metadata-checksum-interval metadata-checksum-recalculation-speed disable-metadata-checksum-verification metadata-save-request-min-period use-bdb-for-name-storage bdb-name-storage-cache avoid-same-ip-chunkservers load-factor-penalty redundancy-level snapshot-initial-batch-size-limit file-test-loop-min-time)
+ (gexp->derivation
+ "mfsmaster.cfg"
+ #~(call-with-output-file #$output
+ (lambda (port)
+ (display
+ (string-append
+ "# This file generated by GNU Guix\n\n"
+ (ungexp-splicing
+ `(,@`("PERSONALITY = " ,personality "\n")
+ ,@`("ADMIN_PASSWORD = \"" ,admin-password "\"\n")
+ ,@`("WORKING_USER = " ,working-user "\n")
+ ,@`("WORKING_GROUP = " ,working-group "\n")
+ ,@`("SYSLOG_IDENT = " ,syslog-ident "\n")
+ ,@(if lock-memory
+ `("LOCK_MEMORY = 1\n")
+ `("LOCK_MEMORY = 0\n"))
+ ,@`("NICE_LEVEL = " ,(number->string nice-level) "\n")
+ ,@`("EXPORTS_FILENAME = " ,exports-filename "\n")
+ ,@`("TOPOLOGY_FILENAME = " ,topology-filename "\n")
+ ,@`("CUSTOM_GOALS_FILENAME = " ,custom-goals-filename "\n")
+ ,@`("DATA_PATH = " ,data-path "\n")
+ ,@(if prefer-local-chunkserver
+ `("PREFER_LOCAL_CHUNKSERVER = 1\n")
+ `("PREFER_LOCAL_CHUNKSERVER = 0\n"))
+ ,@(if auto-recovery
+ `("AUTO_RECOVERY = 1\n")
+ `("AUTO_RECOVERY = 0\n"))
+ ,@`("BACK_LOGS = " ,(number->string back-logs) "\n")
+ ,@`("BACK_META_KEEP_PREVIOUS = " ,(number->string back-meta-keep-previous) "\n")
+ ,@`("OPERATIONS_DELAY_INIT = " ,(number->string operations-delay-init) "\n")
+ ,@`("OPERATIONS_DELAY_DISCONNECT = " ,(number->string operations-delay-disconnect) "\n")
+ ,@`("MATOML_LISTEN_HOST = " ,matoml-listen-host "\n")
+ ,@`("MATOML_LISTEN_PORT = " ,(number->string matoml-listen-port) "\n")
+ ,@`("MATOML_LOG_PRESERVE_SECONDS = " ,(number->string matoml-log-preserve-seconds) "\n")
+ ,@`("MATOCS_LISTEN_HOST = " ,matocs-listen-host "\n")
+ ,@`("MATOCS_LISTEN_PORT = " ,(number->string matocs-listen-port) "\n")
+ ,@`("MATOCL_LISTEN_HOST = " ,matocl-listen-host "\n")
+ ,@`("MATOCL_LISTEN_PORT = " ,(number->string matocl-listen-port) "\n")
+ ,@`("MATOTS_LISTEN_HOST = " ,matots-listen-host "\n")
+ ,@`("MATOTS_LISTEN_PORT = " ,(number->string matots-listen-port) "\n")
+ ,@`("CHUNKS_LOOP_MAX_CPS = " ,(number->string chunks-loop-max-cps) "\n")
+ ,@`("CHUNKS_LOOP_MIN_TIME = " ,(number->string chunks-loop-min-time) "\n")
+ ,@`("CHUNKS_LOOP_PERIOD = " ,(number->string chunks-loop-period) "\n")
+ ,@`("CHUNKS_LOOP_MAX_CPU = " ,(number->string chunks-loop-max-cpu) "\n")
+ ,@`("CHUNKS_SOFT_DEL_LIMIT = " ,(number->string chunks-soft-del-limit) "\n")
+ ,@`("CHUNKS_HARD_DEL_LIMIT = " ,(number->string chunks-hard-del-limit) "\n")
+ ,@`("CHUNKS_WRITE_REP_LIMIT = " ,(number->string chunks-write-rep-limit) "\n")
+ ,@`("CHUNKS_READ_REP_LIMIT = " ,(number->string chunks-read-rep-limit) "\n")
+ ,@`("ENDANGERED_CHUNKS_PRIORITY = " ,(number->string endangered-chunks-priority) "\n")
+ ,@`("ENDANGERED_CHUNKS_MAX_CAPACITY = " ,endangered-chunks-max-capacity "\n")
+ ,@`("ACCEPTABLE_DIFFERENCE = " ,(number->string acceptable-difference) "\n")
+ ,@`("CHUNKS_REBALANCING_BETWEEN_LABELS = " ,(number->string chunks-rebalancing-between-labels) "\n")
+ ,@`("FREE_INODES_PERIOD = " ,(number->string free-inodes-period) "\n")
+ ,@(if no-atime
+ `("NO_ATIME = 1\n")
+ `("NO_ATIME = 0\n"))
+ ,@`("SESSION_SUSTAIN_TIME = " ,(number->string session-sustain-time) "\n")
+ ,@(if reject-old-client
+ `("REJECT_OLD_CLIENT = 1\n")
+ `("REJECT_OLD_CLIENT = 0\n"))
+ ,@`("GLOBALIOLIMITS_FILENAME = " ,globaliolimits-filename "\n")
+ ,@`("GLOBALIOLIMITS_RENEGOTIATION_PERIOD_SETTINGS = " ,(number->string globaliolimits-renegotiation-period-settings) "\n")
+ ,@`("GLOBALIOLIMITS_ACCUMULATE_MS = " ,(number->string globaliolimits-accumulate-ms) "\n")
+ ,@`("MFSMETARESTORE_PATH = " ,mfsmetarestore-path "\n")
+ ,@`("MASTER_RECONNECTION_DELAY = " ,(number->string master-reconnection-delay) "\n")
+ ,@`("MASTER_HOST = " ,master-host "\n")
+ ,@`("MASTER_PORT = " ,(number->string master-port) "\n")
+ ,@`("MASTER_TIMEOUT = " ,(number->string master-timeout) "\n")
+ ,@`("METADATA_CHECKSUM_INTERVAL = " ,(number->string metadata-checksum-interval) "\n")
+ ,@`("METADATA_CHECKSUM_RECALCULATION_SPEED = " ,(number->string metadata-checksum-recalculation-speed) "\n")
+ ,@(if disable-metadata-checksum-verification
+ `("DISABLE_METADATA_CHECKSUM_VERIFICATION = 1\n")
+ `("DISABLE_METADATA_CHECKSUM_VERIFICATION = 0\n"))
+ ,@`("METADATA_SAVE_REQUEST_MIN_PERIOD = " ,(number->string metadata-save-request-min-period) "\n")
+ ,@(if use-bdb-for-name-storage
+ `("USE_BDB_FOR_NAME_STORAGE = 1\n")
+ `("USE_BDB_FOR_NAME_STORAGE = 0\n"))
+ ,@`("BDB_NAME_STORAGE_CACHE = " ,(number->string bdb-name-storage-cache) "\n")
+ ,@(if avoid-same-ip-chunkservers
+ `("AVOID_SAME_IP_CHUNKSERVERS = 1\n")
+ `("AVOID_SAME_IP_CHUNKSERVERS = 0\n"))
+ ,@`("LOAD_FACTOR_PENALTY = " ,(number->string load-factor-penalty) "\n")
+ ,@`("REDUNDANCY_LEVEL = " ,(number->string redundancy-level) "\n")
+ ,@`("SNAPSHOT_INITIAL_BATCH_SIZE_LIMIT = " ,(number->string snapshot-initial-batch-size-limit) "\n")
+ ,@`("FILE_TEST_LOOP_MIN_TIME = " ,(number->string file-test-loop-min-time) "\n"))))
+ port)))
+ #:local-build? #t))))
+
+(define-record-type* <lizardfs-configuration>
+ lizardfs-configuration
+ make-lizardfs-configuration
+ lizardfs-configuration?
+ (package lizardfs-configuration-package
+ (default lizardfs))
+ (mfsmetalogger-config lizardfs-configuration-mfsmetalogger-config
+ (default (lizardfs-mfsmetalogger-config-file)))
+ (mfschunkserver-config lizardfs-configuration-mfschunkserver-config
+ (default (lizardfs-mfschunkserver-config-file)))
+ (mfshdd-config lizardfs-configuration-mfshdd-config
+ (default (lizardfs-mfshdd-config-file)))
+ (mfsmaster-config lizardfs-configuration-mfsmaster-config
+ (default (lizardfs-mfsmaster-config-file)))
+ (run-mfsmetalogger-service? lizardfs-configuration-run-mfsmetalogger-service
+ (default #f))
+ (mfsgoals-config lizardfs-configuration-mfsgoals-config
+ (default (plain-file "mfsgoals.cfg"
+ (string-append
+ "1 1_copy : _\n"
+ "2 2_copies : _ _\n"
+ "3 3_copies : _ _ _\n"))))
+ (mfsmount-config lizardfs-configuration-mfsmount-config
+ (default (plain-file "mfsmount.cfg"
+ "")))
+ (mfsexports-config lizardfs-configuration-mfsexports-config
+ (default (plain-file "mfsexports.cfg"
+ "")))
+ (mfstopology-config lizardfs-configuration-mfstopology-config
+ (default (plain-file "mfstopology.cfg"
+ "")))
+ (globaliolimits-config lizardfs-configuration-globaliolimits-config
+ (default (plain-file "globaliolimits.cfg"
+ "")))
+ (iolimits-config lizardfs-configuration-iolimits-config
+ (default (plain-file "iolimits.cfg"
+ ""))))
+
+(define lizardfs-shepherd-service
+ (match-lambda
+ (($ <lizardfs-configuration> package)
+ (list
+ (shepherd-service
+ (documentation "Lizardfs mfsmaster server")
+ (provision '(lizardfs))
+ (requirement '(loopback))
+ (start #~(make-forkexec-constructor
+ (list #$(file-append package "/sbin/mfsmaster")
+ "-c" "/etc/lizardfs/mfsmaster.cfg"
+ "-d" "start")
+ #:log-file "/var/log/mfsmaster.log"))
+ (stop #~(make-system-destructor
+ #$(file-append package "/sbin/mfsmaster")
+ " -c /etc/lizardfs/mfsmaster.cfg"
+ " stop"))
+ (respawn? #f)
+ (auto-start? #f)
+ )))))
+
+(define lizardfs-mfsmetalogger-shepherd-service
+ (match-lambda
+ (($ <lizardfs-configuration> package)
+ (list
+ (shepherd-service
+ (documentation "Lizardfs mfsmetalogger server")
+ (provision '(lizardfs-mfsmetalogger))
+ (requirement '(loopback lizardfs))
+ (start #~(make-forkexec-constructor
+ (list #$(file-append package "/sbin/mfsmetalogger")
+ "-c" "/etc/lizardfs/mfsmetalogger.cfg"
+ "-d" "start")
+ #:log-file "/var/log/mfsmetalogger.log"))
+ (stop #~(make-system-destructor
+ #$(file-append package "/sbin/mfsmetalogger")
+ " -c /etc/lizardfs/mfsmetalogger.cfg"
+ " stop"))
+ (auto-start? #f)
+ )))))
+
+(define lizardfs-mfschunkserver-shepherd-service
+ (match-lambda
+ (($ <lizardfs-configuration> package)
+ (list
+ (shepherd-service
+ (documentation "Lizardfs mfschunkserver server")
+ (provision '(lizardfs-mfschunkserver))
+ (requirement '(loopback lizardfs))
+ (start #~(make-forkexec-constructor
+ (list #$(file-append package "/sbin/mfschunkserver")
+ "-c" "/etc/lizardfs/mfschunkserver.cfg"
+ "-d" "start")
+ #:log-file "/var/log/mfschunkserver.log"))
+ (stop #~(make-system-destructor
+ #$(file-append package "/sbin/mfschunkserver")
+ " -c /etc/lizardfs/mfschunkserver.cfg"
+ " stop"))
+ (auto-start? #f)
+ )))))
+
+(define lizardfs-mfsmount-shepherd-service
+ (match-lambda
+ (($ <lizardfs-configuration> package)
+ (list
+ (shepherd-service
+ (documentation "Mount Lizardfs filesystems")
+ (provision '(lizardfs-mounts))
+ (requirement '(loopback))
+ (start #~(make-forkexec-constructor
+ (list #$(file-append package "/bin/mfsmount")
+ ;#$mountpoint
+ "-o" "mfsdelayedinit")
+ ))
+ ;(stop #~(make-system-destructor #$(file-append fuse "/bin/fusermount") " -u " #$mountpoint))
+ (stop #~(make-kill-destructor))
+ (auto-start? #f)
+ )))))
+
+(define (lizardfs-etc-service config)
+ `(("lizardfs/globaliolimits.cfg"
+ ,(lizardfs-configuration-globaliolimits-config config))
+ ("lizardfs/iolimits.cfg"
+ ,(lizardfs-configuration-iolimits-config config))
+ ("lizardfs/mfschunkserver.cfg"
+ ,(lizardfs-configuration-mfschunkserver-config config))
+ ("lizardfs/mfsexports.cfg"
+ ,(lizardfs-configuration-mfsexports-config config))
+ ("lizardfs/mfsgoals.cfg"
+ ,(lizardfs-configuration-mfsgoals-config config))
+ ("lizardfs/mfshdd.cfg"
+ ,(lizardfs-configuration-mfshdd-config config))
+ ("lizardfs/mfsmaster.cfg"
+ ,(lizardfs-configuration-mfsmaster-config config))
+ ("lizardfs/mfsmetalogger.cfg"
+ ,(lizardfs-configuration-mfsmetalogger-config config))
+ ("lizardfs/mfsmount.cfg"
+ ,(lizardfs-configuration-mfsmount-config config))
+ ("lizardfs/mfstopology.cfg"
+ ,(lizardfs-configuration-mfstopology-config config))))
+
+(define (lizardfs-activation config)
+ #~(begin
+ (unless (and (file-exists? "/var/lib/lizardfs/metadata.mfs")
+ (lizardfs-configuration-run-mfsmetalogger-service config))
+ ;; First run "service".
+ (with-output-to-file "/var/lib/lizardfs/metadata.mfs"
+ (lambda ()
+ (format #t "MFSM NEW"))))
+ #$(plain-file? (lizardfs-configuration-globaliolimits-config config))
+ #$(plain-file? (lizardfs-configuration-iolimits-config config))
+ #$(plain-file? (lizardfs-configuration-mfschunkserver-config config))
+ #$(plain-file? (lizardfs-configuration-mfsexports-config config))
+ #$(plain-file? (lizardfs-configuration-mfsgoals-config config))
+ #$(plain-file? (lizardfs-configuration-mfshdd-config config))
+ #$(plain-file? (lizardfs-configuration-mfsmaster-config config))
+ #$(plain-file? (lizardfs-configuration-mfsmetalogger-config config))
+ #$(plain-file? (lizardfs-configuration-mfsmount-config config))
+ #$(plain-file? (lizardfs-configuration-mfstopology-config config))
+ #t))
+
+(define (lizardfs-services-to-run config)
+ (append (lizardfs-shepherd-service config)
+ (lizardfs-mfschunkserver-shepherd-service config)
+ (if (lizardfs-configuration-run-mfsmetalogger-service config)
+ (lizardfs-mfsmetalogger-shepherd-service config)
+ '())))
+
+(define lizardfs-service-type
+ (service-type
+ (name 'lizardfs)
+ (extensions
+ (list
+ (service-extension shepherd-root-service-type
+ lizardfs-services-to-run)
+ (service-extension activation-service-type
+ lizardfs-activation)
+ (service-extension etc-service-type
+ lizardfs-etc-service)
+ (service-extension account-service-type
+ (const %lizardfs-accounts))
+ (service-extension profile-service-type
+ (compose list lizardfs-configuration-package))))
+ (default-value (lizardfs-configuration))
+ (description "")))