balderdashy / sails

Realtime MVC Framework for Node.js
https://sailsjs.com
MIT License
22.84k stars 1.95k forks source link

connect-pg-simple takes 10s to shutdown #6817

Open alxndrsn opened 5 years ago

alxndrsn commented 5 years ago

Node version: 10.16.0 Sails version (sails): 1.2.3 ORM hook version (sails-hook-orm): DB adapter & version (e.g. sails-mysql@5.55.5): sails-postgresql 1.0.2


connect-pg-simple takes 10s to shutdown at the end of tests.

Example project at: https://github.com/alxndrsn/sailsjs-connect-pg-simple-shutdown-delay

To recreate:

git clone https://github.com/alxndrsn/sailsjs-connect-pg-simple-shutdown-delay
cd sailsjs-connect-pg-simple-shutdown-delay
$ yarn test
...
  connect-pg-simple leaves a hanging promise
    βœ“ leaves a hanging promise...

  1 passing (542ms)

Done.
Done in 11.73s.
$ IN_MEMORY_SESSIONS=true yarn test
...
  connect-pg-simple leaves a hanging promise
    βœ“ leaves a hanging promise...

  1 passing (530ms)

Done.
Done in 1.70s.
sailsbot commented 5 years ago

@alxndrsn Thanks for posting! We'll take a look as soon as possible.

In the mean time, there are a few ways you can help speed things along:

Please remember: never post in a public forum if you believe you've found a genuine security vulnerability. Instead, disclose it responsibly.

For help with questions about Sails, click here.

alxndrsn commented 5 years ago

It seems you can work around this by manually destroying the session postgresql pool, using sails.config.session.store.close();.

In the example project, this can be done by changing test/config.js to:

const sails = require('sails');

before(done => {
  sails.lift({}, err => {
    if (err) { return done(err); }
    return done();
  });
});

after(done => {
  sails.lower(() => {
    sails.config.session.store.close();
    done();
  });
});
johnabrams7 commented 5 years ago

@alxndrsn Thanks for exploring this shutdown delay with repro steps and a workaround. At the moment, our primary adapter in development sails-sql will improve upon sails-postgresql so this will be considered among development plans. Any further input of related applications / experiences from the community are welcome.

alxndrsn commented 5 years ago

@johnabrams7 I'd be interested to hear what sails-sql will do differently to sails-postgresql; is there any documentation? Will it handle sessions, or will connect-pg-simple still be required?

johnabrams7 commented 5 years ago

@alxndrsn - So far, Postgres support in sails-sql won't be entirely different from the sails-postgresql adapter to start and will require Node v8+. connect-pg-simple will still be required as far I know. It's more of an effort to bring all the SQL adapters together to allow for more efficient development, releases, db flexibility. I know mysql and mssql have had more improvements in sails-sql, but postgresql improvements will come in good time.

alxndrsn commented 5 years ago

This also prevents sails console or sails lift from shutting down quickly.

Again this can be worked around by calling sails.config.session.store.close(); in the callback from sails.lift() in app.js:

// Start server
sails.lift(rc('sails'), err => {
  if(err) {
    console.error('Failed to lift app:', err);

    try {
      sails.config.session.store.close();
    } catch(err2) {
      console.error('Error caught trying to shut down postgres session store:', err2);
    }

    return;
  }

  sails.log.verbose('App lifted successfully.');
});
johnabrams7 commented 4 years ago

@alxndrsn Appreciate the update & workaround! Will get this documented in the postgresql development notes.

alxndrsn commented 4 years ago

@johnabrams7 would it be suitable to add the following to sails-postgresql?

process.on('SIGTERM', () => {
  try {
    sails.config.session.store.close();
  } catch(err) {
    console.error('Error caught trying to shut down postgres session store:', err);
  }
});

If so, any pointers where would be a suitable place to put this?

johnabrams7 commented 4 years ago

@alxndrsn Actually, sorry just realized connect-pg-simple is used as the session hook and sails-postgresql honestly has nothing to do with it πŸ˜„. This being said, a solution would reside in a change to connect-pg-simple -OR- the session hook itself in Sails without changing connect-pg-simple. If you have any ideas for that let us know! πŸ‘‚

alxndrsn commented 4 years ago

@johnabrams7 is there a way to add a beforeShutdown function from the session hook?

johnabrams7 commented 4 years ago

@alxndrsn Yes, you could override the session hook by creating api/hooks/session/ and copying what’s in sails core + modifying the teardown function.