diff --git a/CHANGELOG.md b/CHANGELOG.md index d2c33d93ecd32d685ec04317bc3f2e73430e96e9..d18fcac45f5d245c0288f7926c5204e349826580 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ Please mark all change in change log and use the ticket from JIRA. - \#543 - client raise exception in shards when search results is empty - \#545 - Avoid dead circle of build index thread when error occurs - \#552 - Server down during building index_type: IVF_PQ using GPU-edition +- \#561 - Milvus server should report exception/error message or terminate on mysql metadata backend error ## Feature - \#12 - Pure CPU version for Milvus diff --git a/ci/jenkins/Jenkinsfile b/ci/jenkins/Jenkinsfile index 1989edc10c9d45871abe510410096e44b8a38a70..b41664b051a0083063d0d8b4387afad07cfcf971 100644 --- a/ci/jenkins/Jenkinsfile +++ b/ci/jenkins/Jenkinsfile @@ -27,9 +27,8 @@ pipeline { environment { PROJECT_NAME = "milvus" LOWER_BUILD_TYPE = params.BUILD_TYPE.toLowerCase() - SEMVER = "${BRANCH_NAME}" - JOBNAMES = env.JOB_NAME.split('/') - PIPELINE_NAME = "${JOBNAMES[0]}" + SEMVER = "${BRANCH_NAME.contains('/') ? BRANCH_NAME.substring(BRANCH_NAME.lastIndexOf('/') + 1) : '${BRANCH_NAME}'}" + PIPELINE_NAME = "${env.JOB_NAME.contains('/') ? env.JOB_NAME.getAt(0..(env.JOB_NAME.indexOf('/') - 1)) : '${env.JOB_NAME}'}" } stages { diff --git a/ci/jenkins/internalJenkinsfile.groovy b/ci/jenkins/internalJenkinsfile.groovy index 2987cfed81289ca25336f3998339da8922eebbce..b162a7b2419c06f0a5dbb1bfa138fca87d50295f 100644 --- a/ci/jenkins/internalJenkinsfile.groovy +++ b/ci/jenkins/internalJenkinsfile.groovy @@ -18,9 +18,8 @@ pipeline { environment { PROJECT_NAME = "milvus" LOWER_BUILD_TYPE = params.BUILD_TYPE.toLowerCase() - SEMVER = "${BRANCH_NAME}" - JOBNAMES = env.JOB_NAME.split('/') - PIPELINE_NAME = "${JOBNAMES[0]}" + SEMVER = "${BRANCH_NAME.contains('/') ? BRANCH_NAME.substring(BRANCH_NAME.lastIndexOf('/') + 1) : '${BRANCH_NAME}'}" + PIPELINE_NAME = "${env.JOB_NAME.contains('/') ? env.JOB_NAME.getAt(0..(env.JOB_NAME.indexOf('/') - 1)) : '${env.JOB_NAME}'}" } stages { diff --git a/core/src/db/meta/MySQLMetaImpl.cpp b/core/src/db/meta/MySQLMetaImpl.cpp index 193a34e4f6aa769711ade03b34b44584b4550e07..10aac72b1a8bd85e28eccff02d283e20af1eb54f 100644 --- a/core/src/db/meta/MySQLMetaImpl.cpp +++ b/core/src/db/meta/MySQLMetaImpl.cpp @@ -290,45 +290,50 @@ MySQLMetaImpl::Initialize() { // step 4: validate to avoid open old version schema ValidateMetaSchema(); - // step 5: create meta tables - try { - if (mode_ != DBOptions::MODE::CLUSTER_READONLY) { - CleanUpShadowFiles(); - } + // step 5: clean shadow files + if (mode_ != DBOptions::MODE::CLUSTER_READONLY) { + CleanUpShadowFiles(); + } - { - mysqlpp::ScopedConnection connectionPtr(*mysql_connection_pool_, safe_grab_); + // step 6: try connect mysql server + mysqlpp::ScopedConnection connectionPtr(*mysql_connection_pool_, safe_grab_); - if (connectionPtr == nullptr) { - return Status(DB_ERROR, "Failed to connect to meta server(mysql)"); - } + if (connectionPtr == nullptr) { + std::string msg = "Failed to connect MySQL meta server: " + uri; + ENGINE_LOG_ERROR << msg; + throw Exception(DB_INVALID_META_URI, msg); + } - if (!connectionPtr->thread_aware()) { - ENGINE_LOG_ERROR << "MySQL++ wasn't built with thread awareness! Can't run without it."; - return Status(DB_ERROR, "MySQL++ wasn't built with thread awareness! Can't run without it."); - } - mysqlpp::Query InitializeQuery = connectionPtr->query(); + if (!connectionPtr->thread_aware()) { + std::string msg = + "Failed to initialize MySQL meta backend: MySQL client component wasn't built with thread awareness"; + ENGINE_LOG_ERROR << msg; + throw Exception(DB_INVALID_META_URI, msg); + } - InitializeQuery << "CREATE TABLE IF NOT EXISTS " << TABLES_SCHEMA.name() << " (" - << TABLES_SCHEMA.ToString() + ");"; + // step 7: create meta table Tables + mysqlpp::Query InitializeQuery = connectionPtr->query(); - ENGINE_LOG_DEBUG << "MySQLMetaImpl::Initialize: " << InitializeQuery.str(); + InitializeQuery << "CREATE TABLE IF NOT EXISTS " << TABLES_SCHEMA.name() << " (" << TABLES_SCHEMA.ToString() + ");"; - if (!InitializeQuery.exec()) { - return HandleException("Initialization Error", InitializeQuery.error()); - } + ENGINE_LOG_DEBUG << "MySQLMetaImpl::Initialize: " << InitializeQuery.str(); + + if (!InitializeQuery.exec()) { + std::string msg = "Failed to create meta table 'Tables' in MySQL"; + ENGINE_LOG_ERROR << msg; + throw Exception(DB_META_TRANSACTION_FAILED, msg); + } - InitializeQuery << "CREATE TABLE IF NOT EXISTS " << TABLEFILES_SCHEMA.name() << " (" - << TABLEFILES_SCHEMA.ToString() + ");"; + // step 8: create meta table TableFiles + InitializeQuery << "CREATE TABLE IF NOT EXISTS " << TABLEFILES_SCHEMA.name() << " (" + << TABLEFILES_SCHEMA.ToString() + ");"; - ENGINE_LOG_DEBUG << "MySQLMetaImpl::Initialize: " << InitializeQuery.str(); + ENGINE_LOG_DEBUG << "MySQLMetaImpl::Initialize: " << InitializeQuery.str(); - if (!InitializeQuery.exec()) { - return HandleException("Initialization Error", InitializeQuery.error()); - } - } // Scoped Connection - } catch (std::exception& e) { - return HandleException("GENERAL ERROR DURING INITIALIZATION", e.what()); + if (!InitializeQuery.exec()) { + std::string msg = "Failed to create meta table 'TableFiles' in MySQL"; + ENGINE_LOG_ERROR << msg; + throw Exception(DB_META_TRANSACTION_FAILED, msg); } return Status::OK();