From e454473ec78b6b6be65d7e5b5d9479f0ac841314 Mon Sep 17 00:00:00 2001 From: Travis Turner Date: Thu, 22 Feb 2018 16:02:43 -0600 Subject: [PATCH] prevent excessive sendSyce (createView) messages. --- frame.go | 41 +++++++++++++++++++---------------------- server.go | 2 +- view.go | 6 ++++++ 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/frame.go b/frame.go index b5807dc71..069e0bc89 100644 --- a/frame.go +++ b/frame.go @@ -22,7 +22,6 @@ import ( "os" "path/filepath" "sort" - "strings" "sync" "time" @@ -574,53 +573,51 @@ func (f *Frame) RecalculateCaches() { // Additionally, a CreateViewMessage is sent to the cluster. func (f *Frame) CreateViewIfNotExists(name string) (*View, error) { - view, err := f.CreateViewIfNotExistsBase(name) + view, created, err := f.createViewIfNotExistsBase(name) if err != nil { return nil, err } - // Broadcast view creation to the cluster. - err = f.broadcaster.SendSync( - &internal.CreateViewMessage{ - Index: f.index, - Frame: f.name, - View: name, - }) - if err != nil { - return nil, err + if created { + // Broadcast view creation to the cluster. + err = f.broadcaster.SendSync( + &internal.CreateViewMessage{ + Index: f.index, + Frame: f.name, + View: name, + }) + if err != nil { + return nil, err + } } return view, nil } -// CreateViewIfNotExistsBase returns the named view, creating it if necessary. -func (f *Frame) CreateViewIfNotExistsBase(name string) (*View, error) { +// createViewIfNotExistsBase returns the named view, creating it if necessary. +// The returned bool indicates whether the view was created or not. +func (f *Frame) createViewIfNotExistsBase(name string) (*View, bool, error) { // Don't create inverse views if they are not enabled. if !f.InverseEnabled() && IsInverseView(name) { - return nil, ErrFrameInverseDisabled + return nil, false, ErrFrameInverseDisabled } f.mu.Lock() defer f.mu.Unlock() if view := f.views[name]; view != nil { - return view, nil + return view, false, nil } view := f.newView(f.ViewPath(name), name) - // Never keep a cache for field views. - if strings.HasPrefix(name, ViewFieldPrefix) { - view.cacheType = CacheTypeNone - } - if err := view.Open(); err != nil { - return nil, err + return nil, false, err } view.RowAttrStore = f.rowAttrStore f.views[view.Name()] = view - return view, nil + return view, true, nil } func (f *Frame) newView(path, name string) *View { diff --git a/server.go b/server.go index 6a92a7768..3751e28ad 100644 --- a/server.go +++ b/server.go @@ -424,7 +424,7 @@ func (s *Server) ReceiveMessage(pb proto.Message) error { if f == nil { return fmt.Errorf("Local Frame not found: %s", obj.Frame) } - _, err := f.CreateViewIfNotExistsBase(obj.View) + _, _, err := f.createViewIfNotExistsBase(obj.View) if err != nil { return err } diff --git a/view.go b/view.go index d77d9257a..db2eb97f1 100644 --- a/view.go +++ b/view.go @@ -99,6 +99,12 @@ func (v *View) Path() string { return v.path } // Open opens and initializes the view. func (v *View) Open() error { + + // Never keep a cache for field views. + if strings.HasPrefix(v.name, ViewFieldPrefix) { + v.cacheType = CacheTypeNone + } + if err := func() error { // Ensure the view's path exists. if err := os.MkdirAll(v.path, 0777); err != nil {