aboutsummaryrefslogtreecommitdiff
path: root/weed/replication/repl_util/replication_util.go
diff options
context:
space:
mode:
authorbingoohuang <bingoo.huang@gmail.com>2021-03-01 09:22:46 +0800
committerGitHub <noreply@github.com>2021-03-01 09:22:46 +0800
commiteb65cbf0025e4bfbfe6359a5ba5bfbd094c3e81d (patch)
tree7aa6c966d0d36a6cd4d2c16735b6b265527af142 /weed/replication/repl_util/replication_util.go
parent0cfbe8f059c9f97f606e7c76f77aa8a8a8c97765 (diff)
parente52c94640e9898be5308a77867ecea5ef1567c5b (diff)
downloadseaweedfs-eb65cbf0025e4bfbfe6359a5ba5bfbd094c3e81d.tar.xz
seaweedfs-eb65cbf0025e4bfbfe6359a5ba5bfbd094c3e81d.zip
Merge pull request #5 from chrislusf/master
sync
Diffstat (limited to 'weed/replication/repl_util/replication_util.go')
-rw-r--r--weed/replication/repl_util/replication_util.go42
1 files changed, 42 insertions, 0 deletions
diff --git a/weed/replication/repl_util/replication_util.go b/weed/replication/repl_util/replication_util.go
new file mode 100644
index 000000000..f642bb801
--- /dev/null
+++ b/weed/replication/repl_util/replication_util.go
@@ -0,0 +1,42 @@
+package repl_util
+
+import (
+ "github.com/chrislusf/seaweedfs/weed/filer"
+ "github.com/chrislusf/seaweedfs/weed/glog"
+ "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
+ var shouldRetry bool
+
+ for _, fileUrl := range fileUrls {
+ shouldRetry, err = util.FastReadUrlAsStream(fileUrl, nil, false, chunk.IsFullChunk(), chunk.Offset, int(chunk.Size), 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
+}