Location: MQTTMessageProcessorEndpoint.kt:85, 102, 110
When onAvailable and onLost fire in close succession, both launch coroutines that compete for the connectingLock semaphore:
onAvailable → reconnect() acquires lock → calls disconnect() then connectToBroker() → connection established
onLost → disconnect() is waiting for the lock
reconnect() finishes and releases the lock
onLost acquires the lock → disconnects the freshly established connection
No further reconnect is triggered