Search in sources :

Example 1 with RouteTableException

use of com.alipay.sofa.jraft.rhea.errors.RouteTableException in project sofa-jraft by sofastack.

the class AbstractPlacementDriverClient method getLeader.

protected PeerId getLeader(final String raftGroupId, final boolean forceRefresh, final long timeoutMillis) {
    final RouteTable routeTable = RouteTable.getInstance();
    if (forceRefresh) {
        final long deadline = System.currentTimeMillis() + timeoutMillis;
        final StringBuilder error = new StringBuilder();
        // A newly launched raft group may not have been successful in the election,
        // or in the 'leader-transfer' state, it needs to be re-tried
        Throwable lastCause = null;
        for (; ; ) {
            try {
                final Status st = routeTable.refreshLeader(this.cliClientService, raftGroupId, 2000);
                if (st.isOk()) {
                    break;
                }
                error.append(st.toString());
            } catch (final InterruptedException e) {
                ThrowUtil.throwException(e);
            } catch (final Throwable t) {
                lastCause = t;
                error.append(t.getMessage());
            }
            if (System.currentTimeMillis() < deadline) {
                LOG.debug("Fail to find leader, retry again, {}.", error);
                error.append(", ");
                try {
                    Thread.sleep(10);
                } catch (final InterruptedException e) {
                    ThrowUtil.throwException(e);
                }
            } else {
                throw lastCause != null ? new RouteTableException(error.toString(), lastCause) : new RouteTableException(error.toString());
            }
        }
        // we need refresh configuration for membership change
        final long leftTime = deadline - System.currentTimeMillis();
        if (leftTime > AT_LEAST_REQUIRED_MILLIS) {
            try {
                RouteTable.getInstance().refreshConfiguration(this.cliClientService, raftGroupId, (int) leftTime);
            } catch (final InterruptedException e) {
                ThrowUtil.throwException(e);
            } catch (final TimeoutException ignored) {
            }
        }
    }
    return routeTable.selectLeader(raftGroupId);
}
Also used : RegionRouteTable(com.alipay.sofa.jraft.rhea.client.RegionRouteTable) RouteTable(com.alipay.sofa.jraft.RouteTable) Status(com.alipay.sofa.jraft.Status) RouteTableException(com.alipay.sofa.jraft.rhea.errors.RouteTableException) TimeoutException(java.util.concurrent.TimeoutException)

Example 2 with RouteTableException

use of com.alipay.sofa.jraft.rhea.errors.RouteTableException in project sofa-jraft by sofastack.

the class AbstractPlacementDriverClient method getLeader.

@Override
public Endpoint getLeader(final long regionId, final boolean forceRefresh, final long timeoutMillis) {
    final String raftGroupId = JRaftHelper.getJRaftGroupId(this.clusterName, regionId);
    PeerId leader = getLeader(raftGroupId, forceRefresh, timeoutMillis);
    if (leader == null && !forceRefresh) {
        // Could not found leader from cache, try again and force refresh cache
        leader = getLeader(raftGroupId, true, timeoutMillis);
    }
    if (leader == null) {
        throw new RouteTableException("no leader in group: " + raftGroupId);
    }
    return leader.getEndpoint();
}
Also used : RouteTableException(com.alipay.sofa.jraft.rhea.errors.RouteTableException) PeerId(com.alipay.sofa.jraft.entity.PeerId)

Example 3 with RouteTableException

use of com.alipay.sofa.jraft.rhea.errors.RouteTableException in project sofa-jraft by sofastack.

the class AbstractPlacementDriverClient method getLuckyPeer.

@Override
public Endpoint getLuckyPeer(final long regionId, final boolean forceRefresh, final long timeoutMillis, final Endpoint unExpect) {
    final String raftGroupId = JRaftHelper.getJRaftGroupId(this.clusterName, regionId);
    final RouteTable routeTable = RouteTable.getInstance();
    if (forceRefresh) {
        final long deadline = System.currentTimeMillis() + timeoutMillis;
        final StringBuilder error = new StringBuilder();
        // or in the 'leader-transfer' state, it needs to be re-tried
        for (; ; ) {
            try {
                final Status st = routeTable.refreshConfiguration(this.cliClientService, raftGroupId, 5000);
                if (st.isOk()) {
                    break;
                }
                error.append(st.toString());
            } catch (final InterruptedException e) {
                ThrowUtil.throwException(e);
            } catch (final TimeoutException e) {
                error.append(e.getMessage());
            }
            if (System.currentTimeMillis() < deadline) {
                LOG.debug("Fail to get peers, retry again, {}.", error);
                error.append(", ");
                try {
                    Thread.sleep(5);
                } catch (final InterruptedException e) {
                    ThrowUtil.throwException(e);
                }
            } else {
                throw new RouteTableException(error.toString());
            }
        }
    }
    final Configuration configs = routeTable.getConfiguration(raftGroupId);
    if (configs == null) {
        throw new RouteTableException("empty configs in group: " + raftGroupId);
    }
    final List<PeerId> peerList = configs.getPeers();
    if (peerList == null || peerList.isEmpty()) {
        throw new RouteTableException("empty peers in group: " + raftGroupId);
    }
    final int size = peerList.size();
    if (size == 1) {
        return peerList.get(0).getEndpoint();
    }
    final RoundRobinLoadBalancer balancer = RoundRobinLoadBalancer.getInstance(regionId);
    for (int i = 0; i < size; i++) {
        final PeerId candidate = balancer.select(peerList);
        final Endpoint luckyOne = candidate.getEndpoint();
        if (!luckyOne.equals(unExpect)) {
            return luckyOne;
        }
    }
    throw new RouteTableException("have no choice in group(peers): " + raftGroupId);
}
Also used : Status(com.alipay.sofa.jraft.Status) Configuration(com.alipay.sofa.jraft.conf.Configuration) RoundRobinLoadBalancer(com.alipay.sofa.jraft.rhea.client.RoundRobinLoadBalancer) RouteTableException(com.alipay.sofa.jraft.rhea.errors.RouteTableException) Endpoint(com.alipay.sofa.jraft.util.Endpoint) RegionRouteTable(com.alipay.sofa.jraft.rhea.client.RegionRouteTable) RouteTable(com.alipay.sofa.jraft.RouteTable) Endpoint(com.alipay.sofa.jraft.util.Endpoint) TimeoutException(java.util.concurrent.TimeoutException) PeerId(com.alipay.sofa.jraft.entity.PeerId)

Aggregations

RouteTableException (com.alipay.sofa.jraft.rhea.errors.RouteTableException)3 RouteTable (com.alipay.sofa.jraft.RouteTable)2 Status (com.alipay.sofa.jraft.Status)2 PeerId (com.alipay.sofa.jraft.entity.PeerId)2 RegionRouteTable (com.alipay.sofa.jraft.rhea.client.RegionRouteTable)2 TimeoutException (java.util.concurrent.TimeoutException)2 Configuration (com.alipay.sofa.jraft.conf.Configuration)1 RoundRobinLoadBalancer (com.alipay.sofa.jraft.rhea.client.RoundRobinLoadBalancer)1 Endpoint (com.alipay.sofa.jraft.util.Endpoint)1