Reputation: 616
I have what appears to be some very basic firebase + firebase-queue + GeoFire code running on Node which appears to result in a memory leak, but I'm not convinced that I'm not screwing something up somewhere.
'use strict';
if (!process.env.FIREBASE_PROJECT_ID) {
require('dotenv').config({ silent: true });
}
let fbConfig = require('./firebase-config');
let fbNodes = fbConfig.NODES;
let Queue = require('firebase-queue');
let admin = require("firebase-admin");
let GeoFire = require('geofire');
admin.initializeApp({
credential: admin.credential.cert(fbConfig.FIREBASE_SERVICE_ACCOUNT),
databaseURL: fbConfig.APP_SETTINGS.databaseURL
});
let db = admin.database();
let queueRef = db.ref(fbNodes.QUEUE);
let geoFire = new GeoFire(db.ref(fbNodes.GEOFIRE));
var q = new Queue(queueRef, function (data, progress, resolve, reject) {
let geoQuery = geoFire.query({
center: data.queryCenter,
radius: data.maxDistanceKm
});
// fires for every key returned by the geoQuery
let listener = geoQuery.on('key_entered', function (key, loc, dist) {
// do nothing
});
// This will fire once the initial data is loaded, so now we can cancel
// the "key_entered" event listener
geoQuery.on('ready', function () {
listener.cancel();
resolve();
});
});
Here is a chart of the memory consumption from memory-usage which shows this code gobbling up 1.5 GB of memory after about 10 minutes and 1100 tasks resolved until it crashes.
Any idea about what is going on here?
This is running on:
Upvotes: 1
Views: 275
Reputation: 58400
The leak is caused by the GeoFire queries. Each time a task from the queue is processed, a query is created, but those queries are never cancelled - only their listener's are.
To plug the leak, call cancel
on the queries when you are done. For example:
geoQuery.on('ready', function () {
listener.cancel();
geoQuery.cancel();
resolve();
});
Upvotes: 2