// for unit testing, this allows the strategy to be forced for the next time updateState // is called. This is not to be used in prod code. void setStrategy(DegraderLoadBalancerState.Strategy strategy) { DegraderLoadBalancerState newState; newState = new DegraderLoadBalancerState( _state.getUpdateIntervalMs(), _state.getClusterGenerationId(), _state.getPointsMap(), _state.getLastUpdated(), strategy, _state.getCurrentOverrideDropRate(), _state.getCurrentAvgClusterLatency(), _state.isInitialized(), _state.getRecoveryMap(), _state.getServiceName(), _state.getDegraderProperties(), _state.getCurrentClusterCallCount()); _state = newState; }
static boolean isNewStateHealthy( DegraderLoadBalancerState newState, DegraderLoadBalancerStrategyConfig config, List<TrackerClientUpdater> trackerClientUpdaters) { if (newState.getCurrentAvgClusterLatency() > config.getLowWaterMark()) { return false; } Map<URI, Integer> pointsMap = newState.getPointsMap(); for (TrackerClientUpdater clientUpdater : trackerClientUpdaters) { TrackerClient client = clientUpdater.getTrackerClient(); int perfectHealth = (int) (client.getPartitionWeight(DEFAULT_PARTITION_ID) * config.getPointsPerWeight()); Integer point = pointsMap.get(client.getUri()); if (point < perfectHealth) { return false; } } return true; }