github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/imageserver/scanner/api.go (about) 1 package scanner 2 3 import ( 4 "flag" 5 "io" 6 "sync" 7 "time" 8 9 "github.com/Cloud-Foundations/Dominator/lib/hash" 10 "github.com/Cloud-Foundations/Dominator/lib/image" 11 "github.com/Cloud-Foundations/Dominator/lib/log" 12 "github.com/Cloud-Foundations/Dominator/lib/objectserver" 13 "github.com/Cloud-Foundations/Dominator/lib/srpc" 14 "github.com/Cloud-Foundations/Dominator/lib/stringutil" 15 ) 16 17 // TODO: the types should probably be moved into a separate package, leaving 18 // behind the scanner code. 19 20 const metadataFile = ".metadata" 21 const unreferencedObjectsFile = ".unreferenced-objects" 22 23 var ( 24 imageServerMaxUnrefData = flag.Int64("imageServerMaxUnrefData", 0, 25 "maximum number of bytes of unreferenced objects before cleaning") 26 imageServerMaxUnrefAge = flag.Duration("imageServerMaxUnrefAge", 0, 27 "maximum age of unreferenced objects before cleaning") 28 ) 29 30 type notifiers map[<-chan string]chan<- string 31 type makeDirectoryNotifiers map[<-chan image.Directory]chan<- image.Directory 32 33 type ImageDataBase struct { 34 sync.RWMutex 35 // Protected by main lock. 36 baseDir string 37 directoryMap map[string]image.DirectoryMetadata 38 imageMap map[string]*image.Image 39 addNotifiers notifiers 40 deleteNotifiers notifiers 41 mkdirNotifiers makeDirectoryNotifiers 42 unreferencedObjects *unreferencedObjectsList 43 // Unprotected by main lock. 44 deduperLock sync.Mutex 45 deduper *stringutil.StringDeduplicator 46 pendingImageLock sync.Mutex 47 objectFetchLock sync.Mutex 48 // Unprotected by any lock. 49 objectServer objectserver.FullObjectServer 50 replicationMaster string 51 logger log.DebugLogger 52 } 53 54 func LoadImageDataBase(baseDir string, objSrv objectserver.FullObjectServer, 55 replicationMaster string, logger log.DebugLogger) (*ImageDataBase, error) { 56 return loadImageDataBase(baseDir, objSrv, replicationMaster, logger) 57 } 58 59 func (imdb *ImageDataBase) AddImage(image *image.Image, name string, 60 authInfo *srpc.AuthInformation) error { 61 return imdb.addImage(image, name, authInfo) 62 } 63 64 func (imdb *ImageDataBase) ChangeImageExpiration(name string, 65 expiresAt time.Time, authInfo *srpc.AuthInformation) (bool, error) { 66 return imdb.changeImageExpiration(name, expiresAt, authInfo) 67 } 68 69 func (imdb *ImageDataBase) CheckDirectory(name string) bool { 70 return imdb.checkDirectory(name) 71 } 72 73 func (imdb *ImageDataBase) CheckImage(name string) bool { 74 return imdb.checkImage(name) 75 } 76 77 func (imdb *ImageDataBase) ChownDirectory(dirname, ownerGroup string, 78 authInfo *srpc.AuthInformation) error { 79 return imdb.chownDirectory(dirname, ownerGroup, authInfo) 80 } 81 82 func (imdb *ImageDataBase) CountDirectories() uint { 83 return imdb.countDirectories() 84 } 85 86 func (imdb *ImageDataBase) CountImages() uint { 87 return imdb.countImages() 88 } 89 90 func (imdb *ImageDataBase) DeleteImage(name string, 91 authInfo *srpc.AuthInformation) error { 92 return imdb.deleteImage(name, authInfo) 93 } 94 95 // DeleteUnreferencedObjects will delete some or all unreferenced objects. 96 // Objects are randomly selected for deletion, until both the percentage and 97 // bytes thresholds are satisfied. 98 // If an image upload/replication is in process this operation is unsafe as it 99 // may delete objects that the new image will be using. 100 func (imdb *ImageDataBase) DeleteUnreferencedObjects(percentage uint8, 101 bytes uint64) error { 102 return imdb.deleteUnreferencedObjects(percentage, bytes) 103 } 104 105 func (imdb *ImageDataBase) DoWithPendingImage(image *image.Image, 106 doFunc func() error) error { 107 return imdb.doWithPendingImage(image, doFunc) 108 } 109 110 func (imdb *ImageDataBase) FindLatestImage(dirame string, 111 ignoreExpiring bool) (string, error) { 112 return imdb.findLatestImage(dirame, ignoreExpiring) 113 } 114 115 func (imdb *ImageDataBase) GetImage(name string) *image.Image { 116 return imdb.getImage(name) 117 } 118 119 func (imdb *ImageDataBase) GetUnreferencedObjectsStatistics() (uint64, uint64) { 120 return imdb.getUnreferencedObjectsStatistics() 121 } 122 123 func (imdb *ImageDataBase) ListDirectories() []image.Directory { 124 return imdb.listDirectories() 125 } 126 127 func (imdb *ImageDataBase) ListImages() []string { 128 return imdb.listImages() 129 } 130 131 // ListUnreferencedObjects will return a map listing all the objects and their 132 // corresponding sizes which are not referenced by an image. 133 // Note that some objects may have been recently added and the referencing image 134 // may not yet be present (i.e. it may be added after missing objects are 135 // uploaded). 136 func (imdb *ImageDataBase) ListUnreferencedObjects() map[hash.Hash]uint64 { 137 return imdb.listUnreferencedObjects() 138 } 139 140 func (imdb *ImageDataBase) MakeDirectory(dirname string, 141 authInfo *srpc.AuthInformation) error { 142 return imdb.makeDirectory(image.Directory{Name: dirname}, authInfo, true) 143 } 144 145 func (imdb *ImageDataBase) ObjectServer() objectserver.ObjectServer { 146 return imdb.objectServer 147 } 148 149 func (imdb *ImageDataBase) RegisterAddNotifier() <-chan string { 150 return imdb.registerAddNotifier() 151 } 152 153 func (imdb *ImageDataBase) RegisterDeleteNotifier() <-chan string { 154 return imdb.registerDeleteNotifier() 155 } 156 157 func (imdb *ImageDataBase) RegisterMakeDirectoryNotifier() <-chan image.Directory { 158 return imdb.registerMakeDirectoryNotifier() 159 } 160 161 func (imdb *ImageDataBase) UnregisterAddNotifier(channel <-chan string) { 162 imdb.unregisterAddNotifier(channel) 163 } 164 165 func (imdb *ImageDataBase) UnregisterDeleteNotifier(channel <-chan string) { 166 imdb.unregisterDeleteNotifier(channel) 167 } 168 169 func (imdb *ImageDataBase) UnregisterMakeDirectoryNotifier( 170 channel <-chan image.Directory) { 171 imdb.unregisterMakeDirectoryNotifier(channel) 172 } 173 174 func (imdb *ImageDataBase) UpdateDirectory(directory image.Directory) error { 175 return imdb.makeDirectory(directory, nil, false) 176 } 177 178 func (imdb *ImageDataBase) WriteHtml(writer io.Writer) { 179 imdb.writeHtml(writer) 180 }