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 }