aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chrislusf@users.noreply.github.com>2022-07-19 11:38:43 -0700
committerGitHub <noreply@github.com>2022-07-19 11:38:43 -0700
commit9667588af010e8e331bf58992f7014077236365b (patch)
treed393ed718ebfbb11433ea4f96a8c82a3905e581f
parentf0d560060f86b0ddf10800eafe5f9114de6db1f9 (diff)
parent7b1497ee63ce4126236d08ab54d9d6e22e43556d (diff)
downloadseaweedfs-9667588af010e8e331bf58992f7014077236365b.tar.xz
seaweedfs-9667588af010e8e331bf58992f7014077236365b.zip
Merge pull request #3318 from kmlebedev/issues/3310
Use fallback if urls are not found
-rw-r--r--weed/filer/stream.go22
-rw-r--r--weed/wdclient/masterclient.go6
2 files changed, 21 insertions, 7 deletions
diff --git a/weed/filer/stream.go b/weed/filer/stream.go
index 7da9fd0a0..d1b66e88d 100644
--- a/weed/filer/stream.go
+++ b/weed/filer/stream.go
@@ -18,6 +18,12 @@ import (
"github.com/chrislusf/seaweedfs/weed/wdclient"
)
+var getLookupFileIdBackoffSchedule = []time.Duration{
+ 150 * time.Millisecond,
+ 600 * time.Millisecond,
+ 1800 * time.Millisecond,
+}
+
func HasData(entry *filer_pb.Entry) bool {
if len(entry.Content) > 0 {
@@ -69,14 +75,22 @@ func StreamContent(masterClient wdclient.HasLookupFileIdFunction, writer io.Writ
fileId2Url := make(map[string][]string)
for _, chunkView := range chunkViews {
-
- urlStrings, err := masterClient.GetLookupFileIdFunction()(chunkView.FileId)
+ var urlStrings []string
+ var err error
+ for _, backoff := range getLookupFileIdBackoffSchedule {
+ urlStrings, err = masterClient.GetLookupFileIdFunction()(chunkView.FileId)
+ if err == nil && len(urlStrings) > 0 {
+ time.Sleep(backoff)
+ break
+ }
+ }
if err != nil {
glog.V(1).Infof("operation LookupFileId %s failed, err: %v", chunkView.FileId, err)
return err
} else if len(urlStrings) == 0 {
- glog.Errorf("operation LookupFileId %s failed, err: urls not found", chunkView.FileId)
- return fmt.Errorf("operation LookupFileId %s failed, err: urls not found", chunkView.FileId)
+ errUrlNotFound := fmt.Errorf("operation LookupFileId %s failed, err: urls not found", chunkView.FileId)
+ glog.Error(errUrlNotFound)
+ return errUrlNotFound
}
fileId2Url[chunkView.FileId] = urlStrings
}
diff --git a/weed/wdclient/masterclient.go b/weed/wdclient/masterclient.go
index 3e76dc0c5..d6a06bb57 100644
--- a/weed/wdclient/masterclient.go
+++ b/weed/wdclient/masterclient.go
@@ -2,6 +2,7 @@ package wdclient
import (
"context"
+ "fmt"
"github.com/chrislusf/seaweedfs/weed/stats"
"math/rand"
"time"
@@ -44,7 +45,7 @@ func (mc *MasterClient) GetLookupFileIdFunction() LookupFileIdFunctionType {
func (mc *MasterClient) LookupFileIdWithFallback(fileId string) (fullUrls []string, err error) {
fullUrls, err = mc.vidMap.LookupFileId(fileId)
- if err == nil {
+ if err == nil && len(fullUrls) > 0 {
return
}
err = pb.WithMasterClient(false, mc.currentMaster, mc.grpcDialOption, func(client master_pb.SeaweedClient) error {
@@ -52,7 +53,7 @@ func (mc *MasterClient) LookupFileIdWithFallback(fileId string) (fullUrls []stri
VolumeOrFileIds: []string{fileId},
})
if err != nil {
- return err
+ return fmt.Errorf("LookupVolume failed: %v", err)
}
for vid, vidLocation := range resp.VolumeIdLocations {
for _, vidLoc := range vidLocation.Locations {
@@ -65,7 +66,6 @@ func (mc *MasterClient) LookupFileIdWithFallback(fileId string) (fullUrls []stri
fullUrls = append(fullUrls, "http://"+loc.Url+"/"+fileId)
}
}
-
return nil
})
return