/* * Copyright 2013-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.cloud.aws.jdbc.retry; import org.springframework.cloud.aws.core.support.documentation.RuntimeUse; /** * Enumeration that holds all possible Amazon RDS database instance states. Used by client code to check if the * database is available at all, and to verify if a retry is useful. * * @author Agim Emruli * @since 1.0 */ public enum InstanceStatus { /** * Database state that is available during creation of the database. This is typically the case if the database is * started at the same time like the application is bootstrapped. In this case a retry will succeed. */ @RuntimeUse CREATING(true, false), /** * Database state that defines that the database is available. The database can be used at all, also a retry for a * temporary problem (like a dead-lock) is likely to succeed if called twice. */ @RuntimeUse AVAILABLE(true, true), /** * Database state which defines that the database instance is rebooting. This can happen during a user initiated * reboot. A second attempt is likely to succeed especially in the combination with a replicated Multi A/Z instance. */ @RuntimeUse REBOOTING(true, false), /** * Database state which defines that the database instance is modifying. The database is still available and usable, * but a modification is in progress. This can be the case if an read-replica instance is added to the database itself. */ @RuntimeUse MODIFYING(true, true), /** * Database state which defines that the database is deleting. Thus it is assumed that is is deleted. */ @RuntimeUse DELETING(false, false), /** * Unknown status, which assumes the database is not available and not retryable */ @RuntimeUse UNKNOWN(false, false); /** * boolean flag indicating if a second attempt to execute the operation will succeed */ private final boolean retryable; /** * boolean flag indicating if the database is available from the management perspective of Amazon RDS */ private final boolean available; InstanceStatus(boolean retryable, boolean available) { this.retryable = retryable; this.available = available; } /** * Operation that returns <code>true</code> if a second call will likely succeed. This is typically the case if the * database is down for temporary reasons like a reboot after a configuration change, or a multi a/z failover until * the DNS record is updated. Clients should wait some time (e.g. up until 3 minutes) before retrying their last * database operation. * * @return <code>true</code> if the operation is retryable, <code>false</code> otherwise */ public boolean isRetryable() { return this.retryable; } /** * Operation that returns <code>true</code> if the database is available from the Amazon RDS perspective. That does * not necessarily mean that there is a connection possible to that database itself. Due to wrong/missing rule in * the security credentials it might be possible that a database is available but not connectible through the JDBC * protocol. * * @return <code>true</code> if the database is available, <code>false</code> otherwise */ public boolean isAvailable() { return this.available; } static InstanceStatus fromDatabaseStatus(String databaseStatus) { for (InstanceStatus instanceStatus : values()) { if (instanceStatus.name().equalsIgnoreCase(databaseStatus)) { return instanceStatus; } } return UNKNOWN; } }