MXS-2264: Fix table versioning

The table versions are now stored in memory and are only resolved on
startup. This simplifies things and removes the need to know where the
data is stored as that information is not available to the Rpl class.
This commit is contained in:
Markus Mäkelä
2019-09-30 08:41:50 +03:00
parent 2eb6a25534
commit 7767231c8f
3 changed files with 6 additions and 18 deletions

View File

@ -836,6 +836,7 @@ bool Rpl::save_and_replace_table_create(STableCreateEvent created)
}
}
created->version = ++m_versions[created->id()];
m_created_tables[table_ident] = created;
mxb_assert(created->columns.size() > 0);
return m_handler->create_table(created);

View File

@ -522,21 +522,6 @@ static void process_column_definition(const char* nameptr, std::vector<Column>&
}
}
int resolve_table_version(const char* db, const char* table)
{
int version = 0;
char buf[PATH_MAX + 1];
do
{
version++;
snprintf(buf, sizeof(buf), "%s.%s.%06d.avsc", db, table, version);
}
while (access(buf, F_OK) == 0);
return version;
}
/**
* @brief Handle a query event which contains a CREATE TABLE statement
*
@ -569,8 +554,7 @@ STableCreateEvent table_create_alloc(char* ident, const char* sql, int len)
if (!columns.empty())
{
int version = resolve_table_version(database, table);
rval.reset(new(std::nothrow) TableCreateEvent(database, table, version, std::move(columns)));
rval.reset(new(std::nothrow) TableCreateEvent(database, table, 0, std::move(columns)));
}
else
{
@ -686,6 +670,7 @@ void Rpl::add_create(STableCreateEvent create)
if (it == m_created_tables.end() || create->version > it->second->version)
{
m_created_tables[create->id()] = create;
m_versions[create->id()] = create->version;
}
}
@ -1408,7 +1393,7 @@ bool Rpl::table_create_alter(STableCreateEvent create, const char* sql, const ch
create->table = new_name;
}
create->version = 1;
create->version = ++m_versions[create->id()];
create->was_used = false;
rename_table_create(create, old_id);

View File

@ -285,6 +285,8 @@ private:
pcre2_match_data* m_md_match;
pcre2_match_data* m_md_exclude;
std::unordered_map<std::string, int> m_versions; // Table version numbers per identifier
void handle_query_event(REP_HEADER* hdr, uint8_t* ptr);
bool handle_table_map_event(REP_HEADER* hdr, uint8_t* ptr);
bool handle_row_event(REP_HEADER* hdr, uint8_t* ptr);