Skip to content

Commit 6f9cc90

Browse files
authored
Merge pull request #354 from YangSen-qn/optimize_check_file_change
batch upload & download: optimize check whether file change
2 parents a2935dc + c8e7c90 commit 6f9cc90

File tree

5 files changed

+28
-46
lines changed

5 files changed

+28
-46
lines changed

iqshell/common/utils/file.go

+2-18
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,8 @@ func NetworkFileLength(srcResUrl string) (fileSize int64, err *data.CodeError) {
132132
return
133133
}
134134

135-
func IsFileMatchFileModifyTime(filePath string, modifyTime int64) (match bool, err *data.CodeError) {
136-
if time, e := FileModify(filePath); e != nil {
135+
func IsLocalFileMatchFileModifyTime(filePath string, modifyTime int64) (match bool, err *data.CodeError) {
136+
if time, e := LocalFileModify(filePath); e != nil {
137137
return false, e
138138
} else if time != modifyTime {
139139
return false, data.NewEmptyError().AppendDescF("modifyTime don't match, except:%d but:%d", modifyTime, time)
@@ -142,22 +142,6 @@ func IsFileMatchFileModifyTime(filePath string, modifyTime int64) (match bool, e
142142
}
143143
}
144144

145-
func FileModify(filePath string) (int64, *data.CodeError) {
146-
if IsNetworkSource(filePath) {
147-
return NetworkFileModify(filePath)
148-
} else {
149-
return LocalFileModify(filePath)
150-
}
151-
}
152-
153-
func NetworkFileModify(filePath string) (int64, *data.CodeError) {
154-
fileStatus, err := os.Stat(filePath)
155-
if err != nil {
156-
return 0, data.NewEmptyError().AppendDescF("get file : get status error:%v", err)
157-
}
158-
return fileStatus.ModTime().Unix(), nil
159-
}
160-
161145
func LocalFileModify(filePath string) (int64, *data.CodeError) {
162146
fileStatus, err := os.Stat(filePath)
163147
if err != nil {

iqshell/storage/object/download/downloader.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ func Download(info *ApiInfo) (res *ApiResult, err *data.CodeError) {
8484
if !res.IsExist {
8585
err = utils.CreateDirIfNotExist(f.toAbsFile)
8686
}
87-
res.FileModifyTime, _ = utils.FileModify(f.toAbsFile)
87+
res.FileModifyTime, _ = utils.LocalFileModify(f.toAbsFile)
8888
return res, err
8989
}
9090

@@ -117,7 +117,7 @@ func Download(info *ApiInfo) (res *ApiResult, err *data.CodeError) {
117117

118118
if mErr == nil && checkResult.Match {
119119
// 文件已下载,并在文件匹配,不再下载
120-
if fileModifyTime, fErr := utils.FileModify(f.toAbsFile); fErr != nil {
120+
if fileModifyTime, fErr := utils.LocalFileModify(f.toAbsFile); fErr != nil {
121121
log.WarningF("Get file ModifyTime error:%v", fErr)
122122
} else {
123123
res.FileModifyTime = fileModifyTime
@@ -152,9 +152,10 @@ func Download(info *ApiInfo) (res *ApiResult, err *data.CodeError) {
152152
return
153153
}
154154

155-
res.FileModifyTime, err = utils.FileModify(f.toAbsFile)
156-
if err != nil {
157-
return
155+
if fStatus, sErr := os.Stat(f.toAbsFile); sErr != nil {
156+
return res, data.NewEmptyError().AppendDesc("get file stat error after download").AppendError(sErr)
157+
} else {
158+
res.FileModifyTime = fStatus.ModTime().Unix()
158159
}
159160

160161
// 检查下载后的数据是否符合预期

iqshell/storage/object/download/operations/batch.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package operations
22

33
import (
44
"github.com/qiniu/qshell/v2/iqshell"
5+
"github.com/qiniu/qshell/v2/iqshell/common/alert"
56
"github.com/qiniu/qshell/v2/iqshell/common/data"
67
"github.com/qiniu/qshell/v2/iqshell/common/export"
78
"github.com/qiniu/qshell/v2/iqshell/common/flow"
@@ -30,6 +31,9 @@ func (info *BatchDownloadWithConfigInfo) Check() *data.CodeError {
3031
if err := info.Info.Check(); err != nil {
3132
return err
3233
}
34+
if len(info.LocalDownloadConfig) == 0 {
35+
return alert.CannotEmptyError("LocalDownloadConfig", "")
36+
}
3337
return nil
3438
}
3539

@@ -251,8 +255,8 @@ func BatchDownload(cfg *iqshell.Config, info BatchDownloadInfo) {
251255
return true, data.NewEmptyError().AppendDescF("result is invalid:%+v", result)
252256
}
253257

254-
isLocalFileNotChange, _ := utils.IsFileMatchFileModifyTime(apiInfo.ToFile, result.FileModifyTime)
255-
isServerFileNotChange := apiInfo.ServerFilePutTime == recordApiInfo.ServerFilePutTime
258+
isLocalFileNotChange, _ := utils.IsLocalFileMatchFileModifyTime(apiInfo.ToFile, result.FileModifyTime)
259+
isServerFileNotChange := apiInfo.ServerFileHash == recordApiInfo.ServerFileHash
256260
// 本地文件和服务端文件均没有变化,则不需要重新下载
257261
if isLocalFileNotChange && isServerFileNotChange {
258262
return false, nil

iqshell/storage/object/upload/operations/batch.go

+14-10
Original file line numberDiff line numberDiff line change
@@ -328,18 +328,22 @@ func batchUploadFlow(info BatchUpload2Info, uploadConfig UploadConfig, dbPath st
328328
}
329329

330330
// 本地文件和服务端文件均没有变化,则不需要重新上传
331-
stat, sErr := object.Status(object.StatusApiInfo{
332-
Bucket: uploadInfo.ToBucket,
333-
Key: uploadInfo.SaveKey,
334-
NeedPart: false,
335-
})
336-
if sErr != nil {
337-
return true, data.NewEmptyError().AppendDesc("get stat from server").AppendError(sErr)
331+
isServerFileNotChange := true
332+
if uploadConfig.CheckHash {
333+
// 检测 hash 需要调用 Stat 接口查询 hash,如果用户不检测 hash 则认为服务端文件没有变化。
334+
stat, sErr := object.Status(object.StatusApiInfo{
335+
Bucket: uploadInfo.ToBucket,
336+
Key: uploadInfo.SaveKey,
337+
NeedPart: false,
338+
})
339+
if sErr != nil {
340+
return true, data.NewEmptyError().AppendDesc("get stat from server").AppendError(sErr)
341+
}
342+
isServerFileNotChange = stat.Hash == result.ServerFileHash
338343
}
339344

340345
// LocalFileModifyTime 单位是 100ns
341-
isLocalFileNotChange, mErr := utils.IsFileMatchFileModifyTime(uploadInfo.FilePath, recordUploadInfo.LocalFileModifyTime/10000000)
342-
isServerFileNotChange := stat.PutTime == result.ServerPutTime
346+
isLocalFileNotChange, mErr := utils.IsLocalFileMatchFileModifyTime(uploadInfo.FilePath, recordUploadInfo.LocalFileModifyTime/10000000)
343347
// 本地文件没有变化,服务端文件没有变化,则不需要再重新上传
344348
if isLocalFileNotChange && isServerFileNotChange {
345349
return false, nil
@@ -348,7 +352,7 @@ func batchUploadFlow(info BatchUpload2Info, uploadConfig UploadConfig, dbPath st
348352
return true, data.NewEmptyError().AppendDescF("local file has change, %v", mErr)
349353
} else {
350354
// 服务端文件有变动,尝试检查 hash,hash 统一由单文件上传之前检查
351-
return true, data.NewEmptyError().AppendDescF("server file has change, PutTime don't match, except:%d but:%d", result.ServerPutTime, stat.PutTime)
355+
return true, data.NewEmptyError().AppendDesc("server file has change, hash don't match")
352356
}
353357
}).
354358
FlowWillStartFunc(func(flow *flow.Flow) (err *data.CodeError) {

iqshell/storage/object/upload/uploader.go

-11
Original file line numberDiff line numberDiff line change
@@ -170,17 +170,6 @@ func Upload(info *ApiInfo) (res *ApiResult, err *data.CodeError) {
170170
return
171171
}
172172

173-
if stat, sErr := object.Status(object.StatusApiInfo{
174-
Bucket: info.ToBucket,
175-
Key: info.SaveKey,
176-
NeedPart: false,
177-
}); sErr != nil {
178-
err = data.NewEmptyError().AppendDesc("get file status after upload").AppendDescF("upload error:%v", sErr)
179-
return
180-
} else {
181-
res.ServerPutTime = stat.PutTime
182-
}
183-
184173
if info.CheckHash {
185174
if _, mErr := object.Match(object.MatchApiInfo{
186175
Bucket: info.ToBucket,

0 commit comments

Comments
 (0)