aboutsummaryrefslogtreecommitdiff
path: root/object/store/packed/internal/ingest/cache.go
blob: 9a15f55ff0ebf382b9022442b98844640795e3d2 (about) (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package ingest

import (
	"codeberg.org/lindenii/furgit/internal/lru"
	objecttype "codeberg.org/lindenii/furgit/object/type"
)

// deltaBaseCacheKey identifies one resolved base by record index.
type deltaBaseCacheKey struct {
	recordIdx int
}

// deltaBaseCacheValue stores one resolved base object payload.
type deltaBaseCacheValue struct {
	realType objecttype.Type
	content  []byte
}

// deltaBaseCache is a bounded LRU for resolved base payloads.
type deltaBaseCache struct {
	lru *lru.Cache[deltaBaseCacheKey, deltaBaseCacheValue]
}

// newDeltaBaseCache creates one bounded base cache.
func newDeltaBaseCache(maxBytes int64) *deltaBaseCache {
	return &deltaBaseCache{
		lru: lru.New(
			maxBytes,
			func(_ deltaBaseCacheKey, value deltaBaseCacheValue) int64 {
				return int64(len(value.content))
			},
			nil,
		),
	}
}

// get returns one cache entry for recordIdx.
func (cache *deltaBaseCache) get(recordIdx int) (objecttype.Type, []byte, bool) {
	value, ok := cache.lru.Get(deltaBaseCacheKey{recordIdx: recordIdx})
	if !ok {
		return objecttype.TypeInvalid, nil, false
	}

	return value.realType, value.content, true
}

// add stores one cache entry for recordIdx.
func (cache *deltaBaseCache) add(recordIdx int, realType objecttype.Type, content []byte) {
	cache.lru.Add(deltaBaseCacheKey{recordIdx: recordIdx}, deltaBaseCacheValue{
		realType: realType,
		content:  content,
	})
}