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