submatview: move error return to NewMaterializer
So that we don't have to create views ahead of time, when we will never use that view.
This commit is contained in:
parent
aadb46b209
commit
440ab3e0ae
|
@ -59,15 +59,17 @@ func (c *Client) getServiceNodes(
|
|||
) (structs.IndexedCheckServiceNodes, cache.ResultMeta, error) {
|
||||
var out structs.IndexedCheckServiceNodes
|
||||
|
||||
// TODO: if UseStreaming, elif !UseCache, else cache
|
||||
|
||||
if !req.QueryOptions.UseCache {
|
||||
err := c.NetRPC.RPC("Health.ServiceNodes", &req, &out)
|
||||
return out, cache.ResultMeta{}, err
|
||||
}
|
||||
|
||||
if req.Source.Node == "" {
|
||||
sr, err := newServiceRequest(req, c.MaterializerDeps)
|
||||
if err != nil {
|
||||
return out, cache.ResultMeta{}, err
|
||||
sr := serviceRequest{
|
||||
ServiceSpecificRequest: req,
|
||||
deps: c.MaterializerDeps,
|
||||
}
|
||||
|
||||
result, err := c.ViewStore.Get(ctx, sr)
|
||||
|
@ -109,21 +111,8 @@ func (c *Client) Notify(
|
|||
return c.Cache.Notify(ctx, cacheName, &req, correlationID, ch)
|
||||
}
|
||||
|
||||
func newServiceRequest(req structs.ServiceSpecificRequest, deps MaterializerDeps) (serviceRequest, error) {
|
||||
view, err := newHealthView(req)
|
||||
if err != nil {
|
||||
return serviceRequest{}, err
|
||||
}
|
||||
return serviceRequest{
|
||||
ServiceSpecificRequest: req,
|
||||
view: view,
|
||||
deps: deps,
|
||||
}, nil
|
||||
}
|
||||
|
||||
type serviceRequest struct {
|
||||
structs.ServiceSpecificRequest
|
||||
view *healthView
|
||||
deps MaterializerDeps
|
||||
}
|
||||
|
||||
|
@ -135,11 +124,15 @@ func (r serviceRequest) Type() string {
|
|||
return "service-health"
|
||||
}
|
||||
|
||||
func (r serviceRequest) NewMaterializer() *submatview.Materializer {
|
||||
func (r serviceRequest) NewMaterializer() (*submatview.Materializer, error) {
|
||||
view, err := newHealthView(r.ServiceSpecificRequest)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return submatview.NewMaterializer(submatview.Deps{
|
||||
View: r.view,
|
||||
View: view,
|
||||
Client: r.deps.Client,
|
||||
Logger: r.deps.Logger,
|
||||
Request: newMaterializerRequest(r.ServiceSpecificRequest),
|
||||
})
|
||||
}), nil
|
||||
}
|
||||
|
|
|
@ -73,7 +73,7 @@ func (s *Store) Run(ctx context.Context) {
|
|||
// TODO: godoc
|
||||
type Request interface {
|
||||
cache.Request
|
||||
NewMaterializer() *Materializer
|
||||
NewMaterializer() (*Materializer, error)
|
||||
Type() string
|
||||
}
|
||||
|
||||
|
@ -82,7 +82,10 @@ type Request interface {
|
|||
// See agent/cache.Cache.Get for complete documentation.
|
||||
func (s *Store) Get(ctx context.Context, req Request) (Result, error) {
|
||||
info := req.CacheInfo()
|
||||
key, e := s.getEntry(req)
|
||||
key, e, err := s.getEntry(req)
|
||||
if err != nil {
|
||||
return Result{}, err
|
||||
}
|
||||
defer s.releaseEntry(key)
|
||||
|
||||
ctx, cancel := context.WithTimeout(ctx, info.Timeout)
|
||||
|
@ -108,7 +111,10 @@ func (s *Store) Notify(
|
|||
updateCh chan<- cache.UpdateEvent,
|
||||
) error {
|
||||
info := req.CacheInfo()
|
||||
key, e := s.getEntry(req)
|
||||
key, e, err := s.getEntry(req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
go func() {
|
||||
defer s.releaseEntry(key)
|
||||
|
@ -150,7 +156,7 @@ func (s *Store) Notify(
|
|||
|
||||
// getEntry from the store, and increment the requests counter. releaseEntry
|
||||
// must be called when the request is finished to decrement the counter.
|
||||
func (s *Store) getEntry(req Request) (string, entry) {
|
||||
func (s *Store) getEntry(req Request) (string, entry, error) {
|
||||
info := req.CacheInfo()
|
||||
key := makeEntryKey(req.Type(), info)
|
||||
|
||||
|
@ -160,11 +166,15 @@ func (s *Store) getEntry(req Request) (string, entry) {
|
|||
if ok {
|
||||
e.requests++
|
||||
s.byKey[key] = e
|
||||
return key, e
|
||||
return key, e, nil
|
||||
}
|
||||
|
||||
mat, err := req.NewMaterializer()
|
||||
if err != nil {
|
||||
return "", e, err
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
mat := req.NewMaterializer()
|
||||
go mat.Run(ctx)
|
||||
|
||||
e = entry{
|
||||
|
@ -173,7 +183,7 @@ func (s *Store) getEntry(req Request) (string, entry) {
|
|||
requests: 1,
|
||||
}
|
||||
s.byKey[key] = e
|
||||
return key, e
|
||||
return key, e, nil
|
||||
}
|
||||
|
||||
// idleTTL is the duration of time an entry should remain in the Store after the
|
||||
|
|
|
@ -146,7 +146,7 @@ func (r *fakeRequest) CacheInfo() cache.RequestInfo {
|
|||
}
|
||||
}
|
||||
|
||||
func (r *fakeRequest) NewMaterializer() *Materializer {
|
||||
func (r *fakeRequest) NewMaterializer() (*Materializer, error) {
|
||||
return NewMaterializer(Deps{
|
||||
View: &fakeView{srvs: make(map[string]*pbservice.CheckServiceNode)},
|
||||
Client: r.client,
|
||||
|
@ -162,7 +162,7 @@ func (r *fakeRequest) NewMaterializer() *Materializer {
|
|||
}
|
||||
return req
|
||||
},
|
||||
})
|
||||
}), nil
|
||||
}
|
||||
|
||||
func (r *fakeRequest) Type() string {
|
||||
|
|
Loading…
Reference in New Issue