Skip to content

Commit 50b55dd

Browse files
committed
fix(fs): Fix concurrent race conditions, optimize segment upload status updates and temporary file processing
1 parent f4056db commit 50b55dd

File tree

3 files changed

+41
-13
lines changed

3 files changed

+41
-13
lines changed

drivers/123_open/driver.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ func (d *Open123) Put(ctx context.Context, dstDir model.Obj, file model.FileStre
225225
}
226226

227227
// Preup 预上传
228-
func (d *Open123) Preup(c context.Context, srcobj model.Obj, req *reqres.PreupReq) (*model.PreupInfo, error) {
228+
func (d *Open123) Preup(ctx context.Context, srcobj model.Obj, req *reqres.PreupReq) (*model.PreupInfo, error) {
229229
pid, err := strconv.ParseUint(srcobj.GetID(), 10, 64)
230230
if err != nil {
231231
return nil, err
@@ -256,8 +256,11 @@ func (d *Open123) Preup(c context.Context, srcobj model.Obj, req *reqres.PreupRe
256256
}
257257

258258
// UploadSlice 上传分片
259-
func (d *Open123) SliceUpload(c context.Context, req *tables.SliceUpload, sliceno uint, fd io.Reader) error {
259+
func (d *Open123) SliceUpload(ctx context.Context, req *tables.SliceUpload, sliceno uint, fd io.Reader) error {
260260
sh := strings.Split(req.SliceHash, ",")
261+
if int(sliceno) >= len(sh) {
262+
return fmt.Errorf("slice number %d out of range, total slices: %d", sliceno, len(sh))
263+
}
261264
r := &UploadSliceReq{
262265
Name: req.Name,
263266
PreuploadID: req.PreupID,
@@ -270,7 +273,7 @@ func (d *Open123) SliceUpload(c context.Context, req *tables.SliceUpload, slicen
270273
}
271274

272275
// UploadSliceComplete 分片上传完成
273-
func (d *Open123) UploadSliceComplete(c context.Context, su *tables.SliceUpload) error {
276+
func (d *Open123) UploadSliceComplete(ctx context.Context, su *tables.SliceUpload) error {
274277

275278
return d.sliceUpComplete(su.PreupID)
276279
}

drivers/baidu_netdisk/driver.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import (
1818
"github.com/OpenListTeam/OpenList/v4/drivers/base"
1919
"github.com/OpenListTeam/OpenList/v4/internal/conf"
2020
"github.com/OpenListTeam/OpenList/v4/internal/driver"
21-
"github.com/OpenListTeam/OpenList/v4/internal/errs"
21+
"github.com/OpenListTeam/OpenList/ err := d.uploadSlice(ctx, map[string]string{4/internal/errs"
2222
"github.com/OpenListTeam/OpenList/v4/internal/model"
2323
"github.com/OpenListTeam/OpenList/v4/internal/model/reqres"
2424
"github.com/OpenListTeam/OpenList/v4/internal/model/tables"
@@ -378,7 +378,7 @@ func (d *BaiduNetdisk) uploadSlice(ctx context.Context, params map[string]string
378378
}
379379

380380
// SliceUpload 上传分片
381-
func (d *BaiduNetdisk) SliceUpload(c context.Context, req *tables.SliceUpload, sliceno uint, fd io.Reader) error {
381+
func (d *BaiduNetdisk) SliceUpload(ctx context.Context, req *tables.SliceUpload, sliceno uint, fd io.Reader) error {
382382
fp := filepath.Join(req.DstPath, req.Name)
383383
if sliceno == 0 { //第一个分片需要先执行预上传
384384
rtype := 1

internal/fs/fs.go

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -328,11 +328,14 @@ func UploadSlice(ctx context.Context, storage driver.Driver, req *reqres.UploadS
328328
var msu *sliceup
329329
var err error
330330

331-
sa, ok := sliceupMap.Load(req.UploadID)
332-
if !ok {
331+
// 使用 LoadOrStore 避免并发竞态条件
332+
sa, loaded := sliceupMap.LoadOrStore(req.UploadID, nil)
333+
if !loaded {
334+
// 首次加载,需要从数据库获取
333335
su, e := db.GetSliceUpload(map[string]any{"id": req.UploadID})
334336
if e != nil {
335337
log.Errorf("failed get slice upload [%d]: %+v", req.UploadID, e)
338+
sliceupMap.Delete(req.UploadID) // 清理无效的 key
336339
return e
337340
}
338341
msu = &sliceup{
@@ -346,7 +349,9 @@ func UploadSlice(ctx context.Context, storage driver.Driver, req *reqres.UploadS
346349
if err != nil {
347350
msu.Status = tables.SliceUploadStatusFailed
348351
msu.Message = err.Error()
349-
db.UpdateSliceUpload(msu.SliceUpload)
352+
if updateErr := db.UpdateSliceUpload(msu.SliceUpload); updateErr != nil {
353+
log.Errorf("Failed to update slice upload status: %v", updateErr)
354+
}
350355
}
351356
}()
352357

@@ -476,10 +481,20 @@ func SliceUpComplete(ctx context.Context, storage driver.Driver, uploadID uint)
476481
if err != nil {
477482
msu.Status = tables.SliceUploadStatusFailed
478483
msu.Message = err.Error()
479-
db.UpdateSliceUpload(msu.SliceUpload)
484+
if updateErr := db.UpdateSliceUpload(msu.SliceUpload); updateErr != nil {
485+
log.Errorf("Failed to update slice upload status: %v", updateErr)
486+
}
480487
}
488+
// 确保资源清理
481489
if msu.tmpFile != nil {
482-
msu.tmpFile.Close()
490+
if closeErr := msu.tmpFile.Close(); closeErr != nil {
491+
log.Errorf("Failed to close tmp file: %v", closeErr)
492+
}
493+
}
494+
if msu.TmpFile != "" {
495+
if removeErr := os.Remove(msu.TmpFile); removeErr != nil && !os.IsNotExist(removeErr) {
496+
log.Errorf("Failed to remove tmp file %s: %v", msu.TmpFile, removeErr)
497+
}
483498
}
484499
sliceupMap.Delete(msu.ID)
485500

@@ -499,9 +514,15 @@ func SliceUpComplete(ctx context.Context, storage driver.Driver, uploadID uint)
499514
}
500515
// 清理缓存及临时文件
501516
if msu.tmpFile != nil {
502-
msu.tmpFile.Close()
517+
if closeErr := msu.tmpFile.Close(); closeErr != nil {
518+
log.Errorf("Failed to close tmp file: %v", closeErr)
519+
}
520+
}
521+
if msu.TmpFile != "" {
522+
if removeErr := os.Remove(msu.TmpFile); removeErr != nil && !os.IsNotExist(removeErr) {
523+
log.Errorf("Failed to remove tmp file %s: %v", msu.TmpFile, removeErr)
524+
}
503525
}
504-
os.Remove(msu.TmpFile)
505526

506527
return rsp, nil
507528

@@ -547,7 +568,11 @@ func SliceUpComplete(ctx context.Context, storage driver.Driver, uploadID uint)
547568
log.Error("Put error", msu.SliceUpload, err)
548569
return nil, err
549570
}
550-
os.Remove(msu.TmpFile)
571+
if msu.TmpFile != "" {
572+
if removeErr := os.Remove(msu.TmpFile); removeErr != nil && !os.IsNotExist(removeErr) {
573+
log.Errorf("Failed to remove tmp file %s: %v", msu.TmpFile, removeErr)
574+
}
575+
}
551576
return &reqres.UploadSliceCompleteResp{
552577
Complete: 1,
553578
UploadID: msu.ID,

0 commit comments

Comments
 (0)