Skip to main content
Redhat Developers  Logo
  • Products

    Platforms

    • Red Hat Enterprise Linux
      Red Hat Enterprise Linux Icon
    • Red Hat AI
      Red Hat AI
    • Red Hat OpenShift
      Openshift icon
    • Red Hat Ansible Automation Platform
      Ansible icon
    • See all Red Hat products

    Featured

    • Red Hat build of OpenJDK
    • Red Hat Developer Hub
    • Red Hat JBoss Enterprise Application Platform
    • Red Hat OpenShift Dev Spaces
    • Red Hat OpenShift Local
    • Red Hat Developer Sandbox

      Try Red Hat products and technologies without setup or configuration fees for 30 days with this shared Red Hat OpenShift and Kubernetes cluster.
    • Try at no cost
  • Technologies

    Featured

    • AI/ML
      AI/ML Icon
    • Linux
      Linux Icon
    • Kubernetes
      Cloud icon
    • Automation
      Automation Icon showing arrows moving in a circle around a gear
    • See all technologies
    • Programming languages & frameworks

      • Java
      • Python
      • JavaScript
    • System design & architecture

      • Red Hat architecture and design patterns
      • Microservices
      • Event-Driven Architecture
      • Databases
    • Developer experience

      • Productivity
      • Tools
      • GitOps
    • Automated data processing

      • AI/ML
      • Data science
      • Apache Kafka on Kubernetes
    • Platform engineering

      • DevOps
      • DevSecOps
      • Red Hat Ansible Automation Platform for applications and services
    • Secure development & architectures

      • Security
      • Secure coding
  • Learn

    Featured

    • Kubernetes & cloud native
      Openshift icon
    • Linux
      Rhel icon
    • Automation
      Ansible cloud icon
    • AI/ML
      AI/ML Icon
    • See all learning resources

    E-books

    • GitOps cookbook
    • Podman in action
    • Kubernetes operators
    • The path to GitOps
    • See all e-books

    Cheat sheets

    • Linux commands
    • Bash commands
    • Git
    • systemd commands
    • See all cheat sheets

    Documentation

    • Product documentation
    • API catalog
    • Legacy documentation
  • Developer Sandbox

    Developer Sandbox

    • Access Red Hat’s products and technologies without setup or configuration, and start developing quicker than ever before with our new, no-cost sandbox environments.
    • Explore the Developer Sandbox

    Featured Developer Sandbox activities

    • Get started with your Developer Sandbox
    • OpenShift virtualization and application modernization using the Developer Sandbox
    • Explore all Developer Sandbox activities

    Ready to start developing apps?

    • Try at no cost
  • Blog
  • Events
  • Videos

A Lesson in Debugging: Big Projects Have Critical Bugs Too

June 21, 2016
Cian Clarke
Related topics:
Linux
Related products:
Red Hat OpenShift

Share:

    I recently had an interesting problem which served as a great learning experience. It involves hair-pulling levels of frustration, vicious finger-pointing, and an unexpected ending --- not a TV Soap opera episode, just a day in the life of a developer.

    It all started with a REST API I had built for a customer proof of concept that started refusing requests after an arbitrary period of time. Nothing was unusual in the codebase of the REST API --- it was two simple CRUDL endpoints on equally simple objects.
    I’d built similar many times before, and probably will many times again - but yet still, this process kept hanging, refusing requests. The time it took to fail was arbitrary --- sometimes immediate, sometimes hours, sometimes days.

    Eventually, through some SSH foo we discovered that the count of open file descriptors was growing inside the app's container. I wrote a simple endpoint to query the number of open file descriptors, and it looked like this:

    app.get('/fd', function(req, res){
      var fs = require('fs');
    
      fs.readdir('/proc/self/fd', function(err, list) {
        if (err) {
          return res.status(500).json(err);
        }
        return res.end(list.length.toString());
      });
    });
    

    Indeed, after restarting the process, it was clear that the file descriptor count would grow every few minutes, without stopping. An empty Node.js application didn’t exhibit the same problems, only this app.

     

    Another week went by of monitoring the file descriptor count across a number of scenarios - my thought process went like this:

    1. Maybe it was the version of Express?
    2. Maybe it was the way we set up the Mongoose -> MongoDB Connection? (Many hours spent here..)
    3. Maybe it was the version of Mongoose? (Hint: Warmer..)
    4. Maybe it was some other smaller dependency in the tree?(a week of this passes)
    5. ..maybe it’s the MongoDB Driver itself?

    Bingo. Turns out Version 2.1.8 of the MongoDB Native driver for Node.js leaks sockets in a hard-to-reproduce race condition.

    Lesson learned?

    Well, for one, don’t use mongodb-native@2.1.8.

    More importantly, while I was pointing at the “smaller” community projects, and spent a long long time debugging how I handled database connections, Mongoose handled database connections, never once did I think to try bumping the version of the MongoDB native driver - something I perceived as “rock solid”. Although these leaks were an edge-case, when reproduced the effect was fatal, bringing down the application. It turns out no open source project is too large for a critical bug!

    Special thanks to Shannon Poole from the mobile support team for finding this gem of a bug in the MongoDB Release Notes

    @cianclarke is a Software Engineer with Red Hat Mobile. Primarily focused on the mobile-backend-as-a-service space, Cian is responsible for many of Red Hat’s mBaaS developer features.  

    Last updated: September 19, 2023

    Recent Posts

    • Using eBPF to attribute packet drops to netfilter rules

    • Reduce bootc system update size

    • Deploy an LLM inference service on OpenShift AI

    • Why vLLM is the best choice for AI inference today

    • Happy birthday, Repo! A look back on our mascot’s first year

    Red Hat Developers logo LinkedIn YouTube Twitter Facebook

    Platforms

    • Red Hat AI
    • Red Hat Enterprise Linux
    • Red Hat OpenShift
    • Red Hat Ansible Automation Platform
    • See all products

    Build

    • Developer Sandbox
    • Developer tools
    • Interactive tutorials
    • API catalog

    Quicklinks

    • Learning resources
    • E-books
    • Cheat sheets
    • Blog
    • Events
    • Newsletter

    Communicate

    • About us
    • Contact sales
    • Find a partner
    • Report a website issue
    • Site status dashboard
    • Report a security problem

    RED HAT DEVELOPER

    Build here. Go anywhere.

    We serve the builders. The problem solvers who create careers with code.

    Join us if you’re a developer, software engineer, web designer, front-end designer, UX designer, computer scientist, architect, tester, product manager, project manager or team lead.

    Sign me up

    Red Hat legal and privacy links

    • About Red Hat
    • Jobs
    • Events
    • Locations
    • Contact Red Hat
    • Red Hat Blog
    • Inclusion at Red Hat
    • Cool Stuff Store
    • Red Hat Summit
    © 2025 Red Hat

    Red Hat legal and privacy links

    • Privacy statement
    • Terms of use
    • All policies and guidelines
    • Digital accessibility

    Report a website issue