allegro / allegro/bigcache

hashmapStats allocated unconditionally regardless of StatsEnabled

Offen
#422 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
Go
Sterne
8.2k
Forks
614
Ø Merge
5 T. 12 Std.
Gemergte PRs (30 T.)
1

Beschreibung

## Description

In v3.1.0, `hashmapStats` was added to each shard in `initNewShard`:

```go
return &cacheShard{
hashmap: make(map[uint64]uint32, config.initialShardSize()),
hashmapStats: make(map[uint64]uint32, config.initialShardSize()), // always allocated
...
}
```

However, `hashmapStats` is only read/written when `StatsEnabled: true`. `DefaultConfig` sets `StatsEnabled: false`, so the vast majority of users never use stats — yet they pay the full memory cost of `hashmapStats` at startup.

## Memory impact

The allocation cost per shard is `initialShardSize() * sizeof(map entry)`. With `DefaultConfig`:
- `MaxEntriesInWindow = 600_000`, `Shards = 1024`
- `initialShardSize = 600_000 / 1024 = 585` entries per shard
- Each map pre-allocates ~17.5 KB of buckets

For a setup with many independent BigCache instances (e.g. 16), the unconditional `hashmapStats` allocation adds:

```
16 instances × 1024 shards × ~17.5 KB = ~286 MiB
```

This memory is entirely wasted when `StatsEnabled: false`.

## Expected behavior

`hashmapStats` should only be allocated when `StatsEnabled: true`:

```go
if config.StatsEnabled {
shard.hashmapStats = make(map[uint64]uint32, config.initialShardSize())
}
```

## Suggested fix

Allocate `hashmapStats` conditionally in `initNewShard`, and guard all reads/writes to it with a `StatsEnabled` check (they likely already are, given the field only makes sense with stats on).

## Version

v3.1.0 (not present in v3.0.2)

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.