-
-
Notifications
You must be signed in to change notification settings - Fork 3.9k
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
ChangeStream stops working after some time #13607
Labels
confirmed-bug
We've confirmed this is a bug in Mongoose and will fix it.
Milestone
Comments
vkarpov15
added a commit
that referenced
this issue
Aug 14, 2023
'use strict';
const mongoose = require('mongoose');
void async function main() {
const uri = 'mongodb://127.0.0.1:27017,127.0.0.1:27018/mongoose_test';
await mongoose.connect(uri);
const Person = mongoose.model('Person', mongoose.Schema({ name: String }));
await Person.createCollection();
// Create a change stream. The 'change' event gets emitted when there's a
// change in the database
const changeStream = await Person.watch();
changeStream.on('change', data => console.log(new Date(), data));
changeStream.on('resumeTokenChanged', data => console.log(new Date(), 'resumeTokenChanged', data));
changeStream.on('error', data => console.log(new Date(), 'error', data));
changeStream.on('close', data => console.log(new Date(), 'close', data));
await new Promise(resolve => setTimeout(resolve, 1000));
// Insert a doc, will trigger the change stream handler above
console.log(new Date(), 'Inserting doc');
await Person.create({ name: 'Axl Rose' });
console.log(new Date(), 'Inserted doc');
}(); Prints the following output if I kill the entire replica set after a few seconds:
|
vkarpov15
added a commit
that referenced
this issue
Aug 15, 2023
fix(cursor): bubble up resumeTokenChanged event from change streams
2 tasks
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Discussed in #13602
Originally posted by thaoula July 11, 2023
Hi All,
We are trying to utilise ChangeStreams using Mongoose and have encountered some challenges with reliability.
We have the following issues:
For some unknown reason, our DB level ChangeStream which is connected to an Atlas Cluster stops receiving changes. We do not get any errors even though we are using ChangeStream.on('error') listener. Nothing is logged.
When this happens, restarting the container but keeping the resume token i.e we are setting resumeAfter does not work. We only get changes after deleting the resume token and restarting the container.
Before logging some Github issues I wanted to see if anyone has experienced problems like this and whether you have some tips.
What Works
For some unknown reason (maybe low activity due to weekend or overnight, or primary changes), the change stream stops receiving change events. I am not sure how to debug this issue as no event listeners are called on the change stream. ie. error, resumeTokenChanged, closed events are never ever triggered.
By chance after reviewing the mongoose code and noticing the returned changestream was a wrapped object, I decided to just use connection.getClient().watch which returns a mongdb native ChangeStream and I am able to successfully listen to resumeTokenChanged, closed, change and error events as I would have expected when using connection.watch().
When using this approach, I suprisingly found that the resumeTokenChanged event is called almost once per second and the token is changing. Also, the token returned by this event is also much shorter than the resume token that is provided in the change event.
I also noticed that if i stop the database (test failure) the change stream is closed (it calls the close event listener) and it is able to resume when i restart the database server.
My questions are -
Sorry for the all the questions.
Regards,
Tarek
The text was updated successfully, but these errors were encountered: