aboutsummaryrefslogtreecommitdiff
path: root/weed/replication/repl_util/replication_utli.go
blob: cc4c5d806f416aa4837d42ff8b974b1a925043f1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package repl_util

import (
	"github.com/chrislusf/seaweedfs/weed/filer"
	"github.com/chrislusf/seaweedfs/weed/util/log"
	"github.com/chrislusf/seaweedfs/weed/replication/source"
	"github.com/chrislusf/seaweedfs/weed/util"
)

func CopyFromChunkViews(chunkViews []*filer.ChunkView, filerSource *source.FilerSource, writeFunc func(data []byte) error) error {

	for _, chunk := range chunkViews {

		fileUrls, err := filerSource.LookupFileId(chunk.FileId)
		if err != nil {
			return err
		}

		var writeErr error

		for _, fileUrl := range fileUrls {
			_, err = util.ReadUrlAsStream(fileUrl+"?readDeleted=true", nil, false, chunk.IsFullChunk(), chunk.Offset, int(chunk.Size), func(data []byte) {
				writeErr = writeFunc(data)
			})
			if err != nil {
				log.Debugf("read from %s: %v", fileUrl, err)
			} else if writeErr != nil {
				log.Debugf("copy from %s: %v", fileUrl, writeErr)
			} else {
				break
			}
		}

		if err != nil {
			return err
		}

	}
	return nil
}