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

  1. Validate the file with a JSON linter (jq . leases.json)
  2. Fix or delete the malformed file; dynamic leases will be re-acquired
  3. 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

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


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