github RunOnFlux/flux v8.7.0

6 hours ago

Release v8.7.0 containing critical stability fixes, performance optimizations, and new health check features.

Critical Fixes

  • Fix isPortOpen() socket timeout hang — Added a settled flag and consolidated cleanup logic to prevent infinite Promise hangs when network
    connections timeout. The timeout handler now properly rejects instead of leaving Promises unresolved, which was causing spawner hangs across nodes.
  • Convert AsyncLock from mutex to semaphore — Changed AsyncLock to support 5 concurrent holders, breaking a circular dependency where long-running
    RPC calls (e.g. createConfirmationTransaction) blocked unrelated requests like loginPhrase, causing ~30s hangs after port reconfiguration.
  • Graceful container shutdown on reboot/sigterm — appDockerStop() now accepts a configurable timeout parameter, enabling parallel container stopping
    with force-kill fallback. Reduces shutdown time from potentially N×10s to ~9s regardless of container count.

Features

  • App location validation on boot — Before restarting stopped apps, validates that the node still has a valid (non-expired) location record. If the
    app was reassigned to another node, it is removed locally instead of restarted.
  • Orbit (Deploy with Git) health checks — Added checkOrbitAppHealth() that polls the /api/status endpoint during test installations, checking build
    status over ~2 minutes before passing or failing the install.
  • Explicit expireAt on sigterm location updates — handleNodeSigtermMessage() now sets both broadcastedAt and expireAt fields with a 7-minute
    expiration window.

Performance

  • Increase listrunningapps cache from 5s to 15s — Reduces Docker API pressure from multiple FDM instances polling concurrently, which was causing
    excessive load and false health check failures.

Files Changed

  • ZelBack/src/services/fluxNetworkHelper.js — isPortOpen() race condition fix
  • ZelBack/src/services/utils/asyncLock.js — Semaphore-based lock implementation
  • ZelBack/src/services/daemonService/daemonServiceUtils.js — Use semaphore lock
  • ZelBack/src/services/dockerService.js — Configurable stop timeout
  • ZelBack/src/services/appLifecycle/appInstaller.js — Orbit health check
  • ZelBack/src/services/appLifecycle/stoppedAppsRecovery.js — Location validation on boot
  • ZelBack/src/services/fluxCommunication.js — expireAt field on sigterm
  • ZelBack/src/routes.js — Cache duration increase
  • tests/unit/asyncLock.test.js — Semaphore unit tests
  • tests/unit/stoppedAppsRecovery.test.js — Recovery unit tests

Don't miss a new flux release

NewReleases is sending notifications on new releases.