AdguardTeam/AdGuardHome · error
loading sessions: %w
Error message
loading sessions: %w
What it means
The default session storage constructor failed while loading persisted web-user sessions from the bbolt database file. This wraps the concrete failure from loadSessions (transaction start, iteration, or commit).
Source
Thrown at internal/aghuser/sessionstorage.go:128
dbFilename := conf.DBPath
ds.db, err = bbolt.Open(dbFilename, aghos.DefaultPermFile, &bbolt.Options{
Timeout: dbOpenTimeout,
Logger: newBBoltLogger(ctx, ds.logger),
})
if err != nil {
ds.logger.ErrorContext(ctx, "opening db", "filename", dbFilename, slogutil.KeyError, err)
if errors.Is(err, berrors.ErrInvalid) {
const s = "AdGuard Home cannot be initialized due to an incompatible file system.\n" +
"Please read the explanation here: https://adguard-dns.io/kb/adguard-home/getting-started/#limitations"
slogutil.PrintLines(ctx, ds.logger, slog.LevelError, "", s)
}
return nil, err
}
err = ds.loadSessions(ctx)
if err != nil {
return nil, fmt.Errorf("loading sessions: %w", err)
}
return ds, nil
}
// newBBoltLogger returns a new [*bbolt.DefaultLogger] that logs messages using
// the given [slog.Logger]. l must not be nil.
func newBBoltLogger(ctx context.Context, l *slog.Logger) (bl *bbolt.DefaultLogger) {
bl = &bbolt.DefaultLogger{
Logger: slog.NewLogLogger(l.Handler(), slog.LevelDebug),
}
if l.Enabled(ctx, slog.LevelDebug) {
bl.EnableDebug()
}
return bl
}View on GitHub (pinned to b41aefbe51)
Solutions
- Inspect the wrapped error to identify the failing phase (transaction/iterate/commit)
- If the file is corrupt, stop the service, back up and delete/recreate sessions.db (users must re-login)
- Ensure only one instance of the service accesses the sessions database file
- Check file permissions on the sessions db path for the service user
Example fix
# before # corrupted sessions.db blocks startup # after mv /var/lib/app/sessions.db /var/lib/app/sessions.db.bak # restart; users re-authenticate
Defensive patterns
Strategy: try-catch
Validate before calling
f, err := os.OpenFile(sessionsPath, os.O_RDWR, 0o600)
if err != nil { return fmt.Errorf("sessions db unusable: %w", err) }
f.Close() Try / catch
ds, err := aghuser.NewDefaultSessionStorage(ctx, logger, path)
if err != nil {
if strings.Contains(err.Error(), "loading sessions") { back up & reset the sessions file }
} Prevention
- Run one service instance per sessions.db
- Back up sessions.db before upgrades
- Ensure service-user write access to the data directory
When it happens
Trigger: Calling NewDefaultSessionStorage on a bbolt file that cannot be read or processed: corrupted database, a database created by an incompatible schema/version, or a file the process cannot lock.
Common situations: Upgrading the application across a session-store schema change without migration; a bbolt file truncated by an unclean shutdown; another process holding a flock on the same sessions.db.
Related errors
- deleting sessions: %w
- starting transaction: %w
- processing sessions: %w
- storing session: %w
- committing transaction: %w
AI-assisted analysis of AdguardTeam/AdGuardHome@b41aefbe51 (2026-08-27).
Data as JSON: /api/errors/46e8596ae98ef8f5.
Report an issue: GitHub.