@Override public void updateServiceEndpoints(LoadBalancerUpdate updates) { mutex.writeLock().lock(); try { Marker logMarker = append("serviceName", this.serviceName); for (ServiceEndpoint ep : updates.getNewServices()) { logger.debug(logMarker, "Endpoint for {} became available: {}", this.serviceName, ep.getHostAndPort()); addServiceEndpoint(ep); } for (ServiceEndpoint ep : updates.getDeletedServices()) { logger.debug(logMarker, "Endpoint for {} became unavailable: {}", this.serviceName, ep.getHostAndPort()); updateEndpointHealth(ep, CircuitBreakerState.State.UNHEALTHY); } for (ServiceEndpoint ep : updates.getUpdatedServices()) { logger.debug(logMarker, "Health of endpoint {} of {} changed to {}", ep.getHostAndPort(), this.serviceName, ep.getCircuitBreakerState()); updateEndpointHealth(ep, ep.getCircuitBreakerState()); } } finally { mutex.writeLock().unlock(); } }
protected void reportInitialServicesList(List<ConsulHealthEntry> instances) { LoadBalancerUpdate update = new LoadBalancerUpdate(); for (ConsulHealthEntry service : instances) { update.addNewService(newServiceEndpoint(service)); discoveredServices.put(service.getId(), service); } loadbalancer.updateServiceEndpoints(update); }
LoadBalancerUpdate retval = new LoadBalancerUpdate(); if (! service.getStatus().equals(ConsulHealthEntry.Status.Critical)) { service.setStatus(ConsulHealthEntry.Status.Critical); retval.addDeletedService(newServiceEndpoint(service)); retval.addNewService(newServiceEndpoint(entry)); discoveredServices.put(entry.getId(), entry); previous.getStatus().equals(ConsulHealthEntry.Status.Critical)) { previous.setStatus(ConsulHealthEntry.Status.Passing); retval.addUpdatedService(newServiceEndpoint(previous)); } else if (! health.getStatus().equals(ConsulHealthEntry.Status.Passing) && previous.getStatus().equals(ConsulHealthEntry.Status.Passing)) { previous.setStatus(ConsulHealthEntry.Status.Critical); retval.addUpdatedService(newServiceEndpoint(previous));
@Test public void serviceAppearsAfterStartup() throws Exception { //there was a bug where if a consumed service wasn't available at startup, //even when it came online later, it wouldn't be tracked. String emptyHealthInfo = "[]"; when(response.getContentAsString()).thenReturn(emptyHealthInfo). thenReturn(healthInfo); LoadBalancer lb = mock(LoadBalancer.class); worker.setLoadbalancer(lb); worker.shutdownSemaphore.release(); worker.sleeper = mock(Sleeper.class); worker.run(); ArgumentCaptor<LoadBalancerUpdate> captor = ArgumentCaptor.forClass(LoadBalancerUpdate.class); verify(lb, times(1)).updateServiceEndpoints(captor.capture()); assertThat(captor.getAllValues()).hasSize(1); LoadBalancerUpdate secondUpdate = captor.getAllValues().get(0); assertThat(secondUpdate.getNewServices()).isNotEmpty(); }
protected void watchForUpdates() { List<ConsulHealthEntry> instancesHealth = loadCurrentHealthList(); LoadBalancerUpdate lbUpdate = diffServiceStatus(instancesHealth); if (! lbUpdate.isEmpty()) { loadbalancer.updateServiceEndpoints(lbUpdate); } }