MXS-2463 Prepare for another set of queries

Persisted information about dynamic nodes must be used only if
the bootrap information has not been changed, as otherwise we risk
using information that is not valid.
This commit is contained in:
Johan Wikman
2019-05-06 15:12:18 +03:00
parent a9c1a8d18a
commit ff33453e1a

View File

@ -42,19 +42,20 @@ const int DEFAULT_HEALTH_PORT = 3581;
// Change this, if the schema is changed. // Change this, if the schema is changed.
const int SCHEMA_VERSION = 1; const int SCHEMA_VERSION = 1;
static const char SQL_CREATE[] = static const char SQL_DN_CREATE[] =
"CREATE TABLE IF NOT EXISTS clustrix_nodes " "CREATE TABLE IF NOT EXISTS dynamic_nodes "
"(id INT PRIMARY KEY, ip VARCHAR(255), mysql_port INT, health_port INT)"; "(id INT PRIMARY KEY, ip VARCHAR(255), mysql_port INT, health_port INT)";
static const char SQL_UPSERT_FORMAT[] = static const char SQL_DN_UPSERT_FORMAT[] =
"INSERT OR REPLACE INTO clustrix_nodes (id, ip, mysql_port, health_port) " "INSERT OR REPLACE INTO dynamic_nodes (id, ip, mysql_port, health_port) "
"VALUES (%d, '%s', %d, %d)"; "VALUES (%d, '%s', %d, %d)";
static const char SQL_DELETE_FORMAT[] = static const char SQL_DN_DELETE_FORMAT[] =
"DELETE FROM clustrix_nodes WHERE id = %d"; "DELETE FROM dynamic_nodes WHERE id = %d";
static const char SQL_DN_SELECT[] =
"SELECT ip, mysql_port FROM dynamic_nodes";
static const char SQL_SELECT[] =
"SELECT ip, mysql_port FROM clustrix_nodes";
using HostPortPair = std::pair<std::string, int>; using HostPortPair = std::pair<std::string, int>;
using HostPortPairs = std::vector<HostPortPair>; using HostPortPairs = std::vector<HostPortPair>;
@ -82,7 +83,7 @@ namespace
bool create_schema(sqlite3* pDb) bool create_schema(sqlite3* pDb)
{ {
char* pError = nullptr; char* pError = nullptr;
int rv = sqlite3_exec(pDb, SQL_CREATE, nullptr, nullptr, &pError); int rv = sqlite3_exec(pDb, SQL_DN_CREATE, nullptr, nullptr, &pError);
if (rv != SQLITE_OK) if (rv != SQLITE_OK)
{ {
@ -146,7 +147,7 @@ ClustrixMonitor* ClustrixMonitor::create(const string& name, const string& modul
path += "/"; path += "/";
path += name; path += name;
path += "/clustrix_nodes-"; path += "/clustrix_nodes-v";
path += std::to_string(SCHEMA_VERSION); path += std::to_string(SCHEMA_VERSION);
path += ".db"; path += ".db";
@ -397,7 +398,7 @@ bool ClustrixMonitor::refresh_using_persisted_nodes(std::set<string>& ips_checke
HostPortPairs nodes; HostPortPairs nodes;
char* pError = nullptr; char* pError = nullptr;
int rv = sqlite3_exec(m_pDb, SQL_SELECT, select_cb, &nodes, &pError); int rv = sqlite3_exec(m_pDb, SQL_DN_SELECT, select_cb, &nodes, &pError);
if (rv == SQLITE_OK) if (rv == SQLITE_OK)
{ {
@ -1051,14 +1052,14 @@ void ClustrixMonitor::persist(const ClustrixNode& node)
return; return;
} }
char sql_upsert[sizeof(SQL_UPSERT_FORMAT) + 10 + node.ip().length() + 10 + 10]; char sql_upsert[sizeof(SQL_DN_UPSERT_FORMAT) + 10 + node.ip().length() + 10 + 10];
int id = node.id(); int id = node.id();
const char* zIp = node.ip().c_str(); const char* zIp = node.ip().c_str();
int mysql_port = node.mysql_port(); int mysql_port = node.mysql_port();
int health_port = node.health_port(); int health_port = node.health_port();
sprintf(sql_upsert, SQL_UPSERT_FORMAT, id, zIp, mysql_port, health_port); sprintf(sql_upsert, SQL_DN_UPSERT_FORMAT, id, zIp, mysql_port, health_port);
char* pError = nullptr; char* pError = nullptr;
if (sqlite3_exec(m_pDb, sql_upsert, nullptr, nullptr, &pError) == SQLITE_OK) if (sqlite3_exec(m_pDb, sql_upsert, nullptr, nullptr, &pError) == SQLITE_OK)
@ -1080,11 +1081,11 @@ void ClustrixMonitor::unpersist(const ClustrixNode& node)
return; return;
} }
char sql_delete[sizeof(SQL_UPSERT_FORMAT) + 10]; char sql_delete[sizeof(SQL_DN_UPSERT_FORMAT) + 10];
int id = node.id(); int id = node.id();
sprintf(sql_delete, SQL_DELETE_FORMAT, id); sprintf(sql_delete, SQL_DN_DELETE_FORMAT, id);
char* pError = nullptr; char* pError = nullptr;
if (sqlite3_exec(m_pDb, sql_delete, nullptr, nullptr, &pError) == SQLITE_OK) if (sqlite3_exec(m_pDb, sql_delete, nullptr, nullptr, &pError) == SQLITE_OK)