{"record":{"id":"48f9b58eb8baaebe","repo":"AdguardTeam/AdGuardHome","slug":"creating-bucket-w-48f9b5","errorCode":null,"errorMessage":"creating bucket: %w","messagePattern":"creating bucket: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/stats/unit.go","lineNumber":348,"sourceCode":"\n\tfor _, s := range e.UpstreamStats {\n\t\tif s.IsCached || s.Error != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\taddr := s.Address\n\t\tu.upstreamsResponses[addr]++\n\t\tu.upstreamsTimeSum[addr] += uint64(s.QueryDuration.Microseconds())\n\t}\n}\n\n// flushUnitToDB puts udb to the database at id.\nfunc (s *StatsCtx) flushUnitToDB(udb *unitDB, tx *bbolt.Tx, id uint32) (err error) {\n\ts.logger.Debug(\"flushing unit\", \"id\", id, \"req_num\", udb.NTotal)\n\n\tbkt, err := tx.CreateBucketIfNotExists(idToUnitName(id))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"creating bucket: %w\", err)\n\t}\n\n\tbuf := &bytes.Buffer{}\n\terr = gob.NewEncoder(buf).Encode(udb)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"encoding unit: %w\", err)\n\t}\n\n\terr = bkt.Put([]byte{0}, buf.Bytes())\n\tif err != nil {\n\t\treturn fmt.Errorf(\"putting unit to database: %w\", err)\n\t}\n\n\treturn nil\n}\n\nfunc convertTopSlice(a []countPair) (m []map[string]uint64) {\n\tm = make([]map[string]uint64, 0, len(a))","sourceCodeStart":330,"sourceCodeEnd":366,"githubUrl":"https://github.com/AdguardTeam/AdGuardHome/blob/b41aefbe51c8dde65e2c50f093996afa0502edf9/internal/stats/unit.go#L330-L366","documentation":"While flushing an aggregated stats unit to bbolt, CreateBucketIfNotExists failed; the error is wrapped as 'creating bucket'.","triggerScenarios":"flushUnitToDB (via Close, periodic flush, or populateTestData) hitting a read-only/closed transaction, disk full, or bbolt-internal errors creating the per-unit bucket.","commonSituations":"Disk exhaustion, transaction invalidated by a prior error, DB closed concurrently with a flush.","solutions":["Check disk space and DB file permissions","Ensure Close/flush is not racing with DB close or reset","Restart with a fresh stats DB if corruption is suspected"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"if err := db.View(func(tx *bbolt.Tx) error { _, err := tx.CreateBucketIfNotExistsIfWritable(); return err }); err != nil { /* abort flush */ }","typeGuard":null,"tryCatchPattern":"if err := s.Close(); err != nil { log.Printf(\"flush failed: %v\", err) }","preventionTips":["Ensure disk headroom","Serialize flush vs close/reset"],"tags":["stats","database","bbolt"],"backgroundTag":"database-write-failed","analyzedSha":"b41aefbe51c8dde65e2c50f093996afa0502edf9","analyzedAt":"2026-08-27T04:57:55.097Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}