perf(baidu_netdisk): optimize memory allocate

pull/4797/head
Andy Hsu 2023-07-29 17:12:43 +08:00
parent e700ce15e5
commit b12d92acc9
2 changed files with 7 additions and 20 deletions

View File

@ -1,7 +1,6 @@
package baidu_netdisk package baidu_netdisk
import ( import (
"bytes"
"context" "context"
"crypto/md5" "crypto/md5"
"encoding/hex" "encoding/hex"
@ -118,7 +117,6 @@ func (d *BaiduNetdisk) Put(ctx context.Context, dstDir model.Obj, stream model.F
_ = os.Remove(tempFile.Name()) _ = os.Remove(tempFile.Name())
}() }()
var Default int64 = 4 * 1024 * 1024 var Default int64 = 4 * 1024 * 1024
defaultByteData := make([]byte, Default)
count := int(math.Ceil(float64(stream.GetSize()) / float64(Default))) count := int(math.Ceil(float64(stream.GetSize()) / float64(Default)))
var SliceSize int64 = 256 * 1024 var SliceSize int64 = 256 * 1024
// cal md5 // cal md5
@ -130,20 +128,14 @@ func (d *BaiduNetdisk) Put(ctx context.Context, dstDir model.Obj, stream model.F
left := stream.GetSize() left := stream.GetSize()
for i := 0; i < count; i++ { for i := 0; i < count; i++ {
byteSize := Default byteSize := Default
var byteData []byte
if left < Default { if left < Default {
byteSize = left byteSize = left
byteData = make([]byte, byteSize)
} else {
byteData = defaultByteData
} }
left -= byteSize left -= byteSize
_, err = io.ReadFull(tempFile, byteData) _, err = io.Copy(io.MultiWriter(h1, h2), io.LimitReader(tempFile, byteSize))
if err != nil { if err != nil {
return err return err
} }
h1.Write(byteData)
h2.Write(byteData)
block_list = append(block_list, fmt.Sprintf("\"%s\"", hex.EncodeToString(h2.Sum(nil)))) block_list = append(block_list, fmt.Sprintf("\"%s\"", hex.EncodeToString(h2.Sum(nil))))
h2.Reset() h2.Reset()
} }
@ -177,6 +169,7 @@ func (d *BaiduNetdisk) Put(ctx context.Context, dstDir model.Obj, stream model.F
params := map[string]string{ params := map[string]string{
"method": "precreate", "method": "precreate",
} }
log.Debugf("[baidu_netdisk] precreate data: %s", data)
var precreateResp PrecreateResp var precreateResp PrecreateResp
_, err = d.post("/xpan/file", params, data, &precreateResp) _, err = d.post("/xpan/file", params, data, &precreateResp)
if err != nil { if err != nil {
@ -199,24 +192,16 @@ func (d *BaiduNetdisk) Put(ctx context.Context, dstDir model.Obj, stream model.F
return ctx.Err() return ctx.Err()
} }
byteSize := Default byteSize := Default
var byteData []byte
if left < Default { if left < Default {
byteSize = left byteSize = left
byteData = make([]byte, byteSize)
} else {
byteData = defaultByteData
} }
left -= byteSize left -= byteSize
_, err = io.ReadFull(tempFile, byteData)
if err != nil {
return err
}
u := "https://d.pcs.baidu.com/rest/2.0/pcs/superfile2" u := "https://d.pcs.baidu.com/rest/2.0/pcs/superfile2"
params["partseq"] = strconv.Itoa(partseq) params["partseq"] = strconv.Itoa(partseq)
res, err := base.RestyClient.R(). res, err := base.RestyClient.R().
SetContext(ctx). SetContext(ctx).
SetQueryParams(params). SetQueryParams(params).
SetFileReader("file", stream.GetName(), bytes.NewReader(byteData)). SetFileReader("file", stream.GetName(), io.LimitReader(tempFile, byteSize)).
Post(u) Post(u)
if err != nil { if err != nil {
return err return err

View File

@ -13,6 +13,7 @@ import (
"github.com/alist-org/alist/v3/internal/op" "github.com/alist-org/alist/v3/internal/op"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/alist-org/alist/v3/pkg/utils"
"github.com/go-resty/resty/v2" "github.com/go-resty/resty/v2"
log "github.com/sirupsen/logrus"
) )
// do others that not defined in Driver interface // do others that not defined in Driver interface
@ -62,16 +63,17 @@ func (d *BaiduNetdisk) request(furl string, method string, callback base.ReqCall
if err != nil { if err != nil {
return nil, err return nil, err
} }
log.Debugf("[baidu_netdisk] req: %s, resp: %s", furl, res.String())
errno := utils.Json.Get(res.Body(), "errno").ToInt() errno := utils.Json.Get(res.Body(), "errno").ToInt()
if errno != 0 { if errno != 0 {
if errno == -6 { if utils.SliceContains([]int{111, -6}, errno) {
err = d.refreshToken() err = d.refreshToken()
if err != nil { if err != nil {
return nil, err return nil, err
} }
return d.request(furl, method, callback, resp) return d.request(furl, method, callback, resp)
} }
return nil, fmt.Errorf("errno: %d, refer to https://pan.baidu.com/union/doc/", errno) return nil, fmt.Errorf("req: [%s] ,errno: %d, refer to https://pan.baidu.com/union/doc/", furl, errno)
} }
return res.Body(), nil return res.Body(), nil
} }