Merge pull request #1139 from travisturner/prevent-excessive-sendsync

prevent excessive sendSyce (createView) messages.
This commit is contained in:
Travis Turner 2018-02-22 16:55:07 -06:00 • committed by GitHub
commit 359fc190bd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 26 additions and 23 deletions

View file

@ -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 {

View file

@ -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
}

View file

@ -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 {