AdguardTeam/AdGuardHome · error

reading db

Error message

reading db: %w

What it means

The DHCP server could not read the lease database file from disk; the wrapped error is an os.ReadFile failure other than 'file does not exist' (missing file is tolerated and treated as empty DB).

Solutions

  1. Check permissions on the leases file and data dir (chown/chmod so the service user can read)
  2. Verify the path is a regular file, not a directory
  3. Look for underlying I/O errors (dmesg/disk health) if permissions are fine
Defensive patterns

Strategy: try-catch

Validate before calling

// pre-flight check
if fi, err := os.Stat(path); err == nil && fi.IsDir() { return errors.New("leases path is a directory") }

Try / catch

if err := s.dbLoad(); err != nil { if errors.Is(err, os.ErrPermission) { /* fix perms / alert */ }; return err }

Prevention

When it happens

Trigger: Permission denied on the leases file, path is a directory, I/O errors, or the configured working directory containing an unreadable leases.db.

Common situations: Running the service as a user without read access to the data dir; SELinux/AppArmor restrictions; the file being replaced with a directory; disk failures.

Related errors


AI-assisted analysis of AdguardTeam/AdGuardHome@b41aefbe51 (2026-08-27). Data as JSON: /api/errors/05f17e44d10bcf47. Report an issue: GitHub.

Appendix: source

Thrown at internal/dhcpd/db.go:97

			return nil, fmt.Errorf("parsing expiry time: %w", err)
		}
	}

	return &dhcpsvc.Lease{
		Expiry:   expiry,
		IP:       dl.IP,
		Hostname: dl.Hostname,
		HWAddr:   mac,
		IsStatic: dl.IsStatic,
	}, nil
}

// dbLoad loads stored leases.
func (s *server) dbLoad() (err error) {
	data, err := os.ReadFile(s.conf.dbFilePath)
	if err != nil {
		if !errors.Is(err, os.ErrNotExist) {
			return fmt.Errorf("reading db: %w", err)
		}

		return nil
	}

	dl := &dataLeases{}
	err = json.Unmarshal(data, dl)
	if err != nil {
		return fmt.Errorf("decoding db: %w", err)
	}

	leases := dl.Leases
	leases4 := []*dhcpsvc.Lease{}
	leases6 := []*dhcpsvc.Lease{}

	for _, l := range leases {
		var lease *dhcpsvc.Lease
		lease, err = l.toLease()

View on GitHub (pinned to b41aefbe51)