perf(ftp): non use SIZE FTP command (close #5150)

This commit is contained in:
Andy Hsu 2023-09-03 18:47:32 +08:00
parent 8e40465e86
commit f6ab1f7f61
2 changed files with 19 additions and 24 deletions

View File

@ -64,7 +64,7 @@ func (d *FTP) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*m
return nil, err return nil, err
} }
r := NewFTPFileReader(d.conn, file.GetPath()) r := NewFileReader(d.conn, file.GetPath(), file.GetSize())
link := &model.Link{ link := &model.Link{
MFile: r, MFile: r,
} }

View File

@ -4,6 +4,7 @@ import (
"io" "io"
"os" "os"
"sync" "sync"
"sync/atomic"
"time" "time"
"github.com/jlaffaye/ftp" "github.com/jlaffaye/ftp"
@ -30,31 +31,32 @@ func (d *FTP) login() error {
return nil return nil
} }
// An FTP file reader that implements io.MFile for seeking. // FileReader An FTP file reader that implements io.MFile for seeking.
type FTPFileReader struct { type FileReader struct {
conn *ftp.ServerConn conn *ftp.ServerConn
resp *ftp.Response resp *ftp.Response
offset int64 offset atomic.Int64
readAtOffset int64 readAtOffset int64
mu sync.Mutex mu sync.Mutex
path string path string
size int64
} }
func NewFTPFileReader(conn *ftp.ServerConn, path string) *FTPFileReader { func NewFileReader(conn *ftp.ServerConn, path string, size int64) *FileReader {
return &FTPFileReader{ return &FileReader{
conn: conn, conn: conn,
path: path, path: path,
size: size,
} }
} }
func (r *FTPFileReader) Read(buf []byte) (n int, err error) { func (r *FileReader) Read(buf []byte) (n int, err error) {
n, err = r.ReadAt(buf, r.offset) n, err = r.ReadAt(buf, r.offset.Load())
r.mu.Lock() r.offset.Add(int64(n))
defer r.mu.Unlock()
r.offset += int64(n)
return return
} }
func (r *FTPFileReader) ReadAt(buf []byte, off int64) (n int, err error) {
func (r *FileReader) ReadAt(buf []byte, off int64) (n int, err error) {
if off < 0 { if off < 0 {
return -1, os.ErrInvalid return -1, os.ErrInvalid
} }
@ -80,11 +82,8 @@ func (r *FTPFileReader) ReadAt(buf []byte, off int64) (n int, err error) {
return return
} }
func (r *FTPFileReader) Seek(offset int64, whence int) (int64, error) { func (r *FileReader) Seek(offset int64, whence int) (int64, error) {
r.mu.Lock() oldOffset := r.offset.Load()
defer r.mu.Unlock()
oldOffset := r.offset
var newOffset int64 var newOffset int64
switch whence { switch whence {
case io.SeekStart: case io.SeekStart:
@ -92,11 +91,7 @@ func (r *FTPFileReader) Seek(offset int64, whence int) (int64, error) {
case io.SeekCurrent: case io.SeekCurrent:
newOffset = oldOffset + offset newOffset = oldOffset + offset
case io.SeekEnd: case io.SeekEnd:
size, err := r.conn.FileSize(r.path) return r.size, nil
if err != nil {
return oldOffset, err
}
newOffset = offset + int64(size)
default: default:
return -1, os.ErrInvalid return -1, os.ErrInvalid
} }
@ -109,11 +104,11 @@ func (r *FTPFileReader) Seek(offset int64, whence int) (int64, error) {
// offset not changed, so return directly // offset not changed, so return directly
return oldOffset, nil return oldOffset, nil
} }
r.offset = newOffset r.offset.Store(newOffset)
return newOffset, nil return newOffset, nil
} }
func (r *FTPFileReader) Close() error { func (r *FileReader) Close() error {
if r.resp != nil { if r.resp != nil {
return r.resp.Close() return r.resp.Close()
} }