Unverified Commit 63d9f002 authored by dotlambda's avatar dotlambda Committed by GitHub
Browse files

nixos/immich: reindex VectorChord indexes on update (#455315)

parents 9deef6a6 00730797
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -323,7 +323,11 @@ in
          "vchord"
        ];
        sqlFile = pkgs.writeText "immich-pgvectors-setup.sql" (
          # save previous version of vectorchord to trigger reindex on update
          lib.optionalString cfg.database.enableVectorChord ''
            SELECT COALESCE(installed_version, ''') AS vchord_version_before FROM pg_available_extensions WHERE name = 'vchord' \gset
          ''
          + ''
            ${lib.concatMapStringsSep "\n" (ext: "CREATE EXTENSION IF NOT EXISTS \"${ext}\";") extensions}
            ${lib.concatMapStringsSep "\n" (ext: "ALTER EXTENSION \"${ext}\" UPDATE;") extensions}
            ALTER SCHEMA public OWNER TO ${cfg.database.user};
@@ -332,6 +336,17 @@ in
            ALTER SCHEMA vectors OWNER TO ${cfg.database.user};
            GRANT SELECT ON TABLE pg_vector_index_stat TO ${cfg.database.user};
          ''
          # trigger reindex if vectorchord updates
          # https://docs.immich.app/administration/postgres-standalone/#updating-vectorchord
          + lib.optionalString cfg.database.enableVectorChord ''
            SELECT COALESCE(installed_version, ''') AS vchord_version_after FROM pg_available_extensions WHERE name = 'vchord' \gset

            SELECT (:'vchord_version_before' != ''' AND :'vchord_version_before' != :'vchord_version_after') AS has_vchord_updated \gset
            \if :has_vchord_updated
              REINDEX INDEX face_index;
              REINDEX INDEX clip_index;
            \endif
          ''
        );
      in
      [
+1 −0
Original line number Diff line number Diff line
@@ -733,6 +733,7 @@ in
  immich = runTest ./web-apps/immich.nix;
  immich-public-proxy = runTest ./web-apps/immich-public-proxy.nix;
  immich-vectorchord-migration = runTest ./web-apps/immich-vectorchord-migration.nix;
  immich-vectorchord-reindex = runTest ./web-apps/immich-vectorchord-reindex.nix;
  incron = runTest ./incron.nix;
  incus = pkgs.recurseIntoAttrs (
    handleTest ./incus {
+74 −0
Original line number Diff line number Diff line
{ ... }:
{
  name = "immich-vectorchord-reindex";

  nodes.machine =
    { lib, pkgs, ... }:
    {
      # These tests need a little more juice
      virtualisation = {
        cores = 2;
        memorySize = 2048;
        diskSize = 4096;
      };

      services.immich = {
        enable = true;
        environment.IMMICH_LOG_LEVEL = "verbose";
      };

      services.postgresql.extensions = lib.mkForce (ps: [
        ps.pgvector
        # pin vectorchord to an older version simulate version bump
        (ps.vectorchord.overrideAttrs (prevAttrs': rec {
          version = "0.5.2";
          src = pkgs.fetchFromGitHub {
            owner = "tensorchord";
            repo = "vectorchord";
            tag = version;
            hash = "sha256-KGwiY5t1ivFiYex3D20y3sdiu3CT9LCDd2fPnRE56jM=";
          };

          cargoDeps = pkgs.rustPlatform.fetchCargoVendor {
            inherit src;
            hash = "sha256-Vn3c/xuUpQzERJ74I0qbvufTZtW3goefPa5B/nOUO48=";
          };
        }))
      ]);

      specialisation."immich-vectorchord-upgraded".configuration = {
        # needs to be lower than mkForce, otherwise it does not get rid of the previous version
        services.postgresql.extensions = lib.mkOverride 40 (ps: [
          ps.pgvector
          ps.vectorchord
        ]);
      };

    };

  testScript =
    { nodes, ... }:
    let
      specBase = "${nodes.machine.system.build.toplevel}/specialisation";
      vectorchordUpgraded = "${specBase}/immich-vectorchord-upgraded";
    in
    ''
      def immich_works():
        machine.wait_for_unit("immich-server.service")

        machine.wait_for_open_port(2283) # Server
        machine.wait_for_open_port(3003) # Machine learning
        machine.succeed("curl --fail http://localhost:2283/")

      immich_works()

      machine.succeed("${vectorchordUpgraded}/bin/switch-to-configuration test")

      # just tests that reindexing is triggered
      machine.wait_until_succeeds(
        "journalctl -o cat -u postgresql-setup.service | grep 'REINDEX'"
      )

      immich_works()
    '';
}
+1 −1
Original line number Diff line number Diff line
@@ -251,7 +251,7 @@ stdenv.mkDerivation {

  passthru = {
    tests = {
      inherit (nixosTests) immich immich-vectorchord-migration;
      inherit (nixosTests) immich immich-vectorchord-migration immich-vectorchord-reindex;
    };

    machine-learning = immich-machine-learning;