pouchdb-server icon indicating copy to clipboard operation
pouchdb-server copied to clipboard

express-pouchdb allocates infinite memory when given a defunct PouchDB

Open ben0x539 opened this issue 4 years ago • 0 comments

var http = require('http');
var PouchDB = require('pouchdb');

var app = require('express-pouchdb')(PouchDB.defaults({
  prefix: './non-existent-path/',
}))

app.listen(3000, function() {
  http.get('http://localhost:3000/db/hello'); // delayed explosion
});

(node:13549) UnhandledPromiseRejectionWarning: OpenError: IO error: ./non-existent-path/_replicator/LOCK: No such file or directory

Despite the warning, we continue on with a non-functional pouchdb object backing those routes. When trying to handle a request, this bit of code gets stuck forever while allocating more and more promises:

https://github.com/pouchdb/pouchdb-server/blob/ef24d7d4670fd1b08b9d82778e91e7e0b8936c1c/packages/node_modules/express-pouchdb/lib/routes/authentication.js#L55-L65

After busylooping while growing to a few gigabytes in size, node gets fed up and terminates.

This could probably be mitigated by only using one promise there and only repeating the setImmediate (or even setTimeout) call, but ultimately we should probably just be erroring out earlier and not let it come that far.

It's a very low impact crash that's easily avoided, but jumping into an unfamiliar codebase and not realizing the significance of the above warning, it took me a while to catch on. :)

ben0x539 avatar Jul 06 '20 08:07 ben0x539