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  }