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  }