replace Redis with an embedded SQLite string->string KV store (group commit, in-tx events, SQL search)
Build and Push Docker Image / build (push) Successful in 2m44s
Build and Push Docker Image / build (push) Successful in 2m44s
This commit is contained in:
@@ -27,8 +27,10 @@ type fileStatsJSON struct {
|
||||
// dashboard shows, in one request.
|
||||
//
|
||||
// Deliberately split by cost. Records/RedisKeys/RedisMemory/Identities are
|
||||
// O(1) commands (SCARD, DBSIZE, INFO) plus a directory listing, recomputed on
|
||||
// every call. Files and UDLUsers need a keyspace walk — ~0.5s for the file
|
||||
// cheap (an index range count, a cached row count, a file stat) plus a
|
||||
// directory listing, recomputed on every call. The `redis*` JSON names
|
||||
// predate the move to SQLite and are kept for dashboard compatibility:
|
||||
// redisKeys is the store's row count, redisMemory its on-disk size. Files and UDLUsers need a keyspace walk — ~0.5s for the file
|
||||
// tuples and ~3s for the UDL SCAN on an 88k-record box — so they are served
|
||||
// from a background-refreshed cache and are null until the first sweep lands.
|
||||
type StatsResponse struct {
|
||||
@@ -47,7 +49,7 @@ type StatsResponse struct {
|
||||
|
||||
// statsCache holds the expensive half of /api/stats.
|
||||
//
|
||||
// Why a cache and not just "compute it": the dashboard polls. A 3s Redis walk
|
||||
// Why a cache and not just "compute it": the dashboard polls. A multi-second store walk
|
||||
// per tick, per open tab, is a self-inflicted outage on a box that is also
|
||||
// serving playback — the same shape as meta-sort's /api/stats full sweep. So
|
||||
// the handler NEVER waits on a walk: it returns whatever the last sweep
|
||||
@@ -86,7 +88,7 @@ func (c *statsCache) refreshIfStale(sweep func() (*fileStatsJSON, *int)) bool {
|
||||
c.running = false
|
||||
// A failed sweep leaves the previous numbers in place rather than
|
||||
// blanking the tiles; sweptAt still advances so a hard-failing walk
|
||||
// (Redis down) does not spin once per poll.
|
||||
// (store down) does not spin once per poll.
|
||||
c.sweptAt = time.Now()
|
||||
if files != nil {
|
||||
c.files = files
|
||||
|
||||
Reference in New Issue
Block a user