AdguardTeam/AdGuardHome · error
decoding db: %w
Error message
decoding db: %w
What it means
The lease database file was read but its content is not valid JSON matching the dataLeases structure; json.Unmarshal failed. The DB is expected to be a JSON object with a leases array.
Source
Thrown at internal/dhcpd/db.go:106
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()
if err != nil {
log.Info("dhcp: invalid lease: %s", err)
continue
}
if lease.IP.Is4() {
leases4 = append(leases4, lease)
} else {View on GitHub (pinned to b41aefbe51)
Solutions
- Validate the file with a JSON linter (jq . leases.json)
- Fix or delete the malformed file; dynamic leases will be re-acquired
- Restore from backup; ensure the service is stopped when editing to avoid truncated writes
Example fix
// before
{ "leases": { "a": 1 } }
// after
{ "leases": [] } Defensive patterns
Strategy: validation
Validate before calling
if !json.Valid(data) { /* quarantine file and continue with empty DB */ } Type guard
func isValidLeasesJSON(b []byte) bool { return json.Valid(b) } Try / catch
if err := s.dbLoad(); err != nil && strings.Contains(err.Error(), "decoding db") { /* rename bad file, retry */ } Prevention
- Use jq to validate after manual edits
- Avoid killing the process during lease saves
When it happens
Trigger: Loading a leases file containing truncated JSON, YAML, plain text, or JSON with leases entries of the wrong shape (e.g. leases as object instead of array).
Common situations: Hand-editing the file and breaking syntax, interrupted writes (crash during save), or a file from an incompatible version/fork.
Related errors
- parsing hardware address: %w
- parsing expiry time: %w
- loading db: %w
- reading db: %w
- resetting dhcpv4 leases: %w
AI-assisted analysis of AdguardTeam/AdGuardHome@b41aefbe51 (2026-08-27).
Data as JSON: /api/errors/24ad112f8288a3db.
Report an issue: GitHub.