From 9e2f58ea9f7571ec6af26536daf464289a751892 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 30 Jun 2021 18:07:58 +0200 Subject: [PATCH 1/3] IdoCheckTask: de-couple MySQL and Postgres schema versions --- lib/db_ido/dbconnection.hpp | 3 ++- lib/db_ido/idochecktask.cpp | 4 ++-- lib/db_ido_mysql/idomysqlconnection.cpp | 5 +++++ lib/db_ido_mysql/idomysqlconnection.hpp | 2 ++ lib/db_ido_pgsql/idopgsqlconnection.cpp | 5 +++++ lib/db_ido_pgsql/idopgsqlconnection.hpp | 2 ++ 6 files changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/db_ido/dbconnection.hpp b/lib/db_ido/dbconnection.hpp index b0c04bd73..f8221e9d2 100644 --- a/lib/db_ido/dbconnection.hpp +++ b/lib/db_ido/dbconnection.hpp @@ -12,7 +12,6 @@ #include #include -#define IDO_CURRENT_SCHEMA_VERSION "1.14.3" #define IDO_COMPAT_SCHEMA_VERSION "1.14.3" namespace icinga @@ -30,6 +29,8 @@ public: static void InitializeDbTimer(); + virtual const char * GetLatestSchemaVersion() const noexcept = 0; + void SetConfigHash(const DbObject::Ptr& dbobj, const String& hash); void SetConfigHash(const DbType::Ptr& type, const DbReference& objid, const String& hash); String GetConfigHash(const DbObject::Ptr& dbobj) const; diff --git a/lib/db_ido/idochecktask.cpp b/lib/db_ido/idochecktask.cpp index 66c5076c6..6a7f0d363 100644 --- a/lib/db_ido/idochecktask.cpp +++ b/lib/db_ido/idochecktask.cpp @@ -140,9 +140,9 @@ void IdoCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult String schema_version = conn->GetSchemaVersion(); std::ostringstream msgbuf; - if (Utility::CompareVersion(IDO_CURRENT_SCHEMA_VERSION, schema_version) < 0) { + if (Utility::CompareVersion(conn->GetLatestSchemaVersion(), schema_version) < 0) { msgbuf << "Outdated schema version: '" << schema_version << "'. Latest version: '" - << IDO_CURRENT_SCHEMA_VERSION << "'." + << conn->GetLatestSchemaVersion() << "'." << " Queries per second: " << std::fixed << std::setprecision(3) << qps << " Pending queries: " << std::fixed << std::setprecision(3) << pendingQueries << "."; diff --git a/lib/db_ido_mysql/idomysqlconnection.cpp b/lib/db_ido_mysql/idomysqlconnection.cpp index 4632f4893..b30705479 100644 --- a/lib/db_ido_mysql/idomysqlconnection.cpp +++ b/lib/db_ido_mysql/idomysqlconnection.cpp @@ -21,6 +21,11 @@ using namespace icinga; REGISTER_TYPE(IdoMysqlConnection); REGISTER_STATSFUNCTION(IdoMysqlConnection, &IdoMysqlConnection::StatsFunc); +const char * IdoMysqlConnection::GetLatestSchemaVersion() const noexcept +{ + return "1.14.3"; +} + void IdoMysqlConnection::OnConfigLoaded() { ObjectImpl::OnConfigLoaded(); diff --git a/lib/db_ido_mysql/idomysqlconnection.hpp b/lib/db_ido_mysql/idomysqlconnection.hpp index 851e29d5a..69f3d6134 100644 --- a/lib/db_ido_mysql/idomysqlconnection.hpp +++ b/lib/db_ido_mysql/idomysqlconnection.hpp @@ -37,6 +37,8 @@ public: static void StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata); + const char * GetLatestSchemaVersion() const noexcept override; + int GetPendingQueryCount() const override; protected: diff --git a/lib/db_ido_pgsql/idopgsqlconnection.cpp b/lib/db_ido_pgsql/idopgsqlconnection.cpp index 858617ce0..4ffa03399 100644 --- a/lib/db_ido_pgsql/idopgsqlconnection.cpp +++ b/lib/db_ido_pgsql/idopgsqlconnection.cpp @@ -23,6 +23,11 @@ REGISTER_TYPE(IdoPgsqlConnection); REGISTER_STATSFUNCTION(IdoPgsqlConnection, &IdoPgsqlConnection::StatsFunc); +const char * IdoPgsqlConnection::GetLatestSchemaVersion() const noexcept +{ + return "1.14.3"; +} + IdoPgsqlConnection::IdoPgsqlConnection() { m_QueryQueue.SetName("IdoPgsqlConnection, " + GetName()); diff --git a/lib/db_ido_pgsql/idopgsqlconnection.hpp b/lib/db_ido_pgsql/idopgsqlconnection.hpp index 0552f3318..2a978bf3d 100644 --- a/lib/db_ido_pgsql/idopgsqlconnection.hpp +++ b/lib/db_ido_pgsql/idopgsqlconnection.hpp @@ -30,6 +30,8 @@ public: static void StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata); + const char * GetLatestSchemaVersion() const noexcept override; + int GetPendingQueryCount() const override; protected: From 4373acf8ed4adf39276b0e242a7e2b4661b91d20 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 30 Jun 2021 18:11:55 +0200 Subject: [PATCH 2/3] Ido*sqlConnection::Reconnect(): de-couple MySQL and Postgres schema versions --- lib/db_ido/dbconnection.hpp | 3 +-- lib/db_ido_mysql/idomysqlconnection.cpp | 9 +++++++-- lib/db_ido_mysql/idomysqlconnection.hpp | 1 + lib/db_ido_pgsql/idopgsqlconnection.cpp | 9 +++++++-- lib/db_ido_pgsql/idopgsqlconnection.hpp | 1 + 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/lib/db_ido/dbconnection.hpp b/lib/db_ido/dbconnection.hpp index f8221e9d2..5e061705f 100644 --- a/lib/db_ido/dbconnection.hpp +++ b/lib/db_ido/dbconnection.hpp @@ -12,8 +12,6 @@ #include #include -#define IDO_COMPAT_SCHEMA_VERSION "1.14.3" - namespace icinga { @@ -30,6 +28,7 @@ public: static void InitializeDbTimer(); virtual const char * GetLatestSchemaVersion() const noexcept = 0; + virtual const char * GetCompatSchemaVersion() const noexcept = 0; void SetConfigHash(const DbObject::Ptr& dbobj, const String& hash); void SetConfigHash(const DbType::Ptr& type, const DbReference& objid, const String& hash); diff --git a/lib/db_ido_mysql/idomysqlconnection.cpp b/lib/db_ido_mysql/idomysqlconnection.cpp index b30705479..678dffe28 100644 --- a/lib/db_ido_mysql/idomysqlconnection.cpp +++ b/lib/db_ido_mysql/idomysqlconnection.cpp @@ -26,6 +26,11 @@ const char * IdoMysqlConnection::GetLatestSchemaVersion() const noexcept return "1.14.3"; } +const char * IdoMysqlConnection::GetCompatSchemaVersion() const noexcept +{ + return "1.14.3"; +} + void IdoMysqlConnection::OnConfigLoaded() { ObjectImpl::OnConfigLoaded(); @@ -313,13 +318,13 @@ void IdoMysqlConnection::Reconnect() SetSchemaVersion(version); - if (Utility::CompareVersion(IDO_COMPAT_SCHEMA_VERSION, version) < 0) { + if (Utility::CompareVersion(GetCompatSchemaVersion(), version) < 0) { m_Mysql->close(&m_Connection); SetConnected(false); Log(LogCritical, "IdoMysqlConnection") << "Schema version '" << version << "' does not match the required version '" - << IDO_COMPAT_SCHEMA_VERSION << "' (or newer)! Please check the upgrade documentation at " + << GetCompatSchemaVersion() << "' (or newer)! Please check the upgrade documentation at " << "https://icinga.com/docs/icinga2/latest/doc/16-upgrading-icinga-2/#upgrading-mysql-db"; BOOST_THROW_EXCEPTION(std::runtime_error("Schema version mismatch.")); diff --git a/lib/db_ido_mysql/idomysqlconnection.hpp b/lib/db_ido_mysql/idomysqlconnection.hpp index 69f3d6134..9a63b819c 100644 --- a/lib/db_ido_mysql/idomysqlconnection.hpp +++ b/lib/db_ido_mysql/idomysqlconnection.hpp @@ -38,6 +38,7 @@ public: static void StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata); const char * GetLatestSchemaVersion() const noexcept override; + const char * GetCompatSchemaVersion() const noexcept override; int GetPendingQueryCount() const override; diff --git a/lib/db_ido_pgsql/idopgsqlconnection.cpp b/lib/db_ido_pgsql/idopgsqlconnection.cpp index 4ffa03399..ced62492a 100644 --- a/lib/db_ido_pgsql/idopgsqlconnection.cpp +++ b/lib/db_ido_pgsql/idopgsqlconnection.cpp @@ -28,6 +28,11 @@ const char * IdoPgsqlConnection::GetLatestSchemaVersion() const noexcept return "1.14.3"; } +const char * IdoPgsqlConnection::GetCompatSchemaVersion() const noexcept +{ + return "1.14.3"; +} + IdoPgsqlConnection::IdoPgsqlConnection() { m_QueryQueue.SetName("IdoPgsqlConnection, " + GetName()); @@ -280,13 +285,13 @@ void IdoPgsqlConnection::Reconnect() SetSchemaVersion(version); - if (Utility::CompareVersion(IDO_COMPAT_SCHEMA_VERSION, version) < 0) { + if (Utility::CompareVersion(GetCompatSchemaVersion(), version) < 0) { m_Pgsql->finish(m_Connection); SetConnected(false); Log(LogCritical, "IdoPgsqlConnection") << "Schema version '" << version << "' does not match the required version '" - << IDO_COMPAT_SCHEMA_VERSION << "' (or newer)! Please check the upgrade documentation at " + << GetCompatSchemaVersion() << "' (or newer)! Please check the upgrade documentation at " << "https://icinga.com/docs/icinga2/latest/doc/16-upgrading-icinga-2/#upgrading-postgresql-db"; BOOST_THROW_EXCEPTION(std::runtime_error("Schema version mismatch.")); diff --git a/lib/db_ido_pgsql/idopgsqlconnection.hpp b/lib/db_ido_pgsql/idopgsqlconnection.hpp index 2a978bf3d..a2ffb2e7e 100644 --- a/lib/db_ido_pgsql/idopgsqlconnection.hpp +++ b/lib/db_ido_pgsql/idopgsqlconnection.hpp @@ -31,6 +31,7 @@ public: static void StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata); const char * GetLatestSchemaVersion() const noexcept override; + const char * GetCompatSchemaVersion() const noexcept override; int GetPendingQueryCount() const override; From e9118d6b09cf2327d9c6075c3208b7664f766688 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 30 Jun 2021 18:15:36 +0200 Subject: [PATCH 3/3] Fix IDO MySQL schema version (as in v2.11 upgrade) --- lib/db_ido_mysql/idomysqlconnection.cpp | 2 +- lib/db_ido_mysql/schema/mysql.sql | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/db_ido_mysql/idomysqlconnection.cpp b/lib/db_ido_mysql/idomysqlconnection.cpp index 678dffe28..b65a16177 100644 --- a/lib/db_ido_mysql/idomysqlconnection.cpp +++ b/lib/db_ido_mysql/idomysqlconnection.cpp @@ -23,7 +23,7 @@ REGISTER_STATSFUNCTION(IdoMysqlConnection, &IdoMysqlConnection::StatsFunc); const char * IdoMysqlConnection::GetLatestSchemaVersion() const noexcept { - return "1.14.3"; + return "1.15.0"; } const char * IdoMysqlConnection::GetCompatSchemaVersion() const noexcept diff --git a/lib/db_ido_mysql/schema/mysql.sql b/lib/db_ido_mysql/schema/mysql.sql index 7f1cce3ca..d75b85aa3 100644 --- a/lib/db_ido_mysql/schema/mysql.sql +++ b/lib/db_ido_mysql/schema/mysql.sql @@ -1660,7 +1660,7 @@ CREATE INDEX idx_comments_remove ON icinga_comments (object_id, entry_time); -- ----------------------------------------- -- set dbversion -- ----------------------------------------- -INSERT INTO icinga_dbversion (name, version, create_time, modify_time) VALUES ('idoutils', '1.14.3', NOW(), NOW()) -ON DUPLICATE KEY UPDATE version='1.14.3', modify_time=NOW(); +INSERT INTO icinga_dbversion (name, version, create_time, modify_time) VALUES ('idoutils', '1.15.0', NOW(), NOW()) +ON DUPLICATE KEY UPDATE version='1.15.0', modify_time=NOW();