From 7d1e9a6b8a45852881c872f1f752bcaa78520639 Mon Sep 17 00:00:00 2001 From: chrislusf Date: Mon, 3 Aug 2015 14:43:15 -0700 Subject: [PATCH] add option to redirect moved or non-local volumes fix https://github.com/chrislusf/seaweedfs/issues/168 --- go/weed/server.go | 3 ++- go/weed/volume.go | 4 +++- go/weed/weed_server/volume_server.go | 5 ++++- go/weed/weed_server/volume_server_handlers_read.go | 5 +++++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/go/weed/server.go b/go/weed/server.go index b39ab7556..278afc520 100644 --- a/go/weed/server.go +++ b/go/weed/server.go @@ -70,6 +70,7 @@ var ( volumePulse = cmdServer.Flag.Int("pulseSeconds", 5, "number of seconds between heartbeats") volumeIndexType = cmdServer.Flag.String("volume.index", "memory", "Choose [memory|leveldb|boltdb] mode for memory~performance balance.") volumeFixJpgOrientation = cmdServer.Flag.Bool("volume.images.fix.orientation", true, "Adjust jpg orientation when uploading.") + volumeReadRedirect = cmdServer.Flag.Bool("volume.read.redirect", true, "Redirect moved or non-local volumes.") volumeServerPublicUrl = cmdServer.Flag.String("volume.publicUrl", "", "publicly accessible address") isStartingFiler = cmdServer.Flag.Bool("filer", false, "whether to start filer") @@ -251,7 +252,7 @@ func runServer(cmd *Command, args []string) bool { folders, maxCounts, volumeNeedleMapKind, *serverIp+":"+strconv.Itoa(*masterPort), *volumePulse, *serverDataCenter, *serverRack, - serverWhiteList, *volumeFixJpgOrientation, + serverWhiteList, *volumeFixJpgOrientation, *volumeReadRedirect, ) glog.V(0).Infoln("Start Seaweed volume server", util.VERSION, "at", *serverIp+":"+strconv.Itoa(*volumePort)) diff --git a/go/weed/volume.go b/go/weed/volume.go index d44a75d36..f1b12dae8 100644 --- a/go/weed/volume.go +++ b/go/weed/volume.go @@ -35,6 +35,7 @@ type VolumeServerOptions struct { whiteList []string indexType *string fixJpgOrientation *bool + readRedirect *bool } func init() { @@ -52,6 +53,7 @@ func init() { v.rack = cmdVolume.Flag.String("rack", "", "current volume server's rack name") v.indexType = cmdVolume.Flag.String("index", "memory", "Choose [memory|leveldb|boltdb] mode for memory~performance balance.") v.fixJpgOrientation = cmdVolume.Flag.Bool("images.fix.orientation", true, "Adjust jpg orientation when uploading.") + v.readRedirect = cmdVolume.Flag.Bool("read.redirect", true, "Redirect moved or non-local volumes.") } var cmdVolume = &Command{ @@ -129,7 +131,7 @@ func runVolume(cmd *Command, args []string) bool { volumeNeedleMapKind, *v.master, *v.pulseSeconds, *v.dataCenter, *v.rack, v.whiteList, - *v.fixJpgOrientation, + *v.fixJpgOrientation, *v.readRedirect, ) listeningAddress := *v.bindIp + ":" + strconv.Itoa(*v.port) diff --git a/go/weed/weed_server/volume_server.go b/go/weed/weed_server/volume_server.go index 703536c7a..8becdd0f1 100644 --- a/go/weed/weed_server/volume_server.go +++ b/go/weed/weed_server/volume_server.go @@ -22,6 +22,7 @@ type VolumeServer struct { needleMapKind storage.NeedleMapType FixJpgOrientation bool + ReadRedirect bool } func NewVolumeServer(adminMux, publicMux *http.ServeMux, ip string, @@ -31,13 +32,15 @@ func NewVolumeServer(adminMux, publicMux *http.ServeMux, ip string, masterNode string, pulseSeconds int, dataCenter string, rack string, whiteList []string, - fixJpgOrientation bool) *VolumeServer { + fixJpgOrientation bool, + readRedirect bool) *VolumeServer { vs := &VolumeServer{ pulseSeconds: pulseSeconds, dataCenter: dataCenter, rack: rack, needleMapKind: needleMapKind, FixJpgOrientation: fixJpgOrientation, + ReadRedirect: readRedirect, } vs.SetMasterNode(masterNode) vs.store = storage.NewStore(port, ip, publicUrl, folders, maxCounts, vs.needleMapKind) diff --git a/go/weed/weed_server/volume_server_handlers_read.go b/go/weed/weed_server/volume_server_handlers_read.go index 86dfee560..d569f5510 100644 --- a/go/weed/weed_server/volume_server_handlers_read.go +++ b/go/weed/weed_server/volume_server_handlers_read.go @@ -36,6 +36,11 @@ func (vs *VolumeServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) glog.V(4).Infoln("volume", volumeId, "reading", n) if !vs.store.HasVolume(volumeId) { + if !vs.ReadRedirect { + glog.V(2).Infoln("volume is not local:", err, r.URL.Path) + w.WriteHeader(http.StatusNotFound) + return + } lookupResult, err := operation.Lookup(vs.GetMasterNode(), volumeId.String()) glog.V(2).Infoln("volume", volumeId, "found on", lookupResult, "error", err) if err == nil && len(lookupResult.Locations) > 0 {