diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MongoDBAdaptorFactory.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MongoDBAdaptorFactory.java index 019f2adb35..8bbec6ee7c 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MongoDBAdaptorFactory.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MongoDBAdaptorFactory.java @@ -17,7 +17,6 @@ package org.opencb.opencga.catalog.db.mongodb; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.DataStoreServerAddress; import org.opencb.commons.datastore.core.Query; @@ -46,12 +45,16 @@ import org.slf4j.LoggerFactory; import java.util.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** * Created by pfurio on 08/01/16. */ public class MongoDBAdaptorFactory implements DBAdaptorFactory { + private static final ExecutorService FUTURE_EXECUTOR = Executors.newSingleThreadExecutor(); + private final IOManagerFactory ioManagerFactory; private final MongoDataStoreManager mongoManager; private final MongoDBConfiguration mongoDbConfiguration; @@ -285,17 +288,21 @@ public OpenCGAResult createOrganization(Organization organization, String orgSummaryString = JacksonUtils.getDefaultObjectMapper().writeValueAsString(organizationSummary); Map value = JacksonUtils.getDefaultObjectMapper().readerFor(Map.class).readValue(orgSummaryString); noteCreateParams.setValue(value); - } catch (JsonMappingException e) { - throw new RuntimeException(e); } catch (JsonProcessingException e) { throw new RuntimeException(e); } Note note = noteCreateParams.toNote(Note.Scope.ORGANIZATION, userId); NoteManager.validateNewNote(note, userId); - // Create new database and indexes - organizationDBAdaptorFactory.createAllCollections(); - organizationDBAdaptorFactory.createIndexes(); + // Create new database and indexes in a non-blocking future transaction (~10 seconds) + FUTURE_EXECUTOR.submit(() -> { + try { + organizationDBAdaptorFactory.createAllCollections(); + organizationDBAdaptorFactory.createIndexes(); + } catch (Exception e) { + logger.error("Could not create collections/indexes for Organization {}: {}", organization.getId(), e.getMessage(), e); + } + }); // Create organization OpenCGAResult result = organizationDBAdaptorFactory.getCatalogOrganizationDBAdaptor() diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/OrganizationMongoDBAdaptorFactory.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/OrganizationMongoDBAdaptorFactory.java index 71741f8ca0..2f9a482ded 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/OrganizationMongoDBAdaptorFactory.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/OrganizationMongoDBAdaptorFactory.java @@ -304,7 +304,8 @@ public void initialiseMetaCollection(Admin admin) throws CatalogException { } public void createAllCollections() throws CatalogDBException { - if (!mongoDataStore.getCollectionNames().isEmpty()) { + if (!mongoDataStore.getCollectionNames().isEmpty() + && mongoDataStore.getCollectionNames().containsAll(OrganizationMongoDBAdaptorFactory.COLLECTIONS_LIST)) { throw new CatalogDBException("Database " + mongoDataStore.getDatabaseName() + " already exists with the following " + "collections: " + StringUtils.join(mongoDataStore.getCollectionNames()) + ".\nPlease, remove the database or" + " choose a different one."); diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java index 44e4092478..a57cadad46 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java @@ -65,8 +65,8 @@ import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.QueryParam; import javax.ws.rs.*; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.*; import java.io.File; import java.io.FileInputStream; @@ -77,6 +77,7 @@ import java.nio.file.Paths; import java.util.*; import java.util.concurrent.Callable; +import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; @@ -269,6 +270,37 @@ static void init(String opencgaHomeStr) { logger.info("| - Version {}", GitRepositoryState.getInstance().getBuildVersion()); logger.info("| - Git version: {} {}", GitRepositoryState.getInstance().getBranch(), GitRepositoryState.getInstance().getCommitId()); logger.info("========================================================================\n"); + + logMigrationSummary(); + } + + private static void logMigrationSummary() { + Executors.newSingleThreadExecutor().submit(() -> { + try { + Map migrationSummaryMap = catalogManager.getMigrationManager().getMigrationSummary(); + logger.info("========================================================================"); + logger.info("| Migration summary:"); + boolean pendingMigrations = false; + for (Map.Entry entry : migrationSummaryMap.entrySet()) { + if (entry.getValue().getMigrationsToBeApplied() > 0) { + pendingMigrations = true; + logger.info("| * Pending migrations for organization {}: {}", entry.getKey(), + entry.getValue().getMigrationsToBeApplied()); + for (Map.Entry entry2 : entry.getValue().getStatusCount().entrySet()) { + if (entry2.getKey().toBeApplied() && entry2.getValue() > 0) { + logger.info("| * {}: {}", entry2.getKey(), entry2.getValue()); + } + } + } + } + if (!pendingMigrations) { + logger.info("| All organizations are up to date. No pending migrations found."); + } + logger.info("========================================================================"); + } catch (CatalogException e) { + logger.error("Error retrieving migration summary", e); + } + }); } /** @@ -302,19 +334,6 @@ private static void initOpenCGAObjects() { variantManager = new VariantStorageManager(catalogManager, storageEngineFactory); healthCheckMonitor = new OpenCGAHealthCheckMonitor(configuration, catalogManager, storageEngineFactory, variantManager); healthCheckMonitor.asyncUpdate(); - - Map migrationSummaryMap = catalogManager.getMigrationManager().getMigrationSummary(); - for (Map.Entry entry : migrationSummaryMap.entrySet()) { - if (entry.getValue().getMigrationsToBeApplied() > 0) { - logger.info("| * Pending migrations for organization {}: {}", entry.getKey(), - entry.getValue().getMigrationsToBeApplied()); - for (Map.Entry entry2 : entry.getValue().getStatusCount().entrySet()) { - if (entry2.getKey().toBeApplied() && entry2.getValue() > 0) { - logger.info("| * {}: {}", entry2.getKey(), entry2.getValue()); - } - } - } - } } catch (Exception e) { errorMessage = e.getMessage(); // e.printStackTrace();