diff --git a/weed/command/mount.go b/weed/command/mount.go index 7bf59cdc7..42a79bd1f 100644 --- a/weed/command/mount.go +++ b/weed/command/mount.go @@ -2,6 +2,7 @@ package command import ( "os" + "time" ) type MountOptions struct { @@ -25,9 +26,10 @@ type MountOptions struct { } var ( - mountOptions MountOptions - mountCpuProfile *string - mountMemProfile *string + mountOptions MountOptions + mountCpuProfile *string + mountMemProfile *string + mountReadRetryTime *time.Duration ) func init() { @@ -46,11 +48,13 @@ func init() { mountOptions.allowOthers = cmdMount.Flag.Bool("allowOthers", true, "allows other users to access the file system") mountOptions.umaskString = cmdMount.Flag.String("umask", "022", "octal umask, e.g., 022, 0111") mountOptions.nonempty = cmdMount.Flag.Bool("nonempty", false, "allows the mounting over a non-empty directory") - mountCpuProfile = cmdMount.Flag.String("cpuprofile", "", "cpu profile output file") - mountMemProfile = cmdMount.Flag.String("memprofile", "", "memory profile output file") mountOptions.outsideContainerClusterMode = cmdMount.Flag.Bool("outsideContainerClusterMode", false, "allows other users to access the file system") mountOptions.uidMap = cmdMount.Flag.String("map.uid", "", "map local uid to uid on filer, comma-separated :") mountOptions.gidMap = cmdMount.Flag.String("map.gid", "", "map local gid to gid on filer, comma-separated :") + + mountCpuProfile = cmdMount.Flag.String("cpuprofile", "", "cpu profile output file") + mountMemProfile = cmdMount.Flag.String("memprofile", "", "memory profile output file") + mountReadRetryTime = cmdMount.Flag.Duration("readRetryTime", 6*time.Second, "maximum read retry wait time") } var cmdMount = &Command{ diff --git a/weed/command/mount_std.go b/weed/command/mount_std.go index 14374eb5c..20d08314c 100644 --- a/weed/command/mount_std.go +++ b/weed/command/mount_std.go @@ -5,6 +5,7 @@ package command import ( "context" "fmt" + "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/filesys/meta_cache" "os" "os/user" @@ -29,6 +30,10 @@ import ( func runMount(cmd *Command, args []string) bool { grace.SetupProfiling(*mountCpuProfile, *mountMemProfile) + if *mountReadRetryTime < time.Second { + *mountReadRetryTime = time.Second + } + filer.ReadWaitTime = *mountReadRetryTime umask, umaskErr := strconv.ParseUint(*mountOptions.umaskString, 8, 64) if umaskErr != nil { diff --git a/weed/filer/filechunk_manifest.go b/weed/filer/filechunk_manifest.go index 9e53e008f..2df8a4bbf 100644 --- a/weed/filer/filechunk_manifest.go +++ b/weed/filer/filechunk_manifest.go @@ -98,7 +98,7 @@ func retriedFetchChunkData(urlStrings []string, cipherKey []byte, isGzipped bool var err error var buffer bytes.Buffer - for waitTime := time.Second; waitTime < 10*time.Second; waitTime += waitTime / 2 { + for waitTime := time.Second; waitTime < ReadWaitTime; waitTime += waitTime / 2 { for _, urlString := range urlStrings { err = util.ReadUrlAsStream(urlString, cipherKey, isGzipped, isFullChunk, offset, size, func(data []byte) { buffer.Write(data) diff --git a/weed/filer/reader_at.go b/weed/filer/reader_at.go index 4d0cde850..835d6cfc2 100644 --- a/weed/filer/reader_at.go +++ b/weed/filer/reader_at.go @@ -14,6 +14,10 @@ import ( "time" ) +var ( + ReadWaitTime = 6 * time.Second +) + type ChunkReadAt struct { masterClient *wdclient.MasterClient chunkViews []*ChunkView @@ -39,7 +43,7 @@ func LookupFn(filerClient filer_pb.FilerClient) LookupFileIdFunctionType { locations, found := vidCache[vid] waitTime := time.Second - for !found && waitTime < 6*time.Second { + for !found && waitTime < ReadWaitTime { // println("looking up volume", vid) err = filerClient.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { resp, err := client.LookupVolume(context.Background(), &filer_pb.LookupVolumeRequest{