github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/kbfs/libkbfs/dir_block_map_disk.go (about) 1 // Copyright 2019 Keybase Inc. All rights reserved. 2 // Use of this source code is governed by a BSD 3 // license that can be found in the LICENSE file. 4 5 package libkbfs 6 7 import ( 8 "context" 9 10 "github.com/keybase/client/go/kbfs/data" 11 "github.com/keybase/client/go/kbfs/libkey" 12 "github.com/pkg/errors" 13 ) 14 15 // dirBlockMapDisk tracks dir block info while making a revision, by 16 // using a disk-based block cache. 17 type dirBlockMapDisk struct { 18 dirtyBcache *DirtyBlockCacheDisk 19 kmd libkey.KeyMetadata 20 ptrs map[data.BlockPointer]bool 21 } 22 23 var _ dirBlockMap = (*dirBlockMapDisk)(nil) 24 25 func newDirBlockMapDisk( 26 dirtyBcache *DirtyBlockCacheDisk, kmd libkey.KeyMetadata) *dirBlockMapDisk { 27 return &dirBlockMapDisk{ 28 dirtyBcache: dirtyBcache, 29 kmd: kmd, 30 ptrs: make(map[data.BlockPointer]bool), 31 } 32 } 33 34 func (dbmd *dirBlockMapDisk) putBlock( 35 ctx context.Context, ptr data.BlockPointer, block *data.DirBlock) error { 36 err := dbmd.dirtyBcache.Put( 37 ctx, dbmd.kmd.TlfID(), ptr, data.MasterBranch, block) 38 if err != nil { 39 return err 40 } 41 42 dbmd.ptrs[ptr] = true 43 return nil 44 } 45 46 func (dbmd *dirBlockMapDisk) getBlock( 47 ctx context.Context, ptr data.BlockPointer) (*data.DirBlock, error) { 48 if !dbmd.ptrs[ptr] { 49 return nil, errors.Errorf("No such block %s", ptr) 50 } 51 block, err := dbmd.dirtyBcache.Get(ctx, dbmd.kmd.TlfID(), ptr, data.MasterBranch) 52 if err != nil { 53 return nil, err 54 } 55 dblock, ok := block.(*data.DirBlock) 56 if !ok { 57 return nil, errors.Errorf( 58 "Unexpected block type for dir block: %T", block) 59 } 60 return dblock, nil 61 } 62 63 func (dbmd *dirBlockMapDisk) hasBlock( 64 _ context.Context, ptr data.BlockPointer) (bool, error) { 65 return dbmd.ptrs[ptr], nil 66 } 67 68 func (dbmd *dirBlockMapDisk) deleteBlock( 69 _ context.Context, ptr data.BlockPointer) error { 70 delete(dbmd.ptrs, ptr) 71 return nil 72 } 73 74 // numBlocks only tracks the blocks that have been put into the dirty 75 // block cache since `dbdm` was constructed. 76 func (dbmd *dirBlockMapDisk) numBlocks() int { 77 return len(dbmd.ptrs) 78 }