AdguardTeam/AdGuardHome · error

closing database: %w

Error message

closing database: %w

What it means

During stats reset (clear, triggered by handleStatsReset or setLimit), the code closes the old bbolt database before recreating it; db.Close() failed and is wrapped as 'closing database'.

Source

Thrown at internal/stats/stats.go:543

func (s *StatsCtx) clear() (err error) {
	defer func() { err = errors.Annotate(err, "clearing: %w") }()

	db := s.db.Swap(nil)
	if db != nil {
		var tx *bbolt.Tx
		tx, err = db.Begin(true)
		if err != nil {
			s.logger.Error("opening transaction", slogutil.KeyError, err)
		} else if err = finishTxn(tx, false); err != nil {
			// Don't wrap the error since it's informative enough as is.
			return err
		}

		// Active transactions will continue using database, but new ones won't
		// be created.
		err = db.Close()
		if err != nil {
			return fmt.Errorf("closing database: %w", err)
		}

		// All active transactions are now closed.
		s.logger.Debug("database closed")
	}

	err = os.Remove(s.filename)
	if err != nil {
		s.logger.Error("removing", slogutil.KeyError, err)
	}

	err = s.openDB()
	if err != nil {
		s.logger.Error("opening database", slogutil.KeyError, err)
	}

	// Use defer to unlock the mutex as soon as possible.
	defer s.logger.Debug("cleared")

View on GitHub (pinned to b41aefbe51)

Solutions

  1. Retry the reset once the system is idle / no concurrent stats queries are running
  2. Check for leaked transactions or long-running readers on the DB
  3. If the DB is corrupt, stop the service and remove the stats file
Defensive patterns

Strategy: retry

Try / catch

if err := s.Clear(); err != nil { log.Printf("reset failed: %v; retrying", err); time.Sleep(time.Second); err = s.Clear() }

Prevention

When it happens

Trigger: Resetting stats (POST to the stats reset endpoint) or changing the limit while the database has open transactions or is otherwise unable to close cleanly.

Common situations: Concurrent reads/writes still holding transactions when reset happens; file descriptor or lock issues on the stats DB path.

Related errors


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