101 lines
2.5 KiB
JavaScript
101 lines
2.5 KiB
JavaScript
|
/**
|
||
|
* Test case when mysql2 driver strangely exits when one tries to send query
|
||
|
* to dead connection.
|
||
|
*/
|
||
|
|
||
|
const Bluebird = require('bluebird');
|
||
|
const toxiproxy = require('toxiproxy-node-client');
|
||
|
const toxicli = new toxiproxy.Toxiproxy('http://localhost:8474');
|
||
|
const rp = require('request-promise-native');
|
||
|
|
||
|
// drops old toxicproxy and creates new
|
||
|
async function recreateProxy(serviceName, listenPort, proxyToPort) {
|
||
|
try {
|
||
|
await rp.delete({
|
||
|
url: `${toxicli.host}/proxies/${serviceName}`,
|
||
|
});
|
||
|
} catch (err) {
|
||
|
// there was no proxy by that name... its ok
|
||
|
}
|
||
|
|
||
|
const proxy = await toxicli.createProxy({
|
||
|
name: serviceName,
|
||
|
listen: `0.0.0.0:${listenPort}`,
|
||
|
upstream: `${serviceName}:${proxyToPort}`,
|
||
|
});
|
||
|
}
|
||
|
|
||
|
async function insanelyParanoidQuery(con) {
|
||
|
console.log('sending query');
|
||
|
const res = await new Promise((resolve, reject) => {
|
||
|
try {
|
||
|
con.query('select 1', [], function(err, rows, fields) {
|
||
|
if (err) {
|
||
|
reject(err);
|
||
|
} else {
|
||
|
resolve(rows);
|
||
|
}
|
||
|
});
|
||
|
} catch (err) {
|
||
|
console.log('Huh synchronous exception?! (shouldnt be possible)');
|
||
|
reject(err);
|
||
|
}
|
||
|
});
|
||
|
console.log(res);
|
||
|
}
|
||
|
|
||
|
async function main() {
|
||
|
// create proxy from localhost:23306 -> mysqldocker:3306
|
||
|
await recreateProxy('mysql', 23306, 3306);
|
||
|
|
||
|
// ------------- setup mysql2 db driver connection
|
||
|
const mysql2 = require('mysql2'); // with mysql this works...
|
||
|
const mysql2Con = await mysql2.createConnection({
|
||
|
host: 'localhost',
|
||
|
user: 'root',
|
||
|
password: 'mysqlrootpassword',
|
||
|
port: 23306,
|
||
|
});
|
||
|
|
||
|
mysql2Con.on('error', function(err) {
|
||
|
console.log("I'm dead", err);
|
||
|
});
|
||
|
|
||
|
console.log('Going to cut connections');
|
||
|
|
||
|
// cut connection during recreate
|
||
|
await recreateProxy('mysql', 23306, 3306);
|
||
|
|
||
|
console.log('Proxy recreated... start waiting');
|
||
|
|
||
|
// wait forever
|
||
|
while (true) {
|
||
|
await Bluebird.delay(1000);
|
||
|
try {
|
||
|
await insanelyParanoidQuery(mysql2Con);
|
||
|
} catch (err) {
|
||
|
console.log('query failed:', err);
|
||
|
}
|
||
|
await recreateProxy('mysql', 23306, 3306);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
main()
|
||
|
.then(() => console.log('Process stopped normally'))
|
||
|
.catch((err) => {
|
||
|
console.log('Process stopped to failure', err);
|
||
|
});
|
||
|
|
||
|
console.log('Waiting for eventloop to stop...');
|
||
|
|
||
|
process.on('uncaughtException', function(err) {
|
||
|
console.log('uncaughtException', err);
|
||
|
});
|
||
|
|
||
|
process.on('exit', function() {
|
||
|
console.log(
|
||
|
'Did someone call process.exit() or wat? exitCode:',
|
||
|
process.exitCode
|
||
|
);
|
||
|
});
|