mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-10-06 19:07:50 +00:00
Merge pull request #1139 from travisturner/prevent-excessive-sendsync
prevent excessive sendSyce (createView) messages.
This commit is contained in:
commit
359fc190bd
3 changed files with 26 additions and 23 deletions
41
frame.go
41
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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
6
view.go
6
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 {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue