github.com/Cloud-Foundations/Dominator@v0.3.4/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 rpcObj *rpcType 24 } 25 26 func (t *addObjectsHandlerType) AddObjects(conn *srpc.Conn) error { 27 defer t.scannerConfiguration.BoostCpuLimit(t.logger) 28 objSrv := &objectServer{t.objectsDir, t.rpcObj} 29 return lib.AddObjects(conn, conn, conn, objSrv, t.logger) 30 } 31 32 func (objSrv *objectServer) AddObject(reader io.Reader, length uint64, 33 expectedHash *hash.Hash) (hash.Hash, bool, error) { 34 hashVal, data, err := objectcache.ReadObject(reader, length, expectedHash) 35 if err != nil { 36 return hashVal, false, err 37 } 38 filename := path.Join(objSrv.baseDir, objectcache.HashToFilename(hashVal)) 39 objSrv.rpcObj.params.WorkdirGoroutine.Run(func() { 40 err = os.MkdirAll(path.Dir(filename), dirPerms) 41 if err != nil { 42 return 43 } 44 err = fsutil.CopyToFile(filename, filePerms, bytes.NewReader(data), 45 length) 46 }) 47 if err != nil { 48 return hashVal, false, err 49 } 50 return hashVal, true, nil 51 }