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  }