mirror of https://github.com/hashicorp/consul
streaming: support X-Cache-Hit header
If a value was already available in the local view the request is considered a cache hit. If the materialized had to wait for a value, it is considered a cache miss.pull/10514/head
parent
c78391797d
commit
bc4d349ccf
|
@ -42,7 +42,8 @@ func (c *Client) ServiceNodes(
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return structs.IndexedCheckServiceNodes{}, cache.ResultMeta{}, err
|
return structs.IndexedCheckServiceNodes{}, cache.ResultMeta{}, err
|
||||||
}
|
}
|
||||||
return *result.Value.(*structs.IndexedCheckServiceNodes), cache.ResultMeta{Index: result.Index}, err
|
meta := cache.ResultMeta{Index: result.Index, Hit: result.Cached}
|
||||||
|
return *result.Value.(*structs.IndexedCheckServiceNodes), meta, err
|
||||||
}
|
}
|
||||||
|
|
||||||
out, md, err := c.getServiceNodes(ctx, req)
|
out, md, err := c.getServiceNodes(ctx, req)
|
||||||
|
|
|
@ -215,9 +215,13 @@ func (m *Materializer) notifyUpdateLocked(err error) {
|
||||||
m.updateCh = make(chan struct{})
|
m.updateCh = make(chan struct{})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Result returned from the View.
|
||||||
type Result struct {
|
type Result struct {
|
||||||
Index uint64
|
Index uint64
|
||||||
Value interface{}
|
Value interface{}
|
||||||
|
// Cached is true if the requested value was already available locally. If
|
||||||
|
// the value is false, it indicates that getFromView had to wait for an update,
|
||||||
|
Cached bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// getFromView blocks until the index of the View is greater than opts.MinIndex,
|
// getFromView blocks until the index of the View is greater than opts.MinIndex,
|
||||||
|
@ -237,6 +241,7 @@ func (m *Materializer) getFromView(ctx context.Context, minIndex uint64) (Result
|
||||||
// haven't loaded a snapshot at all yet which means we should wait for one on
|
// haven't loaded a snapshot at all yet which means we should wait for one on
|
||||||
// the update chan.
|
// the update chan.
|
||||||
if result.Index > 0 && result.Index > minIndex {
|
if result.Index > 0 && result.Index > minIndex {
|
||||||
|
result.Cached = true
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -171,7 +171,7 @@ func (s *Store) Notify(
|
||||||
u := cache.UpdateEvent{
|
u := cache.UpdateEvent{
|
||||||
CorrelationID: correlationID,
|
CorrelationID: correlationID,
|
||||||
Result: result.Value,
|
Result: result.Value,
|
||||||
Meta: cache.ResultMeta{Index: result.Index},
|
Meta: cache.ResultMeta{Index: result.Index, Hit: result.Cached},
|
||||||
}
|
}
|
||||||
select {
|
select {
|
||||||
case updateCh <- u:
|
case updateCh <- u:
|
||||||
|
|
Loading…
Reference in New Issue