AdguardTeam/AdGuardHome · error

reading db: %w

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).

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)

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.