Skip to content

Commit 657ab14

Browse files
committed
fix sca again
1 parent e23842f commit 657ab14

File tree

3 files changed

+45
-38
lines changed

3 files changed

+45
-38
lines changed

pkg/fileservice/parallel_sdk_test.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ package fileservice
1717
import (
1818
"bytes"
1919
"context"
20-
"encoding/xml"
2120
"fmt"
2221
"io"
2322
"net/http"
@@ -295,11 +294,6 @@ func TestAwsMultipartCreateFail(t *testing.T) {
295294
}
296295
}
297296

298-
type qcloudResult struct {
299-
XMLName xml.Name `xml:"InitiateMultipartUploadResult"`
300-
UploadID string `xml:"UploadId"`
301-
}
302-
303297
func newMockCOSServer(t *testing.T, failPart int) (*httptest.Server, *cosServerState) {
304298
t.Helper()
305299
state := &cosServerState{

pkg/fileservice/parallel_upload_test.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ func TestNormalizeParallelOption(t *testing.T) {
6969
}
7070

7171
for _, c := range cases {
72-
c := c
7372
t.Run(c.name, func(t *testing.T) {
7473
res := normalizeParallelOption(c.opt)
7574
if res.PartSize != c.expectSize {

pkg/fileservice/qcloud_sdk.go

Lines changed: 45 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)