@Override public void waitForServiceInstance() { while (true) { if (getHealthyInstance() != null) { break; } try { notificationSemaphore.tryAcquire(1, 100, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { logger.warn("Thread was interrupted", e); break; } } logger.debug("Found service instance of {}", serviceName); }
@Override public ServiceEndpoint getHealthyInstanceExclude(List<ServiceEndpoint> triedEndpoints) { mutex.readLock().lock(); try { Set<ServiceEndpoint> set = new HashSet<>(triedEndpoints); Set<ServiceEndpoint> seenInstances = new HashSet<>(); while (true) { ServiceEndpoint retval = getHealthyInstance(); if (FeatureFlags.shouldDisableRpcInstanceRetry(serviceProps)) { if (seenInstances.contains(retval)) { //we've made a complete loop return null; } if (set.contains(retval)) { seenInstances.add(retval); continue; } } return retval; } } finally { mutex.readLock().unlock(); } }
@Test public void probesOnlyGetOneRequest() { ServiceEndpoint ep1 = new ServiceEndpoint(null, "1.1.1.1:80", "dc1", dependencyHealthCheck); ep1.setCircuitBreakerState(CircuitBreakerState.State.PRIMARY_TRIPPED); ServiceEndpoint ep2 = new ServiceEndpoint(null, "1.1.1.2:80", "dc1", dependencyHealthCheck); ep2.setCircuitBreakerState(CircuitBreakerState.State.PRIMARY_PROBE); lb.addServiceEndpoint(ep1); lb.addServiceEndpoint(ep2); assertThat(lb.getHealthyInstance()).isEqualTo(ep2); assertThat(lb.getHealthyInstance()).isNull(); }
@Test public void mostlyUnhealthySingleAz() { ServiceEndpoint ep1 = new ServiceEndpoint(null, "1.1.1.1:80", "dc1", dependencyHealthCheck); ep1.setCircuitBreakerState(CircuitBreakerState.State.PRIMARY_TRIPPED); ServiceEndpoint ep2 = new ServiceEndpoint(null, "1.1.1.2:80", "dc1", dependencyHealthCheck); ep2.setCircuitBreakerState(CircuitBreakerState.State.PRIMARY_TRIPPED); ServiceEndpoint ep3 = new ServiceEndpoint(null, "1.1.1.3:80", "dc1", dependencyHealthCheck); ep3.setCircuitBreakerState(CircuitBreakerState.State.PRIMARY_TRIPPED); ServiceEndpoint ep4 = new ServiceEndpoint(null, "1.1.1.4:80", "dc1", dependencyHealthCheck); ep4.setCircuitBreakerState(CircuitBreakerState.State.PRIMARY_TRIPPED); lb.addServiceEndpoint(ep1); lb.addServiceEndpoint(ep2); lb.addServiceEndpoint(ep3); lb.addServiceEndpoint(ep4); assertThat(lb.getHealthyInstance()).isNull(); ServiceEndpoint ep5 = new ServiceEndpoint(null, "1.1.1.5:80", "dc1", dependencyHealthCheck); lb.addServiceEndpoint(ep5); assertThat(lb.getHealthyInstance()).isEqualTo(ep5); }