- Implement Redis lease-based distributed lock
-
tryAcquire()— SET key value NX PX -
renew()— Lua script for atomic check-and-renew -
release()— Lua script for atomic conditional DEL -
isLeader()— check if current instance holds lease -
getCurrentLeader()— get current lease holder from Redis - Periodic renewal loop (start/stop)
- Clear logging on state transitions
- Add
INSTANCE_IDenv var (default: auto-generated from hostname + random suffix) - Add
LEASE_TTL_MSenv var (default: 15000) - Add
LEASE_RENEW_INTERVAL_MSenv var (default: 5000) - Export
leaderElectionconfig section
- Factory that wraps job modules
- Only activates underlying job when leader
- Reacts to leadership transitions (acquire/renew/release)
- Graceful lease release on stop
- Extended getHealth() with leadership info
- Clear logging: "acting as follower" / "acquired leader lease"
- Import leader election service and leader-aware job wrapper
- Create leader election instances for price_refresh, webhook_retry, airdrop_expiry
- Wrap all three background jobs with leader-aware wrapper
- Use wrapped jobs in startServer()
- Use wrapped jobs in shutdown() (await stop for graceful lease release)
- Update health endpoint to include leadership state per job
- Add
leader_electionsection to health response - Clean up duplicate/broken code
- Document leader-election mechanism
- Document failover timing (TTL + renewal gap)
- New env vars table entries
- How to verify which replica holds the lock
- Test file created with comprehensive test suite