github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/sub/rpcd/addObjects.go (about) 1 package rpcd 2 3 import ( 4 "bytes" 5 "io" 6 "os" 7 "path" 8 "syscall" 9 10 "github.com/Cloud-Foundations/Dominator/lib/fsutil" 11 "github.com/Cloud-Foundations/Dominator/lib/hash" 12 "github.com/Cloud-Foundations/Dominator/lib/objectcache" 13 "github.com/Cloud-Foundations/Dominator/lib/srpc" 14 "github.com/Cloud-Foundations/Dominator/objectserver/rpcd/lib" 15 ) 16 17 const ( 18 dirPerms = syscall.S_IRWXU 19 ) 20 21 type objectServer struct { 22 baseDir string 23 } 24 25 func (t *addObjectsHandlerType) AddObjects(conn *srpc.Conn) error { 26 defer t.scannerConfiguration.BoostCpuLimit(t.logger) 27 objSrv := &objectServer{t.objectsDir} 28 return lib.AddObjects(conn, conn, conn, objSrv, t.logger) 29 } 30 31 func (objSrv *objectServer) AddObject(reader io.Reader, length uint64, 32 expectedHash *hash.Hash) (hash.Hash, bool, error) { 33 hashVal, data, err := objectcache.ReadObject(reader, length, expectedHash) 34 if err != nil { 35 return hashVal, false, err 36 } 37 filename := path.Join(objSrv.baseDir, objectcache.HashToFilename(hashVal)) 38 if err = os.MkdirAll(path.Dir(filename), dirPerms); err != nil { 39 return hashVal, false, err 40 } 41 if err := fsutil.CopyToFile(filename, filePerms, bytes.NewReader(data), 42 length); err != nil { 43 return hashVal, false, err 44 } 45 return hashVal, true, nil 46 }