From d380cad36d565b121085aa6c45124b50c283e782 Mon Sep 17 00:00:00 2001 From: Daniel Arroyo Date: Mon, 6 Jul 2026 12:10:20 -0400 Subject: [PATCH] fix(nfs): add migration 0006 to repair fsid=0 exports Migration 0005 (MigrateNFSClients) only runs once when first applied, so any fsid=0 rows present before 0005 was applied never get repaired. Migration 0006 triggers FixZeroFSIDs() which: - Queries all nfs_exports rows with fsid=0 - Generates a new random fsid per row - Updates the row Version: 0.5.2 --- Makefile | 2 +- internal/db/db.go | 40 +++++++++++++++++++ .../db/migrations/0006_nfs_fix_zero_fsid.sql | 3 ++ 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 internal/db/migrations/0006_nfs_fix_zero_fsid.sql diff --git a/Makefile b/Makefile index 37397e2..e986d5f 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ BINARY=nasctl -VERSION?=0.5.1 +VERSION?=0.5.2 GO?=go LDFLAGS=-s -w -X github.com/darroyo/nasctl/internal/web.Version=$(VERSION) -X github.com/darroyo/nasctl/internal/web.Commit=$(shell git rev-parse --short HEAD 2>/dev/null || echo unknown) BUILD_FLAGS=CGO_ENABLED=0 diff --git a/internal/db/db.go b/internal/db/db.go index d6d29c9..d87f1d5 100644 --- a/internal/db/db.go +++ b/internal/db/db.go @@ -86,6 +86,11 @@ func (d *DB) Migrate() error { return fmt.Errorf("migrate nfs clients: %w", err) } } + if name == "0006_nfs_fix_zero_fsid.sql" { + if err := d.FixZeroFSIDs(); err != nil { + return fmt.Errorf("fix zero fsids: %w", err) + } + } } return nil } @@ -227,3 +232,38 @@ func (d *DB) MigrateNFSClients() error { } return nil } + +func (d *DB) FixZeroFSIDs() error { + rows, err := d.conn.Query(`SELECT id, fsid FROM nfs_exports WHERE fsid = 0`) + if err != nil { + return fmt.Errorf("query zero fsid exports: %w", err) + } + defer rows.Close() + + type fsidRow struct { + ID int64 + FSID int64 + } + var toFix []fsidRow + for rows.Next() { + var r fsidRow + if err := rows.Scan(&r.ID, &r.FSID); err != nil { + return fmt.Errorf("scan fsid row: %w", err) + } + toFix = append(toFix, r) + } + if err := rows.Err(); err != nil { + return fmt.Errorf("rows iteration: %w", err) + } + + for _, r := range toFix { + n, err := system.GenerateRandomFSID() + if err != nil { + return fmt.Errorf("generate fsid for id %d: %w", r.ID, err) + } + if _, err := d.conn.Exec(`UPDATE nfs_exports SET fsid = ? WHERE id = ?`, int64(n), r.ID); err != nil { + return fmt.Errorf("update fsid for id %d: %w", r.ID, err) + } + } + return nil +} diff --git a/internal/db/migrations/0006_nfs_fix_zero_fsid.sql b/internal/db/migrations/0006_nfs_fix_zero_fsid.sql new file mode 100644 index 0000000..b802d9a --- /dev/null +++ b/internal/db/migrations/0006_nfs_fix_zero_fsid.sql @@ -0,0 +1,3 @@ +-- Repair NFS exports with fsid=0 (exportfs requires a non-zero fsid). +-- Schema change: none. +-- Data transformation is done by the Go hook FixZeroFSIDs in db.go.