github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/kbfs/libkbfs/disk_block_cache_helper.go (about) 1 package libkbfs 2 3 import ( 4 "time" 5 6 "github.com/keybase/client/go/kbfs/kbfsblock" 7 "github.com/keybase/client/go/kbfs/kbfscrypto" 8 "github.com/keybase/client/go/kbfs/tlf" 9 ) 10 11 // diskBlockCacheEntry packages an encoded block and serverHalf into one data 12 // structure, allowing us to encode it as one set of bytes. 13 type diskBlockCacheEntry struct { 14 Buf []byte 15 ServerHalf kbfscrypto.BlockCryptKeyServerHalf 16 } 17 18 // Wrap time.Time so that go-codec falls back to using 19 // time.Time.MarshalBinary instead of its new msgpack timestamp 20 // extension encoding. 21 type legacyEncodedTime struct { 22 time.Time 23 } 24 25 // DiskBlockCacheMetadata packages the metadata needed to make decisions on 26 // cache eviction. 27 type DiskBlockCacheMetadata struct { 28 // the TLF ID for the block 29 TlfID tlf.ID 30 // the last time the block was used 31 LRUTime legacyEncodedTime 32 // the size of the block 33 BlockSize uint32 34 // whether the block has triggered prefetches 35 // This used to be called "HasPrefetched" so to maintain compatibility with 36 // existing disk caches, we have to name it that in the codec tag. 37 TriggeredPrefetch bool `codec:"HasPrefetched"` 38 // whether the block's triggered prefetches are complete 39 FinishedPrefetch bool 40 // the last tag with which the block was marked 41 Tag string 42 } 43 44 // PrefetchStatus returns the overall prefetch status corresponding to 45 // this metadata. 46 func (dbcm DiskBlockCacheMetadata) PrefetchStatus() PrefetchStatus { 47 if dbcm.FinishedPrefetch { 48 return FinishedPrefetch 49 } else if dbcm.TriggeredPrefetch { 50 return TriggeredPrefetch 51 } 52 return NoPrefetch 53 } 54 55 // lruEntry is an entry for sorting LRU times 56 type lruEntry struct { 57 BlockID kbfsblock.ID 58 Time time.Time 59 } 60 61 type blockIDsByTime []lruEntry 62 63 func (b blockIDsByTime) Len() int { return len(b) } 64 func (b blockIDsByTime) Swap(i, j int) { b[i], b[j] = b[j], b[i] } 65 func (b blockIDsByTime) Less(i, j int) bool { return b[i].Time.Before(b[j].Time) } 66 67 func (b blockIDsByTime) ToBlockIDSlice(numBlocks int) []kbfsblock.ID { 68 ids := make([]kbfsblock.ID, 0, numBlocks) 69 for _, entry := range b { 70 if len(ids) == numBlocks { 71 return ids 72 } 73 ids = append(ids, entry.BlockID) 74 } 75 return ids 76 }