Optimize write checkpoint lookups when users have none #355
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
#276 included some significant optimizations to how write checkpoint lookups are performed. In general, the strategy is:
checkpoint_events
capped collection for new checkpoints.When a new stream is opened, we need to get the initial write checkpoint for the user, before we can use the above approach to efficiently get changes. The implementation in #276 mostly handled that.
However, there was one missed case: If the user does not have any write checkpoint, it would retry the lookup on every new checkpoint. In a case of thousands of concurrent connections and no write checkpoints, we can end up with doing tens of thousands of write checkpoint lookups per second. Even if the write checkpoint collection is empty, this still ends up adding multiple megabytes/s traffic between the instance and the storage database just for sending the query and receiving the empty results.
This fixes the issue by adding a boolean to keep track of whether or not we have done the initial query, instead of using a null check on the write checkpoint.
This change has no effect on users that do have a write checkpoint.