Repository: incubator-gobblin Updated Branches: refs/heads/master b12c35385 -> 8d297de3e
[GOBBLIN-10] Fix_for_#1850_and_#1851 DatabaseJobHistoryStore should initialize Reflections only once. Fix findbugs error Closes #1967 from kadaan/Fix_for_#1850 Project: http://git-wip-us.apache.org/repos/asf/incubator-gobblin/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-gobblin/commit/8d297de3 Tree: http://git-wip-us.apache.org/repos/asf/incubator-gobblin/tree/8d297de3 Diff: http://git-wip-us.apache.org/repos/asf/incubator-gobblin/diff/8d297de3 Branch: refs/heads/master Commit: 8d297de3e85fa9570ddd60eac38ebf0d08b6e19e Parents: b12c353 Author: Joel Baranick <[email protected]> Authored: Thu Jul 27 16:47:06 2017 -0700 Committer: Abhishek Tiwari <[email protected]> Committed: Thu Jul 27 16:47:06 2017 -0700 ---------------------------------------------------------------------- .../metastore/DatabaseJobHistoryStore.java | 28 +++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-gobblin/blob/8d297de3/gobblin-metastore/src/main/java/gobblin/metastore/DatabaseJobHistoryStore.java ---------------------------------------------------------------------- diff --git a/gobblin-metastore/src/main/java/gobblin/metastore/DatabaseJobHistoryStore.java b/gobblin-metastore/src/main/java/gobblin/metastore/DatabaseJobHistoryStore.java index 7e841b1..914ab42 100644 --- a/gobblin-metastore/src/main/java/gobblin/metastore/DatabaseJobHistoryStore.java +++ b/gobblin-metastore/src/main/java/gobblin/metastore/DatabaseJobHistoryStore.java @@ -17,7 +17,9 @@ package gobblin.metastore; +import javax.annotation.Nullable; import javax.sql.DataSource; +import java.io.File; import java.io.IOException; import java.net.URL; import java.util.Collection; @@ -27,10 +29,14 @@ import org.flywaydb.core.Flyway; import org.flywaydb.core.api.FlywayException; import org.flywaydb.core.api.MigrationInfoService; import org.flywaydb.core.api.MigrationVersion; +import org.reflections.Configuration; import org.reflections.Reflections; import org.reflections.util.ClasspathHelper; +import com.google.common.base.Predicate; import com.google.common.base.Strings; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.inject.Inject; @@ -40,6 +46,7 @@ import gobblin.rest.JobExecutionInfo; import gobblin.rest.JobExecutionQuery; import org.reflections.util.ClasspathHelper; +import org.reflections.util.ConfigurationBuilder; /** @@ -52,6 +59,9 @@ import org.reflections.util.ClasspathHelper; * @author Yinan Li */ public class DatabaseJobHistoryStore implements JobHistoryStore { + // Scan all packages in the classpath with prefix gobblin.metastore.database when + // class is loaded. Since scan is expensive we do it only once when class is loaded. + private static final Reflections reflections = new Reflections(getConfigurationBuilder()); private final VersionedDatabaseJobHistoryStore versionedStore; @Inject @@ -92,16 +102,26 @@ public class DatabaseJobHistoryStore implements JobHistoryStore { return ClasspathHelper.forManifest(ClasspathHelper.forClassLoader(classLoaders)); } + private static Configuration getConfigurationBuilder() { + ConfigurationBuilder configurationBuilder= ConfigurationBuilder.build("gobblin.metastore.database", + effectiveClassPathUrls(DatabaseJobHistoryStore.class.getClassLoader())); + List<URL> filteredUrls = Lists.newArrayList(Iterables.filter(configurationBuilder.getUrls(), new Predicate<URL>() { + @Override + public boolean apply(@Nullable URL input) { + return input != null && (!input.getProtocol().equals("file") || new File(input.getFile()).exists()); + } + })); + configurationBuilder.setUrls(filteredUrls); + return configurationBuilder; + } + private static VersionedDatabaseJobHistoryStore findVersionedDatabaseJobHistoryStore(MigrationVersion requiredVersion) throws IllegalAccessException, InstantiationException, ClassNotFoundException { Class<?> foundClazz = null; Class<?> defaultClazz = null; MigrationVersion defaultVersion = MigrationVersion.EMPTY; - // Scan all packages - Reflections reflections = new Reflections("gobblin.metastore.database", - effectiveClassPathUrls(DatabaseJobHistoryStore.class.getClassLoader())); for (Class<?> clazz : Sets.intersection(reflections.getTypesAnnotatedWith(SupportedDatabaseVersion.class), - reflections.getSubTypesOf(VersionedDatabaseJobHistoryStore.class))) { + reflections.getSubTypesOf(VersionedDatabaseJobHistoryStore.class))) { SupportedDatabaseVersion annotation = clazz.getAnnotation(SupportedDatabaseVersion.class); String version = annotation.version(); MigrationVersion actualVersion = MigrationVersion.fromVersion(Strings.isNullOrEmpty(version) ? null : version);
