Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds support for fine-grained watches in blocking queries. #2671

Merged
merged 19 commits into from
Jan 26, 2017

Conversation

slackpad
Copy link
Contributor

@slackpad slackpad commented Jan 24, 2017

This uses the newly-added watch support in go-memdb (via go-immutable-radix) to add fine-grained watches in blocking queries. This let us remove a bunch of hand-rolled code in the state store, and it means that when service X changes, it doesn't wake up callers blocking on service Y (fixes #1244). It also applies to all other areas of the state store.

In order to make this work, we also avoid no-op updates to node and service structures when only checks change. This helps prevent index churn on those upper structures and avoids extra unblocks.

The change in indexing did result in a slight change for KV watches, where there might be more spurious wakeups while waiting for a key to be created. This is the cheapest thing we can serve, so for now we will leave the code simple (it's at least a prefix watch), but we may want to consider a special case to make that more efficient if folks notice any performance impact from that.

@slackpad slackpad added the type/enhancement Proposed improvement or new feature label Jan 24, 2017
@slackpad slackpad added this to the 0.7.3 milestone Jan 24, 2017
@slackpad slackpad requested a review from kyhavlov January 24, 2017 20:00
Copy link
Contributor

@kyhavlov kyhavlov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking good! 👍

We can't actually return a fine-grained index from these tables unless
support is added for tombstones. Otherwise, the index could slip backwards
as things are deleted.
We always did an update before which caused excessive watch churn, even
with our new fine-grained queries. This does a diff any only updates the
node and service records if something actually changed.
Previously the blocking functions all closed over the state store from
their first query, with would not have worked properly when a restore
occurred. This makes sure they get a frest state store pointer each time,
and that pointer is synchronized with the abandon watch.
@jippi
Copy link
Contributor

jippi commented Jan 25, 2017

Amazing, good job @slackpad !

@slackpad slackpad merged commit 4bd0da7 into master Jan 26, 2017
@slackpad slackpad deleted the f-fine-watch branch January 26, 2017 00:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type/enhancement Proposed improvement or new feature
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Blocking calls on /v1/health/service/<service> never block, resulting in request flooding
3 participants