github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/lib/objectserver/filesystem/api.go (about)

     1  package filesystem
     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/log"
    11  	"github.com/Cloud-Foundations/Dominator/lib/objectserver"
    12  )
    13  
    14  var (
    15  	objectServerCleanupStartPercent = flag.Int(
    16  		"objectServerCleanupStartPercent", 95, "")
    17  	objectServerCleanupStopPercent = flag.Int("objectServerCleanupStopPercent",
    18  		90, "")
    19  )
    20  
    21  type ObjectServer struct {
    22  	baseDir               string
    23  	addCallback           objectserver.AddCallback
    24  	gc                    objectserver.GarbageCollector
    25  	logger                log.Logger
    26  	rwLock                sync.RWMutex         // Protect the following fields.
    27  	sizesMap              map[hash.Hash]uint64 // Only set if object is known.
    28  	lastGarbageCollection time.Time
    29  	lastMutationTime      time.Time
    30  }
    31  
    32  func NewObjectServer(baseDir string, logger log.Logger) (
    33  	*ObjectServer, error) {
    34  	return newObjectServer(baseDir, logger)
    35  }
    36  
    37  // AddObject will add an object. Object data are read from reader (length bytes
    38  // are read). The object hash is computed and compared with expectedHash if not
    39  // nil. The following are returned:
    40  //   computed hash value
    41  //   a boolean which is true if the object is new
    42  //   an error or nil if no error.
    43  func (objSrv *ObjectServer) AddObject(reader io.Reader, length uint64,
    44  	expectedHash *hash.Hash) (hash.Hash, bool, error) {
    45  	return objSrv.addObject(reader, length, expectedHash)
    46  }
    47  
    48  func (objSrv *ObjectServer) CheckObjects(hashes []hash.Hash) ([]uint64, error) {
    49  	return objSrv.checkObjects(hashes)
    50  }
    51  
    52  // CommitObject will commit (add) a previously stashed object.
    53  func (objSrv *ObjectServer) CommitObject(hashVal hash.Hash) error {
    54  	return objSrv.commitObject(hashVal)
    55  }
    56  
    57  func (objSrv *ObjectServer) DeleteObject(hashVal hash.Hash) error {
    58  	return objSrv.deleteObject(hashVal)
    59  }
    60  
    61  func (objSrv *ObjectServer) DeleteStashedObject(hashVal hash.Hash) error {
    62  	return objSrv.deleteStashedObject(hashVal)
    63  }
    64  
    65  func (objSrv *ObjectServer) SetAddCallback(callback objectserver.AddCallback) {
    66  	objSrv.addCallback = callback
    67  }
    68  
    69  func (objSrv *ObjectServer) SetGarbageCollector(
    70  	gc objectserver.GarbageCollector) {
    71  	objSrv.gc = gc
    72  }
    73  
    74  func (objSrv *ObjectServer) GetObject(hashVal hash.Hash) (
    75  	uint64, io.ReadCloser, error) {
    76  	return objectserver.GetObject(objSrv, hashVal)
    77  }
    78  
    79  func (objSrv *ObjectServer) GetObjects(hashes []hash.Hash) (
    80  	objectserver.ObjectsReader, error) {
    81  	return objSrv.getObjects(hashes)
    82  }
    83  
    84  func (objSrv *ObjectServer) LastMutationTime() time.Time {
    85  	objSrv.rwLock.RLock()
    86  	defer objSrv.rwLock.RUnlock()
    87  	return objSrv.lastMutationTime
    88  }
    89  
    90  func (objSrv *ObjectServer) ListObjectSizes() map[hash.Hash]uint64 {
    91  	return objSrv.listObjectSizes()
    92  }
    93  
    94  func (objSrv *ObjectServer) ListObjects() []hash.Hash {
    95  	return objSrv.listObjects()
    96  }
    97  
    98  func (objSrv *ObjectServer) NumObjects() uint64 {
    99  	objSrv.rwLock.RLock()
   100  	defer objSrv.rwLock.RUnlock()
   101  	return uint64(len(objSrv.sizesMap))
   102  }
   103  
   104  // StashOrVerifyObject will stash an object if it is new or it will verify if it
   105  // already exists. Object data are read from reader (length bytes are read). The
   106  // object hash is computed and compared with expectedHash if not nil.
   107  // The following are returned:
   108  //   computed hash value
   109  //   the object data if the object is new, otherwise nil
   110  //   an error or nil if no error.
   111  func (objSrv *ObjectServer) StashOrVerifyObject(reader io.Reader,
   112  	length uint64, expectedHash *hash.Hash) (hash.Hash, []byte, error) {
   113  	return objSrv.stashOrVerifyObject(reader, length, expectedHash)
   114  }
   115  
   116  func (objSrv *ObjectServer) WriteHtml(writer io.Writer) {
   117  	objSrv.writeHtml(writer)
   118  }
   119  
   120  type ObjectsReader struct {
   121  	objectServer *ObjectServer
   122  	hashes       []hash.Hash
   123  	nextIndex    int64
   124  	sizes        []uint64
   125  }
   126  
   127  func (or *ObjectsReader) Close() error {
   128  	return nil
   129  }
   130  
   131  func (or *ObjectsReader) NextObject() (uint64, io.ReadCloser, error) {
   132  	return or.nextObject()
   133  }
   134  
   135  func (or *ObjectsReader) ObjectSizes() []uint64 {
   136  	return or.sizes
   137  }