12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- package repl_util
- import (
- "github.com/seaweedfs/seaweedfs/weed/filer"
- "github.com/seaweedfs/seaweedfs/weed/glog"
- "github.com/seaweedfs/seaweedfs/weed/replication/source"
- util_http "github.com/seaweedfs/seaweedfs/weed/util/http"
- )
- func CopyFromChunkViews(chunkViews *filer.IntervalList[*filer.ChunkView], filerSource *source.FilerSource, writeFunc func(data []byte) error) error {
- for x := chunkViews.Front(); x != nil; x = x.Next {
- chunk := x.Value
- fileUrls, err := filerSource.LookupFileId(chunk.FileId)
- if err != nil {
- return err
- }
- var writeErr error
- var shouldRetry bool
- for _, fileUrl := range fileUrls {
- shouldRetry, err = util_http.ReadUrlAsStream(fileUrl, chunk.CipherKey, chunk.IsGzipped, chunk.IsFullChunk(), chunk.OffsetInChunk, int(chunk.ViewSize), func(data []byte) {
- writeErr = writeFunc(data)
- })
- if err != nil {
- glog.V(1).Infof("read from %s: %v", fileUrl, err)
- } else if writeErr != nil {
- glog.V(1).Infof("copy from %s: %v", fileUrl, writeErr)
- } else {
- break
- }
- }
- if shouldRetry && err != nil {
- return err
- }
- if writeErr != nil {
- return writeErr
- }
- }
- return nil
- }
|