public void updateEndpointHealth(ServiceEndpoint ep, CircuitBreakerState.State state) { mutex.readLock().lock(); try { ServiceEndpointNode current = returnNext; int count = size; for (int i = 0; i < count; i++) { if (current.value.getHostAndPort().equals(ep.getHostAndPort())) { current.value.setCircuitBreakerState(state); return; } current = current.next; } logger.error("updateEndpointHealth: endpoint not found: {}", ep.toString()); } finally { mutex.readLock().unlock(); } }
protected ServiceEndpoint newServiceEndpoint(ConsulHealthEntry entry) { ServiceEndpoint retval = new ServiceEndpoint(executor, entry.getAddressAndPort(), entry.getAvailZone(), dependencyHealthCheck); retval.setServiceName(serviceName); if (ConsulHealthEntry.Status.Passing.equals(entry.getStatus())) { //TODO: this might need some more work. a flapping service in consul should //not bypass normal circuit breaker logic. retval.setCircuitBreakerState(CircuitBreakerState.State.PRIMARY_HEALTHY); } else { retval.setCircuitBreakerState(CircuitBreakerState.State.UNHEALTHY); } return retval; }
@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); }