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
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
BINARY=nasctl
|
BINARY=nasctl
|
||||||
VERSION?=0.5.1
|
VERSION?=0.5.2
|
||||||
GO?=go
|
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)
|
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
|
BUILD_FLAGS=CGO_ENABLED=0
|
||||||
|
|||||||
@@ -86,6 +86,11 @@ func (d *DB) Migrate() error {
|
|||||||
return fmt.Errorf("migrate nfs clients: %w", err)
|
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
|
return nil
|
||||||
}
|
}
|
||||||
@@ -227,3 +232,38 @@ func (d *DB) MigrateNFSClients() error {
|
|||||||
}
|
}
|
||||||
return nil
|
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
|
||||||
|
}
|
||||||
|
|||||||
@@ -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.
|
||||||
Reference in New Issue
Block a user