Fix MongoDB replication with mixed _id types #290
Merged
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.
The issue
This is a regression in v1.13.0.
In #163, we changed initial snapshot queries on MongoDB to chunk on _id, using
{_id: {$gt: ...}}queries to filter out earlier chunks. The issue is that when the same collection uses different types for the_idfield, the$gtoperator only returns documents with the same type. That meant that when you have a large collection with for example both string and ObjectId _ids, only the documents with string_idwould replicate in the initial snapshot.This would be visible in the logs, with the collection finishing replicating with mismatching counts, such as:
The fix
This changes the snapshot query to
{ $expr: { $gt: ['$_id', { $literal: ... }] } }. This is almost the same, but the$exprversion respects the total ordering of BSON types (same as the sort stage), and doesn't filter out the other types. It still uses the _id index.