vitessio/vitess · error
could not read existing file %v: %v
Error message
could not read existing file %v: %v
What it means
Returned by mysqld config update logic when the existing (current) config file on disk cannot be read before applying updates, wrapping the I/O error.
Source
Thrown at go/vt/mysqlctl/mysqld.go:1581
defer client.Close()
return client.RefreshConfig(ctx)
}
log.Info("Checking for updates to my.cnf")
f, err := os.CreateTemp(path.Dir(cnf.Path), "my.cnf")
if err != nil {
return fmt.Errorf("could not create temp file: %v", err)
}
defer os.Remove(f.Name())
err = mysqld.initConfig(cnf, f.Name())
if err != nil {
return fmt.Errorf("could not initConfig in %v: %v", f.Name(), err)
}
existing, err := os.ReadFile(cnf.Path)
if err != nil {
return fmt.Errorf("could not read existing file %v: %v", cnf.Path, err)
}
updated, err := os.ReadFile(f.Name())
if err != nil {
return fmt.Errorf("could not read updated file %v: %v", f.Name(), err)
}
if bytes.Equal(existing, updated) {
log.Info("No changes to my.cnf. Continuing.")
return nil
}
backupPath := cnf.Path + ".previous"
err = os.Rename(cnf.Path, backupPath)
if err != nil {
return fmt.Errorf("could not back up existing %v: %v", cnf.Path, err)
}
err = os.Rename(f.Name(), cnf.Path)
if err != nil {View on GitHub (pinned to 01a25a7d17)
Solutions
- Verify cnf.Path exists and is readable by the current user.
- If my.cnf was intentionally removed, reinitialize the tablet config instead of refreshing.
- Fix permissions: chown/chmod the my.cnf file.
- Point cnf.Path at the correct config location for this tablet.
Example fix
// before rm /vt/vtdataroot/vt_0000000100/my.cnf # then RefreshConfig fails // after vttablet reinit (or restore my.cnf from my.cnf.previous) before refreshing
Defensive patterns
Strategy: validation
Validate before calling
if _, err := os.Stat(cnf.Path); err != nil {
return fmt.Errorf("existing my.cnf %s missing; reinit required before refresh", cnf.Path)
} Try / catch
if err := mysqld.RefreshConfig(ctx, cnf); err != nil {
if strings.Contains(err.Error(), "could not read existing file") {
log.Errorf("my.cnf absent/unreadable at %s; reinitialize config", cnf.Path)
}
return err
} Prevention
- Never hand-delete my.cnf from a running tablet directory
- Back up via the built-in my.cnf.previous mechanism instead of rm
- Keep tablet dir ownership consistent with the running user
- Reinitialize config after manual cleanup of VTDATAROOT
When it happens
Trigger: Mysqld.RefreshConfig after successfully writing the temp config: os.ReadFile(cnf.Path) fails because my.cnf was deleted, moved, or has bad permissions.
Common situations: First-time refresh before my.cnf ever written in an unexpected code path; manual cleanup removed my.cnf; tablet directory partially deleted; user running refresh differs from owner of my.cnf.
Understand the failure class
Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.
Related errors
- could not create temp file: %v
- cannot stat hook %v: %v
- unable to create file: %v
- could not back up existing %v: %v
- failure creating directory %s: %w
AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01).
Data as JSON: /api/errors/b9ca5f0231df91fe.
Report an issue: GitHub.