Skip to content

Commit ffb6c2a

Browse files
authored
refactor: optimize stream, link, and resource management (#486)
* refactor: optimize stream, link, and resource management * Link.MFile改为io.ReadSeeker类型 * fix (crypt): read on closed response body * chore * chore * chore
1 parent 8e19a0f commit ffb6c2a

File tree

26 files changed

+176
-271
lines changed

26 files changed

+176
-271
lines changed

drivers/alias/driver.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ func (d *Alias) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (
113113
for _, dst := range dsts {
114114
link, err := d.link(ctx, dst, sub, args)
115115
if err == nil {
116+
link.Expiration = nil // 去除非必要缓存,d.link里op.Lin有缓存
116117
if !args.Redirect && len(link.URL) > 0 {
117118
// 正常情况下 多并发 仅支持返回URL的驱动
118119
// alias套娃alias 可以让crypt、mega等驱动(不返回URL的) 支持并发

drivers/crypt/driver.go

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -254,58 +254,56 @@ func (d *Crypt) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (
254254
if remoteLink.RangeReadCloser == nil && remoteLink.MFile == nil && len(remoteLink.URL) == 0 {
255255
return nil, fmt.Errorf("the remote storage driver need to be enhanced to support encrytion")
256256
}
257+
resultRangeReadCloser := &model.RangeReadCloser{}
258+
resultRangeReadCloser.TryAdd(remoteLink.MFile)
259+
if remoteLink.RangeReadCloser != nil {
260+
resultRangeReadCloser.AddClosers(remoteLink.RangeReadCloser.GetClosers())
261+
}
257262
remoteFileSize := remoteFile.GetSize()
258-
remoteClosers := utils.EmptyClosers()
259263
rangeReaderFunc := func(ctx context.Context, underlyingOffset, underlyingLength int64) (io.ReadCloser, error) {
260264
length := underlyingLength
261265
if underlyingLength >= 0 && underlyingOffset+underlyingLength >= remoteFileSize {
262266
length = -1
263267
}
264-
rrc := remoteLink.RangeReadCloser
265-
if len(remoteLink.URL) > 0 {
266-
var converted, err = stream.GetRangeReadCloserFromLink(remoteFileSize, remoteLink)
268+
if remoteLink.MFile != nil {
269+
_, err := remoteLink.MFile.Seek(underlyingOffset, io.SeekStart)
267270
if err != nil {
268271
return nil, err
269272
}
270-
rrc = converted
273+
//keep reuse same MFile and close at last.
274+
return io.NopCloser(remoteLink.MFile), nil
271275
}
272-
if rrc != nil {
273-
remoteReader, err := rrc.RangeRead(ctx, http_range.Range{Start: underlyingOffset, Length: length})
274-
remoteClosers.AddClosers(rrc.GetClosers())
276+
rrc := remoteLink.RangeReadCloser
277+
if rrc == nil && len(remoteLink.URL) > 0 {
278+
var err error
279+
rrc, err = stream.GetRangeReadCloserFromLink(remoteFileSize, remoteLink)
275280
if err != nil {
276281
return nil, err
277282
}
278-
return remoteReader, nil
283+
resultRangeReadCloser.AddClosers(rrc.GetClosers())
284+
remoteLink.RangeReadCloser = rrc
279285
}
280-
if remoteLink.MFile != nil {
281-
_, err := remoteLink.MFile.Seek(underlyingOffset, io.SeekStart)
286+
if rrc != nil {
287+
remoteReader, err := rrc.RangeRead(ctx, http_range.Range{Start: underlyingOffset, Length: length})
282288
if err != nil {
283289
return nil, err
284290
}
285-
//keep reuse same MFile and close at last.
286-
remoteClosers.Add(remoteLink.MFile)
287-
return io.NopCloser(remoteLink.MFile), nil
291+
return remoteReader, nil
288292
}
289-
290293
return nil, errs.NotSupport
291294

292295
}
293-
resultRangeReader := func(ctx context.Context, httpRange http_range.Range) (io.ReadCloser, error) {
296+
resultRangeReadCloser.RangeReader = func(ctx context.Context, httpRange http_range.Range) (io.ReadCloser, error) {
294297
readSeeker, err := d.cipher.DecryptDataSeek(ctx, rangeReaderFunc, httpRange.Start, httpRange.Length)
295298
if err != nil {
296299
return nil, err
297300
}
298301
return readSeeker, nil
299302
}
300303

301-
resultRangeReadCloser := &model.RangeReadCloser{RangeReader: resultRangeReader, Closers: remoteClosers}
302-
resultLink := &model.Link{
304+
return &model.Link{
303305
RangeReadCloser: resultRangeReadCloser,
304-
Expiration: remoteLink.Expiration,
305-
}
306-
307-
return resultLink, nil
308-
306+
}, nil
309307
}
310308

311309
func (d *Crypt) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) error {

drivers/doubao/util.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -524,7 +524,6 @@ func (d *Doubao) UploadByMultipart(ctx context.Context, config *UploadConfig, fi
524524
if err != nil {
525525
return nil, fmt.Errorf("failed to cache file: %w", err)
526526
}
527-
defer tempFile.Close()
528527
up(10.0) // 更新进度
529528
// 设置并行上传
530529
threadG, uploadCtx := errgroup.NewGroupWithContext(ctx, d.uploadThread,

drivers/ftp/driver.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"github.com/OpenListTeam/OpenList/v4/internal/driver"
88
"github.com/OpenListTeam/OpenList/v4/internal/errs"
99
"github.com/OpenListTeam/OpenList/v4/internal/model"
10+
"github.com/OpenListTeam/OpenList/v4/internal/stream"
1011
"github.com/jlaffaye/ftp"
1112
)
1213

@@ -66,7 +67,11 @@ func (d *FTP) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*m
6667

6768
r := NewFileReader(d.conn, encode(file.GetPath(), d.Encoding), file.GetSize())
6869
link := &model.Link{
69-
MFile: r,
70+
MFile: &stream.RateLimitFile{
71+
File: r,
72+
Limiter: stream.ServerDownloadLimit,
73+
Ctx: ctx,
74+
},
7075
}
7176
return link, nil
7277
}

drivers/halalcloud/driver.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -256,9 +256,6 @@ func (d *HalalCloud) getLink(ctx context.Context, file model.Obj, args model.Lin
256256
if httpRange.Length >= 0 && httpRange.Start+httpRange.Length >= size {
257257
length = -1
258258
}
259-
if err != nil {
260-
return nil, fmt.Errorf("open download file failed: %w", err)
261-
}
262259
oo := &openObject{
263260
ctx: ctx,
264261
d: fileAddrs,

drivers/halalcloud/types.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,3 @@ type SteamFile struct {
9696
func (s *SteamFile) Read(p []byte) (n int, err error) {
9797
return s.file.Read(p)
9898
}
99-
100-
func (s *SteamFile) Close() error {
101-
return s.file.Close()
102-
}

drivers/local/driver.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ func (d *Local) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (
242242
}
243243
link.MFile = open
244244
} else {
245-
link.MFile = model.NewNopMFile(bytes.NewReader(buf.Bytes()))
245+
link.MFile = bytes.NewReader(buf.Bytes())
246246
//link.Header.Set("Content-Length", strconv.Itoa(buf.Len()))
247247
}
248248
} else {

drivers/mediatrack/driver.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,6 @@ func (d *MediaTrack) Put(ctx context.Context, dstDir model.Obj, file model.FileS
184184
if err != nil {
185185
return err
186186
}
187-
defer func() {
188-
_ = tempFile.Close()
189-
}()
190187
uploader := s3manager.NewUploader(s)
191188
if file.GetSize() > s3manager.MaxUploadParts*s3manager.DefaultUploadPartSize {
192189
uploader.PartSize = file.GetSize() / (s3manager.MaxUploadParts - 1)

drivers/netease_music/types.go

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package netease_music
22

33
import (
44
"context"
5-
"io"
65
"net/http"
76
"strconv"
87
"strings"
@@ -11,7 +10,6 @@ import (
1110
"github.com/OpenListTeam/OpenList/v4/internal/driver"
1211
"github.com/OpenListTeam/OpenList/v4/internal/model"
1312
"github.com/OpenListTeam/OpenList/v4/internal/sign"
14-
"github.com/OpenListTeam/OpenList/v4/pkg/http_range"
1513
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
1614
"github.com/OpenListTeam/OpenList/v4/pkg/utils/random"
1715
"github.com/OpenListTeam/OpenList/v4/server/common"
@@ -55,17 +53,8 @@ func (lrc *LyricObj) getProxyLink(ctx context.Context) *model.Link {
5553
}
5654

5755
func (lrc *LyricObj) getLyricLink() *model.Link {
58-
reader := strings.NewReader(lrc.lyric)
5956
return &model.Link{
60-
RangeReadCloser: &model.RangeReadCloser{
61-
RangeReader: func(ctx context.Context, httpRange http_range.Range) (io.ReadCloser, error) {
62-
if httpRange.Length < 0 {
63-
return io.NopCloser(reader), nil
64-
}
65-
sr := io.NewSectionReader(reader, httpRange.Start, httpRange.Length)
66-
return io.NopCloser(sr), nil
67-
},
68-
},
57+
MFile: strings.NewReader(lrc.lyric),
6958
}
7059
}
7160

drivers/sftp/driver.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/OpenListTeam/OpenList/v4/internal/driver"
99
"github.com/OpenListTeam/OpenList/v4/internal/errs"
1010
"github.com/OpenListTeam/OpenList/v4/internal/model"
11+
"github.com/OpenListTeam/OpenList/v4/internal/stream"
1112
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
1213
"github.com/pkg/sftp"
1314
log "github.com/sirupsen/logrus"
@@ -62,10 +63,13 @@ func (d *SFTP) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*
6263
if err != nil {
6364
return nil, err
6465
}
65-
link := &model.Link{
66-
MFile: remoteFile,
67-
}
68-
return link, nil
66+
return &model.Link{
67+
MFile: &stream.RateLimitFile{
68+
File: remoteFile,
69+
Limiter: stream.ServerDownloadLimit,
70+
Ctx: ctx,
71+
},
72+
}, nil
6973
}
7074

7175
func (d *SFTP) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) error {

0 commit comments

Comments
 (0)