@@ -312,29 +312,31 @@ func (a *QCloudSDK) WriteMultipartParallel(
312312
313313 bufPool := sync.Pool {
314314 New : func () any {
315- return make ([]byte , options .PartSize )
315+ buf := make ([]byte , options .PartSize )
316+ return & buf
316317 },
317318 }
318319
319- readChunk := func () (buf []byte , n int , err error ) {
320- raw := bufPool .Get ().([]byte )
320+ readChunk := func () (bufPtr * []byte , buf []byte , n int , err error ) {
321+ bufPtr = bufPool .Get ().(* []byte )
322+ raw := * bufPtr
321323 n , err = io .ReadFull (r , raw )
322324 switch {
323325 case errors .Is (err , io .EOF ):
324- bufPool .Put (raw )
325- return nil , 0 , io .EOF
326+ bufPool .Put (bufPtr )
327+ return nil , nil , 0 , io .EOF
326328 case errors .Is (err , io .ErrUnexpectedEOF ):
327329 err = io .EOF
328- return raw , n , err
330+ return bufPtr , raw , n , err
329331 case err != nil :
330- bufPool .Put (raw )
331- return nil , 0 , err
332+ bufPool .Put (bufPtr )
333+ return nil , nil , 0 , err
332334 default :
333- return raw , n , nil
335+ return bufPtr , raw , n , nil
334336 }
335337 }
336338
337- firstBuf , firstN , err := readChunk ()
339+ firstBufPtr , firstBuf , firstN , err := readChunk ()
338340 if err != nil && ! errors .Is (err , io .EOF ) {
339341 return err
340342 }
@@ -344,7 +346,7 @@ func (a *QCloudSDK) WriteMultipartParallel(
344346 if errors .Is (err , io .EOF ) && int64 (firstN ) < minMultipartPartSize {
345347 data := make ([]byte , firstN )
346348 copy (data , firstBuf [:firstN ])
347- bufPool .Put (firstBuf )
349+ bufPool .Put (firstBufPtr )
348350 size := int64 (firstN )
349351 return a .Write (ctx , key , bytes .NewReader (data ), & size , options .Expire )
350352 }
@@ -364,7 +366,7 @@ func (a *QCloudSDK) WriteMultipartParallel(
364366 return res , e
365367 }, maxRetryAttemps , IsRetryableError )
366368 if createErr != nil {
367- bufPool .Put (firstBuf )
369+ bufPool .Put (firstBufPtr )
368370 return createErr
369371 }
370372
@@ -375,9 +377,10 @@ func (a *QCloudSDK) WriteMultipartParallel(
375377 }()
376378
377379 type partJob struct {
378- num int32
379- buf []byte
380- n int
380+ num int32
381+ buf []byte
382+ bufPtr * []byte
383+ n int
381384 }
382385
383386 var (
@@ -407,7 +410,9 @@ func (a *QCloudSDK) WriteMultipartParallel(
407410 defer wg .Done ()
408411 for job := range jobCh {
409412 if ctx .Err () != nil {
410- bufPool .Put (job .buf )
413+ if job .bufPtr != nil {
414+ bufPool .Put (job .bufPtr )
415+ }
411416 continue
412417 }
413418 uploadOpt := & cos.ObjectUploadPartOptions {
@@ -418,14 +423,18 @@ func (a *QCloudSDK) WriteMultipartParallel(
418423 }, maxRetryAttemps , IsRetryableError )
419424 if uploadErr != nil {
420425 setErr (uploadErr )
421- bufPool .Put (job .buf )
426+ if job .bufPtr != nil {
427+ bufPool .Put (job .bufPtr )
428+ }
422429 continue
423430 }
424431 etag := ""
425432 if resp != nil && resp .Header != nil {
426433 etag = resp .Header .Get ("ETag" )
427434 }
428- bufPool .Put (job .buf )
435+ if job .bufPtr != nil {
436+ bufPool .Put (job .bufPtr )
437+ }
429438 partsLock .Lock ()
430439 parts = append (parts , cos.Object {
431440 PartNumber : int (job .num ),
@@ -443,29 +452,34 @@ func (a *QCloudSDK) WriteMultipartParallel(
443452 }
444453 }
445454
446- sendJob := func (buf []byte , n int ) bool {
455+ sendJob := func (bufPtr * [] byte , buf []byte , n int ) bool {
447456 partNum ++
448457 if partNum > maxMultipartParts {
449458 setErr (moerr .NewInternalErrorNoCtxf ("too many parts for multipart upload: %d" , partNum ))
450- bufPool .Put (buf )
459+ if bufPtr != nil {
460+ bufPool .Put (bufPtr )
461+ }
451462 return false
452463 }
453464 job := partJob {
454- num : partNum ,
455- buf : buf ,
456- n : n ,
465+ num : partNum ,
466+ buf : buf ,
467+ bufPtr : bufPtr ,
468+ n : n ,
457469 }
458470 select {
459471 case jobCh <- job :
460472 return true
461473 case <- ctx .Done ():
462- bufPool .Put (buf )
474+ if bufPtr != nil {
475+ bufPool .Put (bufPtr )
476+ }
463477 setErr (ctx .Err ())
464478 return false
465479 }
466480 }
467481
468- if ! sendJob (firstBuf , firstN ) {
482+ if ! sendJob (firstBufPtr , firstBuf , firstN ) {
469483 close (jobCh )
470484 wg .Wait ()
471485 if firstErr != nil {
@@ -475,24 +489,24 @@ func (a *QCloudSDK) WriteMultipartParallel(
475489 }
476490
477491 for {
478- nextBuf , nextN , readErr := readChunk ()
492+ nextBufPtr , nextBuf , nextN , readErr := readChunk ()
479493 if errors .Is (readErr , io .EOF ) && nextN == 0 {
480494 break
481495 }
482496 if readErr != nil && ! errors .Is (readErr , io .EOF ) {
483497 setErr (readErr )
484- if nextBuf != nil {
485- bufPool .Put (nextBuf )
498+ if nextBufPtr != nil {
499+ bufPool .Put (nextBufPtr )
486500 }
487501 break
488502 }
489503 if nextN == 0 {
490- if nextBuf != nil {
491- bufPool .Put (nextBuf )
504+ if nextBufPtr != nil {
505+ bufPool .Put (nextBufPtr )
492506 }
493507 break
494508 }
495- if ! sendJob (nextBuf , nextN ) {
509+ if ! sendJob (nextBufPtr , nextBuf , nextN ) {
496510 break
497511 }
498512 if readErr != nil && errors .Is (readErr , io .EOF ) {
0 commit comments