1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- /**
- * 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);
- });
|