brainbolt
brainbolt

Reputation: 616

Node GeoFire memory leak?

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.

memory consumption charted by memory-usage

Any idea about what is going on here?

This is running on:

Upvotes: 1

Views: 275

Answers (1)

cartant
cartant

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

Related Questions