ATLAS-2769: Atlas start just after the upgrade fails with 'TableNotFoundException: atlas_janus' exception
(cherry picked from commit 78cfd718444e81426334ef2e3fdae9b467e60cd1) Project: http://git-wip-us.apache.org/repos/asf/atlas/repo Commit: http://git-wip-us.apache.org/repos/asf/atlas/commit/a7a9c0ef Tree: http://git-wip-us.apache.org/repos/asf/atlas/tree/a7a9c0ef Diff: http://git-wip-us.apache.org/repos/asf/atlas/diff/a7a9c0ef Branch: refs/heads/branch-1.0 Commit: a7a9c0ef9c69dd827e34cb2ff4e82e76a21c1a59 Parents: db152cf Author: Sarath Subramanian <ssubraman...@hortonworks.com> Authored: Thu Jun 28 14:43:11 2018 -0700 Committer: Madhan Neethiraj <mad...@apache.org> Committed: Sun Jul 1 15:32:09 2018 -0700 ---------------------------------------------------------------------- .../repository/graph/AtlasGraphProvider.java | 70 +++++++++++++++++++- 1 file changed, 67 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/atlas/blob/a7a9c0ef/repository/src/main/java/org/apache/atlas/repository/graph/AtlasGraphProvider.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/graph/AtlasGraphProvider.java b/repository/src/main/java/org/apache/atlas/repository/graph/AtlasGraphProvider.java index 55934c3..211d2ac 100755 --- a/repository/src/main/java/org/apache/atlas/repository/graph/AtlasGraphProvider.java +++ b/repository/src/main/java/org/apache/atlas/repository/graph/AtlasGraphProvider.java @@ -19,10 +19,14 @@ package org.apache.atlas.repository.graph; import com.google.common.annotations.VisibleForTesting; +import org.apache.atlas.ApplicationProperties; +import org.apache.atlas.AtlasException; import org.apache.atlas.repository.RepositoryException; import org.apache.atlas.repository.graphdb.AtlasGraph; import org.apache.atlas.repository.graphdb.GraphDatabase; import org.apache.atlas.util.AtlasRepositoryConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -33,7 +37,15 @@ import org.springframework.context.annotation.Configuration; @Configuration public class AtlasGraphProvider implements IAtlasGraphProvider { - private static volatile GraphDatabase<?,?> graphDb_; + private static volatile GraphDatabase<?,?> graphDb_; + + private static final Logger LOG = LoggerFactory.getLogger(AtlasGraphProvider.class); + private static final Integer MAX_RETRY_COUNT = getMaxRetryCount(); + private static final Long RETRY_SLEEP_TIME_MS = getRetrySleepTime(); + private static final String GRAPH_REPOSITORY_MAX_RETRIES = "atlas.graph.repository.max.retries"; + private static final String GRAPH_REPOSITORY_RETRY_SLEEPTIME = "atlas.graph.repository.retry.sleeptime.ms"; + + private static org.apache.commons.configuration.Configuration APPLICATION_PROPERTIES = null; public static <V, E> AtlasGraph<V, E> getGraphInstance() { GraphDatabase<?,?> db = getGraphDatabase(); @@ -67,7 +79,59 @@ public class AtlasGraphProvider implements IAtlasGraphProvider { @Override @Bean(destroyMethod = "") - public AtlasGraph get() throws RepositoryException { - return getGraphInstance(); + public AtlasGraph get() throws RepositoryException{ + try { + return getGraphInstance(); + } catch (Exception ex) { + LOG.info("Failed to obtain graph instance, retrying " + MAX_RETRY_COUNT + " times, error: " + ex); + + return retry(); + } + } + + private AtlasGraph retry() throws RepositoryException { + int retryCounter = 0; + + while (retryCounter < MAX_RETRY_COUNT) { + try { + // Retry after 30 sec to get graph instance + Thread.sleep(RETRY_SLEEP_TIME_MS); + + return getGraphInstance(); + } catch (Exception ex) { + retryCounter++; + + LOG.info("Failed to obtain graph instance on retry " + retryCounter + " of " + MAX_RETRY_COUNT + " error: " + ex); + + if (retryCounter >= MAX_RETRY_COUNT) { + LOG.info("Max retries exceeded."); + break; + } + } + } + + throw new RepositoryException("Max retries exceeded. Failed to obtain graph instance after " + MAX_RETRY_COUNT + " retries"); + } + + private static Integer getMaxRetryCount() { + initApplicationProperties(); + + return (APPLICATION_PROPERTIES == null) ? 3 : APPLICATION_PROPERTIES.getInt(GRAPH_REPOSITORY_MAX_RETRIES, 3); + } + + private static Long getRetrySleepTime() { + initApplicationProperties(); + + return (APPLICATION_PROPERTIES == null) ? 30000 : APPLICATION_PROPERTIES.getLong(GRAPH_REPOSITORY_RETRY_SLEEPTIME, 30000); + } + + private static void initApplicationProperties() { + if (APPLICATION_PROPERTIES == null) { + try { + APPLICATION_PROPERTIES = ApplicationProperties.get(); + } catch (AtlasException ex) { + // ignore + } + } } }