@Override public StatusOverrideResult apply(InstanceInfo instanceInfo, Lease<InstanceInfo> existingLease, boolean isReplication) { logger.debug("Returning the default instance status {} for instance {}", instanceInfo.getStatus(), instanceInfo.getId()); return StatusOverrideResult.matchingStatus(instanceInfo.getStatus()); }
public String getStatus(InstanceInfo info) { return info.getStatus().name(); }
public InstanceInfo.InstanceStatus localStatus() { return applicationInfoManager.getInfo().getStatus(); }
@Override public StatusOverrideResult apply(InstanceInfo instanceInfo, Lease<InstanceInfo> existingLease, boolean isReplication) { // ReplicationInstance is DOWN or STARTING - believe that, but when the instance says UP, question that // The client instance sends STARTING or DOWN (because of heartbeat failures), then we accept what // the client says. The same is the case with replica as well. // The OUT_OF_SERVICE from the client or replica needs to be confirmed as well since the service may be // currently in SERVICE if ((!InstanceInfo.InstanceStatus.UP.equals(instanceInfo.getStatus())) && (!InstanceInfo.InstanceStatus.OUT_OF_SERVICE.equals(instanceInfo.getStatus()))) { logger.debug("Trusting the instance status {} from replica or instance for instance {}", instanceInfo.getStatus(), instanceInfo.getId()); return StatusOverrideResult.matchingStatus(instanceInfo.getStatus()); } return StatusOverrideResult.NO_MATCH; }
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { InstanceInfo myInfo = ApplicationInfoManager.getInstance().getInfo(); InstanceStatus status = myInfo.getStatus(); if (status != InstanceStatus.UP && response instanceof HttpServletResponse) { HttpServletResponse httpRespone = (HttpServletResponse) response; httpRespone.sendError(SC_TEMPORARY_REDIRECT, "Current node is currently not ready to serve requests -- current status: " + status + " - try another DS node: "); } chain.doFilter(request, response); }
/** * Populates the provided instance count map. The instance count map is used * as part of the general app list synchronization mechanism. * * @param instanceCountMap * the map to populate */ public void populateInstanceCountMap(Map<String, AtomicInteger> instanceCountMap) { for (Application app : this.getRegisteredApplications()) { for (InstanceInfo info : app.getInstancesAsIsFromEureka()) { AtomicInteger instanceCount = instanceCountMap.computeIfAbsent(info.getStatus().name(), k -> new AtomicInteger(0)); instanceCount.incrementAndGet(); } } }
@Override public List<AwsEndpoint> getClusterEndpoints() { List<AwsEndpoint> result = new ArrayList<>(); Applications applications = applicationsSource.getApplications( transportConfig.getApplicationsResolverDataStalenessThresholdSeconds(), TimeUnit.SECONDS); if (applications != null && vipAddress != null) { List<InstanceInfo> validInstanceInfos = applications.getInstancesByVirtualHostName(vipAddress); for (InstanceInfo instanceInfo : validInstanceInfos) { if (instanceInfo.getStatus() == InstanceInfo.InstanceStatus.UP) { AwsEndpoint endpoint = ResolverUtils.instanceInfoToEndpoint(clientConfig, transportConfig, instanceInfo); if (endpoint != null) { result.add(endpoint); } } } } logger.debug("Retrieved endpoint list {}", result); return result; }
public InstanceInfo.InstanceStatus localStatus() { return applicationInfoManager.getInfo().getStatus(); }
protected void verifyLocalInstanceStatus(String id, InstanceInfo.InstanceStatus status) { InstanceInfo instanceInfo = registry.getApplication(LOCAL_REGION_APP_NAME).getByInstanceId(id); assertThat("InstanceInfo with id " + id + " not found", instanceInfo, is(notNullValue())); assertThat("Invalid InstanceInfo state", instanceInfo.getStatus(), is(equalTo(status))); }
@Override public void handleFailure(int statusCode, Object responseEntity) throws Throwable { super.handleFailure(statusCode, responseEntity); if (statusCode == 404) { logger.warn("{}: missing entry.", getTaskName()); if (info != null) { logger.warn("{}: cannot find instance id {} and hence replicating the instance with status {}", getTaskName(), info.getId(), info.getStatus()); register(info); } } else if (config.shouldSyncWhenTimestampDiffers()) { InstanceInfo peerInstanceInfo = (InstanceInfo) responseEntity; if (peerInstanceInfo != null) { syncInstancesIfTimestampDiffers(appName, id, info, peerInstanceInfo); } } } };
/** * Refresh the current local instanceInfo. Note that after a valid refresh where changes are observed, the * isDirty flag on the instanceInfo is set to true */ void refreshInstanceInfo() { applicationInfoManager.refreshDataCenterInfoIfRequired(); applicationInfoManager.refreshLeaseInfoIfRequired(); InstanceStatus status; try { status = getHealthCheckHandler().getStatus(instanceInfo.getStatus()); } catch (Exception e) { logger.warn("Exception from healthcheckHandler.getStatus, setting status to DOWN", e); status = InstanceStatus.DOWN; } if (null != status) { applicationInfoManager.setInstanceStatus(status); } }
@Test public void testStatusOverrideDeleteIsAppliedToRegistryAndProvidedStatusIsSet() throws Exception { // Override instance status registry.register(testInstanceInfo, false); registry.statusUpdate(testInstanceInfo.getAppName(), testInstanceInfo.getId(), InstanceStatus.OUT_OF_SERVICE, "0", false); assertThat(testInstanceInfo.getStatus(), is(equalTo(InstanceStatus.OUT_OF_SERVICE))); // Remove the override Response response = instanceResource.deleteStatusUpdate("false", "DOWN", "0"); assertThat(response.getStatus(), is(equalTo(200))); assertThat(testInstanceInfo.getStatus(), is(equalTo(InstanceStatus.DOWN))); } }
@Test public void testStatusOverrideDeleteIsAppliedToRegistry() throws Exception { // Override instance status registry.register(testInstanceInfo, false); registry.statusUpdate(testInstanceInfo.getAppName(), testInstanceInfo.getId(), InstanceStatus.OUT_OF_SERVICE, "0", false); assertThat(testInstanceInfo.getStatus(), is(equalTo(InstanceStatus.OUT_OF_SERVICE))); // Remove the override Response response = instanceResource.deleteStatusUpdate("false", null, "0"); assertThat(response.getStatus(), is(equalTo(200))); assertThat(testInstanceInfo.getStatus(), is(equalTo(InstanceStatus.UNKNOWN))); }
@Test public void testHeartbeat() throws Exception { when(instanceResource.renewLease(anyString(), anyString(), anyString(), anyString())).thenReturn(Response.ok().build()); ReplicationInstance replicationInstance = newReplicationInstanceOf(Action.Heartbeat, instanceInfo); Response response = peerReplicationResource.batchReplication(new ReplicationList(replicationInstance)); assertStatusOkReply(response); verify(instanceResource, times(1)).renewLease( "true", replicationInstance.getOverriddenStatus(), instanceInfo.getStatus().name(), Long.toString(replicationInstance.getLastDirtyTimestamp()) ); }
@Test public void testStatusOverrideUpdateAndDelete() throws Exception { // Register first InstanceInfo instanceInfo = instanceInfoIt.next(); jerseyEurekaClient.register(instanceInfo); // Now override status EurekaHttpResponse<Void> overrideUpdateResponse = jerseyEurekaClient.statusUpdate(instanceInfo.getAppName(), instanceInfo.getId(), InstanceStatus.DOWN, instanceInfo); assertThat(overrideUpdateResponse.getStatusCode(), is(equalTo(200))); InstanceInfo fetchedInstance = expectInstanceInfoInRegistry(instanceInfo); assertThat(fetchedInstance.getStatus(), is(equalTo(InstanceStatus.DOWN))); // Now remove override EurekaHttpResponse<Void> deleteOverrideResponse = jerseyEurekaClient.deleteStatusOverride(instanceInfo.getAppName(), instanceInfo.getId(), instanceInfo); assertThat(deleteOverrideResponse.getStatusCode(), is(equalTo(200))); fetchedInstance = expectInstanceInfoInRegistry(instanceInfo); assertThat(fetchedInstance.getStatus(), is(equalTo(InstanceStatus.UNKNOWN))); }
public void doInstanceInfoIgnoredFieldsAreFilteredOutDuringDeserializationProcess(AbstractEurekaJacksonCodec fullCodec, AbstractEurekaJacksonCodec compactCodec) throws Exception { InstanceInfo instanceInfo = infoIterator.next(); // We use regular codec here to have all fields serialized String encodedString = fullCodec.getObjectMapper(InstanceInfo.class).writeValueAsString(instanceInfo); InstanceInfo decodedValue = compactCodec.getObjectMapper(InstanceInfo.class).readValue(encodedString, InstanceInfo.class); assertThat(decodedValue.getId(), is(equalTo(instanceInfo.getId()))); assertThat(decodedValue.getAppName(), is(equalTo(instanceInfo.getAppName()))); assertThat(decodedValue.getIPAddr(), is(equalTo(instanceInfo.getIPAddr()))); assertThat(decodedValue.getVIPAddress(), is(equalTo(instanceInfo.getVIPAddress()))); assertThat(decodedValue.getSecureVipAddress(), is(equalTo(instanceInfo.getSecureVipAddress()))); assertThat(decodedValue.getHostName(), is(equalTo(instanceInfo.getHostName()))); assertThat(decodedValue.getStatus(), is(equalTo(instanceInfo.getStatus()))); assertThat(decodedValue.getActionType(), is(equalTo(instanceInfo.getActionType()))); assertThat(decodedValue.getASGName(), is(equalTo(instanceInfo.getASGName()))); assertThat(decodedValue.getLastUpdatedTimestamp(), is(equalTo(instanceInfo.getLastUpdatedTimestamp()))); AmazonInfo sourceAmazonInfo = (AmazonInfo) instanceInfo.getDataCenterInfo(); AmazonInfo decodedAmazonInfo = (AmazonInfo) decodedValue.getDataCenterInfo(); assertThat(decodedAmazonInfo.get(MetaDataKey.accountId), is(equalTo(sourceAmazonInfo.get(MetaDataKey.accountId)))); }
@Test public void testBatch() throws Exception { InstanceInfo instanceInfo = instanceInfoIt.next(); ReplicationInstance replicationInstance = ReplicationInstance.replicationInstance() .withAction(Action.Register) .withAppName(instanceInfo.getAppName()) .withId(instanceInfo.getId()) .withInstanceInfo(instanceInfo) .withLastDirtyTimestamp(System.currentTimeMillis()) .withStatus(instanceInfo.getStatus().name()) .build(); EurekaHttpResponse<ReplicationListResponse> httpResponse = jerseyReplicationClient.submitBatchUpdates(new ReplicationList(replicationInstance)); assertThat(httpResponse.getStatusCode(), is(equalTo(200))); List<ReplicationInstanceResponse> replicationListResponse = httpResponse.getEntity().getResponseList(); assertThat(replicationListResponse.size(), is(equalTo(1))); assertThat(replicationListResponse.get(0).getStatusCode(), is(equalTo(200))); }
@Test public void testNullResultInstanceStatusMapper() { ApplicationInfoManager.OptionalArgs optionalArgs = new ApplicationInfoManager.OptionalArgs(); optionalArgs.setInstanceStatusMapper(new ApplicationInfoManager.InstanceStatusMapper() { @Override public InstanceInfo.InstanceStatus map(InstanceInfo.InstanceStatus prev) { return null; } }); applicationInfoManager = new ApplicationInfoManager(config, instanceInfo, optionalArgs); InstanceInfo.InstanceStatus existingStatus1 = applicationInfoManager.getInfo().getStatus(); assertNotEquals(existingStatus1, InstanceInfo.InstanceStatus.UNKNOWN); applicationInfoManager.setInstanceStatus(InstanceInfo.InstanceStatus.UNKNOWN); InstanceInfo.InstanceStatus existingStatus2 = applicationInfoManager.getInfo().getStatus(); assertEquals(existingStatus2, existingStatus1); } }
@Test public void testCustomInstanceStatusMapper() { ApplicationInfoManager.OptionalArgs optionalArgs = new ApplicationInfoManager.OptionalArgs(); optionalArgs.setInstanceStatusMapper(new ApplicationInfoManager.InstanceStatusMapper() { @Override public InstanceInfo.InstanceStatus map(InstanceInfo.InstanceStatus prev) { return InstanceInfo.InstanceStatus.UNKNOWN; } }); applicationInfoManager = new ApplicationInfoManager(config, instanceInfo, optionalArgs); InstanceInfo.InstanceStatus existingStatus = applicationInfoManager.getInfo().getStatus(); assertNotEquals(existingStatus, InstanceInfo.InstanceStatus.UNKNOWN); applicationInfoManager.setInstanceStatus(InstanceInfo.InstanceStatus.UNKNOWN); existingStatus = applicationInfoManager.getInfo().getStatus(); assertEquals(existingStatus, InstanceInfo.InstanceStatus.UNKNOWN); }
private static ReplicationInstance createReplicationInstanceOf(InstanceReplicationTask task) { ReplicationInstanceBuilder instanceBuilder = aReplicationInstance(); instanceBuilder.withAppName(task.getAppName()); instanceBuilder.withId(task.getId()); InstanceInfo instanceInfo = task.getInstanceInfo(); if (instanceInfo != null) { String overriddenStatus = task.getOverriddenStatus() == null ? null : task.getOverriddenStatus().name(); instanceBuilder.withOverriddenStatus(overriddenStatus); instanceBuilder.withLastDirtyTimestamp(instanceInfo.getLastDirtyTimestamp()); if (task.shouldReplicateInstanceInfo()) { instanceBuilder.withInstanceInfo(instanceInfo); } String instanceStatus = instanceInfo.getStatus() == null ? null : instanceInfo.getStatus().name(); instanceBuilder.withStatus(instanceStatus); } instanceBuilder.withAction(task.getAction()); return instanceBuilder.build(); } }