From 2400191caf15fec9b6376ca99c555f09df31d294 Mon Sep 17 00:00:00 2001 From: Bryan Gardiner Date: Sat, 25 May 2019 20:25:12 -0700 Subject: [PATCH] nixos/xdg/mime: disable fdatasync when building the XDG MIME database Back in 2013, update-mime-database started using fdatasync() to write out its changes after processing each file in /share/mime, with the reasoning that a corrupted database from an interruption midway would be problematic for applications[1]. Unfortunately, this caused a significant regression in the time required to run update-mime-database: commonly from under a second to half a minute or more. This delay affects the time required to build system-path on NixOS, when xdg.mime.enable is true (the default). For example, on one of my systems system-path builds in ~48 seconds, 45 of which are update-mime-database. This makes rapidly building new system configurations not fun. This commit disables the calls to fdatasync(). update-mime-database checks an environment variable, PKGSYSTEM_ENABLE_FSYNC, to determine whether it should sync, and we can set this to false. system-path already only has whatever filesystem commit guarantees that the Nix builder provides. Furthermore, there is no risk of a failed MIME database update messing up existing packages, because this is Nix. (This issue was also reported at and discussed by Debian, Red Hat, and Gentoo at least.) [1] https://bugs.freedesktop.org/show_bug.cgi?id=70366 --- nixos/modules/config/xdg/mime.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nixos/modules/config/xdg/mime.nix b/nixos/modules/config/xdg/mime.nix index cd1064630fbc..a5374c2b468d 100644 --- a/nixos/modules/config/xdg/mime.nix +++ b/nixos/modules/config/xdg/mime.nix @@ -24,7 +24,7 @@ with lib; environment.extraSetup = '' if [ -w $out/share/mime ] && [ -d $out/share/mime/packages ]; then - XDG_DATA_DIRS=$out/share ${pkgs.buildPackages.shared-mime-info}/bin/update-mime-database -V $out/share/mime > /dev/null + XDG_DATA_DIRS=$out/share PKGSYSTEM_ENABLE_FSYNC=0 ${pkgs.buildPackages.shared-mime-info}/bin/update-mime-database -V $out/share/mime > /dev/null fi if [ -w $out/share/applications ]; then