-
Type: Bug
-
Resolution: Fixed
-
Priority: Critical - P2
-
Affects Version/s: 3.3.4
-
Component/s: None
-
(copied to CRM)
-
Empty show more show less
I did some tests about connection errors with different options and I got different error each time.
// This code logs errors and read from collection in infinite loop const dbServiceProvider = 'test'; const connString = 'mongodb://xxx:27017,xxx:27017,xxx:27017'; const options = { useNewUrlParser: true, useUnifiedTopology: true, poolSize: 2, ssl: true, authSource: 'admin', replicaSet: 'xxx', auth: { user: 'xxx', password: 'xxx' }, }; async function wait(ms) { return new Promise((resolve) => { setTimeout(resolve, ms); }); } async function connect() { const client = await MongoClient.connect(connString, options); client.on('error', (error) => { if (error) { logger.fatal(error, `Event close client: ${error.message}`); process.exit(1); } }); client.on('close', (info) => { logger.warn('CLOSING!', info); }); client.on('serverClosed', (info) => { logger.warn('serverClosed!', info); }); // reconnectFailed event works only with useUnifiedTopology = false client.topology.on('reconnectFailed', (error) => { logger.fatal(error, `reconnectFailed: ${error.message}`); process.exit(1); }); return client.db(dbServiceProvider); } async function test() { const dbClient = await connect(); while (true) { await wait(2000); try { // const loopResult = await dbManager.findOneById(dbServiceProvider, collection, result._id); const result = await dbClient.collection(collection).find({}).limit(1).toArray(); // logger.info(loopResult, 'data loaded'); console.log('data loaded'); } catch (e) { logger.error(e, 'error'); } } } test();
3.3.4 - useUnifiedTopology=true replica set
I run the code and I tried to stop and restart internet connection (i stopped the internet connection for at least 30sec=> default reconnection timeout).
Sometimes the code is stuck on await dbManager.findOneById: No errors logged, simply the promise will never be resolved. Sometimes instead, randomly, it works correctly, the promise will return correct value.
If I repeat the same test with useUnifiedTopology=false the code doesn't get stuck (the dbClient.collection(collection).find promise throws an exception)