Browse Source

修复调试RClone发现的问题

gitlink
Sydonian 1 year ago
parent
commit
6b73bf944a
3 changed files with 16 additions and 9 deletions
  1. +4
    -1
      client/internal/http/object.go
  2. +1
    -1
      common/pkgs/downloader/io.go
  3. +11
    -7
      common/pkgs/downloader/iterator.go

+ 4
- 1
client/internal/http/object.go View File

@@ -126,7 +126,10 @@ func (s *ObjectService) Download(ctx *gin.Context) {
return return
} }


io.Copy(fw, file.File)
_, err = io.Copy(fw, file.File)
if err != nil {
log.Warnf("copying file: %s", err.Error())
}
} }


func (s *ObjectService) UpdateInfo(ctx *gin.Context) { func (s *ObjectService) UpdateInfo(ctx *gin.Context) {


+ 1
- 1
common/pkgs/downloader/io.go View File

@@ -53,7 +53,7 @@ func (r *IPFSReader) Seek(offset int64, whence int) (int64, error) {
return r.offset, nil return r.offset, nil
} }


// 如果文件流已经打开,那么如果seek的位置和当前位置不同,那么需要重新打开文件流
// 如果文件流已经打开,而seek的位置和当前位置不同,则需要重新打开文件流
if offset != r.offset { if offset != r.offset {
var err error var err error
r.stream.Close() r.stream.Close()


+ 11
- 7
common/pkgs/downloader/iterator.go View File

@@ -83,6 +83,10 @@ func (i *DownloadObjectIterator) init() error {


allNodeIDs := make(map[cdssdk.NodeID]bool) allNodeIDs := make(map[cdssdk.NodeID]bool)
for _, obj := range i.reqs { for _, obj := range i.reqs {
if obj.Detail == nil {
continue
}

for _, p := range obj.Detail.PinnedAt { for _, p := range obj.Detail.PinnedAt {
allNodeIDs[p] = true allNodeIDs[p] = true
} }
@@ -222,7 +226,7 @@ func (iter *DownloadObjectIterator) downloadECObject(req downloadReqeust2, ecRed
readPos := req.Raw.Offset readPos := req.Raw.Offset
totalReadLen := req.Detail.Object.Size - req.Raw.Offset totalReadLen := req.Detail.Object.Size - req.Raw.Offset
if req.Raw.Length >= 0 { if req.Raw.Length >= 0 {
totalReadLen = req.Raw.Length
totalReadLen = math2.Min(req.Raw.Length, totalReadLen)
} }


for totalReadLen > 0 { for totalReadLen > 0 {
@@ -242,7 +246,7 @@ func (iter *DownloadObjectIterator) downloadECObject(req downloadReqeust2, ecRed
err := io2.WriteAll(pw, cache.Data[readRelativePos:readRelativePos+curReadLen]) err := io2.WriteAll(pw, cache.Data[readRelativePos:readRelativePos+curReadLen])
if err != nil { if err != nil {
pw.CloseWithError(err) pw.CloseWithError(err)
break
return
} }
totalReadLen -= curReadLen totalReadLen -= curReadLen
readPos += curReadLen readPos += curReadLen
@@ -252,12 +256,11 @@ func (iter *DownloadObjectIterator) downloadECObject(req downloadReqeust2, ecRed
// 如果Object的Hash和Cache的Hash不一致,说明Cache是无效的,需要重新下载 // 如果Object的Hash和Cache的Hash不一致,说明Cache是无效的,需要重新下载
iter.downloader.strips.Remove(cacheKey) iter.downloader.strips.Remove(cacheKey)
} }

for _, str := range fileStrs { for _, str := range fileStrs {
_, err := str.Seek(curStripPosInBytes, io.SeekStart)
_, err := str.Seek(curStripPos*int64(ecRed.ChunkSize), io.SeekStart)
if err != nil { if err != nil {
pw.CloseWithError(err) pw.CloseWithError(err)
break
return
} }
} }


@@ -277,13 +280,13 @@ func (iter *DownloadObjectIterator) downloadECObject(req downloadReqeust2, ecRed
}) })
if err != nil { if err != nil {
pw.CloseWithError(err) pw.CloseWithError(err)
break
return
} }


err = rs.ReconstructData(blockArrs) err = rs.ReconstructData(blockArrs)
if err != nil { if err != nil {
pw.CloseWithError(err) pw.CloseWithError(err)
break
return
} }


iter.downloader.strips.Add(cacheKey, ObjectECStrip{ iter.downloader.strips.Add(cacheKey, ObjectECStrip{
@@ -292,6 +295,7 @@ func (iter *DownloadObjectIterator) downloadECObject(req downloadReqeust2, ecRed
}) })
// 下次循环就能从Cache中读取数据 // 下次循环就能从Cache中读取数据
} }
pw.Close()
}() }()


return pr, nil return pr, nil


Loading…
Cancel
Save