This happened probably the first time, but the issue is here:
When old coordinator leaves the cluster, it sends a REBALANCE_START as a goodbye. This will trigger rebalance process on some of the nodes. As we do sync GET_TRANSACTIONS, processing this command may take a while.
However, new coordinator will send CH_UPDATE, which will change the current topologyId to a higher id. This command is processed in LocalTopologyManagerImpl synchronized on cacheStatus, but rebalance command has already left its synchronized block when it executes handler.rebalance.
Then, as the old REBALANCE_START tries to call notifyTransactionDataReceived in its finally block, it finds out that the topologyId has increased and throws an exception. But the rebalance is left in inconsistent state (activeTopologyUpdates are non-zero, potentionally waitForState true, DataRehash listener notification not called...).