private void failover0(FailoverContext context, int retryCount) {
        try {
            if (!recovering.containsKey(context.getFailedNode())) {
                return;
            }
            LOGGER.info("[FAILOVER] start with context={}, retryCount={}", context, retryCount);
            FailoverRequest request = new FailoverRequest();
            request.setNodeId(context.getNodeId());
            request.setNodeEpoch(context.getNodeEpoch());
            request.setKraftWalConfigs(context.getKraftWalConfigs());
            client.failover(request).get();
            LOGGER.info("[FAILOVER] complete with context={}, retryCount={}", context, retryCount);
        } catch (Throwable e) {
            int retryDelay = Math.min(1 << retryCount, 60);
            LOGGER.warn("[FAILOVER] fail, retry later. context={}, retryCount={}, retryDelay={}s", context, retryCount, retryDelay, e);
            if (recovering.containsKey(context.getFailedNode())) {
                scheduler.schedule(() -> failover0(context, retryCount + 1), retryDelay, TimeUnit.SECONDS);
            }
        }
    }
Get the failover contexts from the given metadata delta.
It returns empty if there is no update for the failover key.
core/src/main/java/kafka/automq/failover/FailoverListener.java