gastownhall/beads · error

server: NewDoltServer: failed to determine absolute path of

Error message

server: NewDoltServer: failed to determine absolute path of configPath

What it means

NewDoltServer resolves configPath (the dolt sql-server YAML config) to an absolute path before parsing it and passing it to the child process. filepath.Abs fails only when the process cwd cannot be determined (deleted cwd or getwd failure) and configPath was relative.

Source

Thrown at internal/storage/dbproxy/server/doltserver.go:83

		return nil, errors.New("server: NewDoltServer: doltBinExec is required")
	}
	if rootDir == "" {
		return nil, errors.New("server: NewDoltServer: rootDir is required")
	}
	if configPath == "" {
		return nil, errors.New("server: NewDoltServer: configPath is required")
	}
	absDoltBinExec, err := filepath.Abs(doltBinExec)
	if err != nil {
		return nil, errors.New("server: NewDoltServer: failed to determine absolute path of doltBinExec")
	}
	absRootDir, err := filepath.Abs(rootDir)
	if err != nil {
		return nil, errors.New("server: NewDoltServer: failed to determine absolute path of rootDir")
	}
	absConfigPath, err := filepath.Abs(configPath)
	if err != nil {
		return nil, errors.New("server: NewDoltServer: failed to determine absolute path of configPath")
	}
	cfg, err := servercfg.YamlConfigFromFile(filesys.LocalFS, configPath)
	if err != nil {
		return nil, fmt.Errorf("server: NewDoltServer: parse config %q: %w", configPath, err)
	}
	var logFile *os.File
	if logFilePath != "" {
		absLogFilePath, err := filepath.Abs(logFilePath)
		if err != nil {
			return nil, errors.New("server: NewDoltServer: failed to determine absolute path of logFilePath")
		}
		logFile, err = os.OpenFile(absLogFilePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0o600) //nolint:gosec // logFilePath is caller-derived, not user-request input
		if err != nil {
			return nil, fmt.Errorf("server: NewDoltServer: open log %q: %w", logFilePath, err)
		}
	}
	if keepAlivePeriod == 0 {
		keepAlivePeriod = defaultKeepAlivePeriod

View on GitHub (pinned to 71377f2769)

Solutions

  1. Pass an absolute configPath, resolved at process startup while the cwd is valid
  2. Check whether the process cwd is deleted (ls /proc/<pid>/cwd) and restart from a valid directory if so
  3. Recreate the deleted working directory, then retry the operation

Example fix

// before
srv, err := server.NewDoltServer(bin, root, ".beads/server.yaml", logPath, 0, db)
// after
absCfg, err := filepath.Abs(".beads/server.yaml")
if err != nil { return err }
srv, err := server.NewDoltServer(bin, root, absCfg, logPath, 0, db)
Defensive patterns

Strategy: validation

Validate before calling

cfg, err := filepath.Abs(configPath)
if err != nil { return fmt.Errorf("cannot resolve config path (cwd invalid?): %w", err) }
if _, err := os.Stat(cfg); err != nil { return fmt.Errorf("server config not found at %s: %w", cfg, err) }

Prevention

When it happens

Trigger: Calling NewDoltServer with a relative configPath (e.g. ".beads/server.yaml") after the process working directory has been deleted or getwd fails. Note the very next step parses the config from the original relative path, so an unreadable file surfaces as a different 'parse config' error instead.

Common situations: Long-running processes whose cwd was removed (tmp cleanup, CI teardown); launching from a shell in a directory that was subsequently deleted; chroot/container setups with erased working directories.

Related errors


AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30). Data as JSON: /api/errors/9fcb2b5aac04f435. Report an issue: GitHub.