[#6] native: Factor put object upload code

Signed-off-by: Alex Vanin <alexey@nspcc.ru>
This commit is contained in:
Alex Vanin 2022-05-23 14:56:38 +03:00 committed by Alex Vanin
parent 2da51e4aa2
commit 0d1a5e4187

View file

@ -57,11 +57,9 @@ type (
} }
) )
func (c *Client) Put(inputContainerID string, headers map[string]string, payload goja.ArrayBuffer) PutResponse { const defaultPutBufferSize = 4 * 1024
rdr := bytes.NewReader(payload.Bytes())
sz := rdr.Size()
// preparation stage func (c *Client) Put(inputContainerID string, headers map[string]string, payload goja.ArrayBuffer) PutResponse {
var containerID cid.ID var containerID cid.ID
err := containerID.DecodeString(inputContainerID) err := containerID.DecodeString(inputContainerID)
if err != nil { if err != nil {
@ -95,43 +93,11 @@ func (c *Client) Put(inputContainerID string, headers map[string]string, payload
o.SetOwnerID(&owner) o.SetOwnerID(&owner)
o.SetAttributes(attrs...) o.SetAttributes(attrs...)
buf := make([]byte, 4*1024) resp, err := put(c.vu, defaultPutBufferSize, c.cli, &tok, &o, payload.Bytes())
// starting upload
stats.Report(c.vu, objPutTotal, 1)
start := time.Now()
objectWriter, err := c.cli.ObjectPutInit(c.vu.Context(), client.PrmObjectPutInit{})
if err != nil { if err != nil {
stats.Report(c.vu, objPutFails, 1)
return PutResponse{Success: false, Error: err.Error()} return PutResponse{Success: false, Error: err.Error()}
} }
objectWriter.WithinSession(tok)
if !objectWriter.WriteHeader(o) {
stats.Report(c.vu, objPutFails, 1)
_, err := objectWriter.Close()
return PutResponse{Success: false, Error: err.Error()}
}
n, _ := rdr.Read(buf)
for n > 0 {
if !objectWriter.WritePayloadChunk(buf[:n]) {
break
}
n, _ = rdr.Read(buf)
}
resp, err := objectWriter.Close()
if err != nil {
stats.Report(c.vu, objPutFails, 1)
return PutResponse{Success: false, Error: err.Error()}
}
stats.ReportDataSent(c.vu, float64(sz))
stats.Report(c.vu, objPutDuration, metrics.D(time.Since(start)))
var id oid.ID var id oid.ID
resp.ReadStoredObjectID(&id) resp.ReadStoredObjectID(&id)
@ -281,24 +247,38 @@ func (p PreparedObject) Put(headers map[string]string) PutResponse {
return PutResponse{Success: false, Error: err.Error()} return PutResponse{Success: false, Error: err.Error()}
} }
buf := make([]byte, 4*1024) _, err = put(p.vu, defaultPutBufferSize, p.cli, nil, &obj, p.payload)
rdr := bytes.NewReader(p.payload)
// starting upload
// TODO(alexvanin): factor uploading code of Put() methods
stats.Report(p.vu, objPutTotal, 1)
start := time.Now()
objectWriter, err := p.cli.ObjectPutInit(p.vu.Context(), client.PrmObjectPutInit{})
if err != nil { if err != nil {
stats.Report(p.vu, objPutFails, 1)
return PutResponse{Success: false, Error: err.Error()} return PutResponse{Success: false, Error: err.Error()}
} }
if !objectWriter.WriteHeader(obj) { return PutResponse{Success: true, ObjectID: id.String()}
stats.Report(p.vu, objPutFails, 1) }
_, err := objectWriter.Close()
return PutResponse{Success: false, Error: err.Error()} func put(vu modules.VU, bufSize int, cli *client.Client, tok *session.Object,
hdr *object.Object, payload []byte) (*client.ResObjectPut, error) {
buf := make([]byte, bufSize)
rdr := bytes.NewReader(payload)
sz := rdr.Size()
// starting upload
stats.Report(vu, objPutTotal, 1)
start := time.Now()
objectWriter, err := cli.ObjectPutInit(vu.Context(), client.PrmObjectPutInit{})
if err != nil {
stats.Report(vu, objPutFails, 1)
return nil, err
}
if tok != nil {
objectWriter.WithinSession(*tok)
}
if !objectWriter.WriteHeader(*hdr) {
stats.Report(vu, objPutFails, 1)
_, err = objectWriter.Close()
return nil, err
} }
n, _ := rdr.Read(buf) n, _ := rdr.Read(buf)
@ -309,16 +289,16 @@ func (p PreparedObject) Put(headers map[string]string) PutResponse {
n, _ = rdr.Read(buf) n, _ = rdr.Read(buf)
} }
_, err = objectWriter.Close() resp, err := objectWriter.Close()
if err != nil { if err != nil {
stats.Report(p.vu, objPutFails, 1) stats.Report(vu, objPutFails, 1)
return PutResponse{Success: false, Error: err.Error()} return nil, err
} }
stats.ReportDataSent(p.vu, float64(obj.PayloadSize())) stats.ReportDataSent(vu, float64(sz))
stats.Report(p.vu, objPutDuration, metrics.D(time.Since(start))) stats.Report(vu, objPutDuration, metrics.D(time.Since(start)))
return PutResponse{Success: true, ObjectID: id.String()} return resp, err
} }
func parseNetworkInfo(ctx context.Context, cli *client.Client) (maxObjSize, epoch uint64, hhDisabled bool, err error) { func parseNetworkInfo(ctx context.Context, cli *client.Client) (maxObjSize, epoch uint64, hhDisabled bool, err error) {