From d198e8c6d65d5b135a481f36004769b152583c7d Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 6 Jul 2020 09:24:54 -0700 Subject: [PATCH] filer: support cross filer meta data sync if sharing the same store --- weed/command/filer.go | 3 +++ weed/command/server.go | 1 + weed/filer2/filer.go | 4 ++++ weed/server/filer_server.go | 11 ++++++++++- 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/weed/command/filer.go b/weed/command/filer.go index e258b695d..c18925006 100644 --- a/weed/command/filer.go +++ b/weed/command/filer.go @@ -35,6 +35,7 @@ type FilerOptions struct { enableNotification *bool disableHttp *bool cipher *bool + peers *string // default leveldb directory, used in "weed server" mode defaultLevelDbDirectory *string @@ -55,6 +56,7 @@ func init() { f.dataCenter = cmdFiler.Flag.String("dataCenter", "", "prefer to write to volumes in this data center") f.disableHttp = cmdFiler.Flag.Bool("disableHttp", false, "disable http request, only gRpc operations are allowed") f.cipher = cmdFiler.Flag.Bool("encryptVolumeData", false, "encrypt data on volume servers") + f.peers = cmdFiler.Flag.String("peers", "", "all filers sharing the same filer store in comma separated ip:port list") } var cmdFiler = &Command{ @@ -114,6 +116,7 @@ func (fo *FilerOptions) startFiler() { Host: *fo.ip, Port: uint32(*fo.port), Cipher: *fo.cipher, + Filers: strings.Split(*fo.peers, ","), }) if nfs_err != nil { glog.Fatalf("Filer startup error: %v", nfs_err) diff --git a/weed/command/server.go b/weed/command/server.go index 53e08845c..443f041c5 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -88,6 +88,7 @@ func init() { filerOptions.maxMB = cmdServer.Flag.Int("filer.maxMB", 32, "split files larger than the limit") filerOptions.dirListingLimit = cmdServer.Flag.Int("filer.dirListLimit", 1000, "limit sub dir listing size") filerOptions.cipher = cmdServer.Flag.Bool("filer.encryptVolumeData", false, "encrypt data on volume servers") + filerOptions.peers = cmdServer.Flag.String("filer.peers", "", "all filers sharing the same filer store in comma separated ip:port list") serverOptions.v.port = cmdServer.Flag.Int("volume.port", 8080, "volume server http listen port") serverOptions.v.publicPort = cmdServer.Flag.Int("volume.port.public", 0, "volume server public port") diff --git a/weed/filer2/filer.go b/weed/filer2/filer.go index 769ff4fac..06c997f36 100644 --- a/weed/filer2/filer.go +++ b/weed/filer2/filer.go @@ -60,6 +60,10 @@ func (f *Filer) SetStore(store FilerStore) { f.store = NewFilerStoreWrapper(store) } +func (f *Filer) GetStore() (store FilerStore) { + return f.store +} + func (f *Filer) DisableDirectoryCache() { f.directoryCache = nil } diff --git a/weed/server/filer_server.go b/weed/server/filer_server.go index 6baf8f1b8..c6c16d0c2 100644 --- a/weed/server/filer_server.go +++ b/weed/server/filer_server.go @@ -5,6 +5,7 @@ import ( "fmt" "net/http" "os" + "strings" "sync" "time" @@ -86,9 +87,17 @@ func NewFilerServer(defaultMux, readonlyMux *http.ServeMux, option *FilerOption) fs.filer = filer2.NewFiler(option.Masters, fs.grpcDialOption, option.Host, option.Port, option.Collection, option.DefaultReplication, func() { fs.listenersCond.Broadcast() }) - fs.metaAggregator = filer2.NewMetaAggregator(append(option.Filers, fmt.Sprintf("%s:%d", option.Host, option.Port)), fs.grpcDialOption) fs.filer.Cipher = option.Cipher + // set peers + if strings.HasPrefix(fs.filer.GetStore().GetName(), "leveldb") && len(option.Filers) > 0 { + glog.Fatal("filers using separate leveldb stores should not configure peers!") + } + if len(option.Filers) == 0 { + option.Filers = append(option.Filers, fmt.Sprintf("%s:%d", option.Host, option.Port) + } + fs.metaAggregator = filer2.NewMetaAggregator(option.Filers, fs.grpcDialOption) + maybeStartMetrics(fs, option) go fs.filer.KeepConnectedToMaster()