summaryrefslogtreecommitdiff
path: root/extra
diff options
context:
space:
mode:
authorEugene Kosov <claprix@yandex.ru>2021-03-20 01:31:01 +0300
committerEugene Kosov <claprix@yandex.ru>2021-03-24 15:15:18 +0300
commit1274bb772914dbd2c52411d257fce88f1e36395d (patch)
tree600b61d82c89d73c705d5f18a826b54fc7eb6f3b /extra
parentcb545f11169d2425316d96feafc78ac841950e43 (diff)
downloadmariadb-git-1274bb772914dbd2c52411d257fce88f1e36395d.tar.gz
MDEV-25223 change fil_system_t::space_list and fil_system_t::named_spaces from UT_LIST to ilist
Mostly a refactoring. Also, debug functions were added for ease of life while debugging
Diffstat (limited to 'extra')
-rw-r--r--extra/mariabackup/xtrabackup.cc84
1 files changed, 21 insertions, 63 deletions
diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc
index 86c358dc212..160a804af85 100644
--- a/extra/mariabackup/xtrabackup.cc
+++ b/extra/mariabackup/xtrabackup.cc
@@ -588,36 +588,20 @@ static dberr_t enumerate_ibd_files(process_single_tablespace_func_t callback);
/* ======== Datafiles iterator ======== */
struct datafiles_iter_t {
- fil_space_t *space;
- fil_node_t *node;
- ibool started;
- pthread_mutex_t mutex;
+ space_list_t::iterator space = fil_system.space_list.end();
+ fil_node_t *node = nullptr;
+ bool started = false;
+ std::mutex mutex;
};
/* ======== Datafiles iterator ======== */
static
-datafiles_iter_t *
-datafiles_iter_new()
-{
- datafiles_iter_t *it;
-
- it = static_cast<datafiles_iter_t *>(malloc(sizeof(datafiles_iter_t)));
- pthread_mutex_init(&it->mutex, NULL);
-
- it->space = NULL;
- it->node = NULL;
- it->started = FALSE;
-
- return it;
-}
-
-static
fil_node_t *
datafiles_iter_next(datafiles_iter_t *it)
{
fil_node_t *new_node;
- pthread_mutex_lock(&it->mutex);
+ std::lock_guard<std::mutex> _(it->mutex);
if (it->node == NULL) {
if (it->started)
@@ -629,34 +613,25 @@ datafiles_iter_next(datafiles_iter_t *it)
goto end;
}
- it->space = (it->space == NULL) ?
- UT_LIST_GET_FIRST(fil_system.space_list) :
- UT_LIST_GET_NEXT(space_list, it->space);
+ it->space = (it->space == fil_system.space_list.end()) ?
+ fil_system.space_list.begin() :
+ std::next(it->space);
- while (it->space != NULL &&
+ while (it->space != fil_system.space_list.end() &&
(it->space->purpose != FIL_TYPE_TABLESPACE ||
UT_LIST_GET_LEN(it->space->chain) == 0))
- it->space = UT_LIST_GET_NEXT(space_list, it->space);
- if (it->space == NULL)
+ ++it->space;
+ if (it->space == fil_system.space_list.end())
goto end;
it->node = UT_LIST_GET_FIRST(it->space->chain);
end:
new_node = it->node;
- pthread_mutex_unlock(&it->mutex);
return new_node;
}
-static
-void
-datafiles_iter_free(datafiles_iter_t *it)
-{
- pthread_mutex_destroy(&it->mutex);
- free(it);
-}
-
#ifndef DBUG_OFF
struct dbug_thread_param_t
{
@@ -750,18 +725,15 @@ end:
void mdl_lock_all()
{
mdl_lock_init();
- datafiles_iter_t *it = datafiles_iter_new();
- if (!it)
- return;
+ datafiles_iter_t it;
- while (fil_node_t *node = datafiles_iter_next(it)){
+ while (fil_node_t *node = datafiles_iter_next(&it)) {
if (fil_is_user_tablespace_id(node->space->id)
&& check_if_skip_table(node->space->name))
continue;
mdl_lock_table(node->space->id);
}
- datafiles_iter_free(it);
}
@@ -4441,11 +4413,7 @@ fail_before_log_copying_thread_start:
"Waiting for table metadata lock", 0, 0););
}
- datafiles_iter_t *it = datafiles_iter_new();
- if (it == NULL) {
- msg("mariabackup: Error: datafiles_iter_new() failed.");
- goto fail;
- }
+ datafiles_iter_t it;
/* Create data copying threads */
data_threads = (data_thread_ctxt_t *)
@@ -4454,7 +4422,7 @@ fail_before_log_copying_thread_start:
pthread_mutex_init(&count_mutex, NULL);
for (i = 0; i < (uint) xtrabackup_parallel; i++) {
- data_threads[i].it = it;
+ data_threads[i].it = &it;
data_threads[i].num = i+1;
data_threads[i].count = &count;
data_threads[i].count_mutex = &count_mutex;
@@ -4475,7 +4443,6 @@ fail_before_log_copying_thread_start:
pthread_mutex_destroy(&count_mutex);
free(data_threads);
- datafiles_iter_free(it);
}
bool ok = backup_start(corrupted_pages);
@@ -4629,10 +4596,8 @@ void backup_fix_ddl(CorruptedPages &corrupted_pages)
// Load and copy new tables.
// Close all datanodes first, reload only new tables.
std::vector<fil_node_t *> all_nodes;
- datafiles_iter_t *it = datafiles_iter_new();
- if (!it)
- return;
- while (fil_node_t *node = datafiles_iter_next(it)) {
+ datafiles_iter_t it;
+ while (fil_node_t *node = datafiles_iter_next(&it)) {
all_nodes.push_back(node);
}
for (size_t i = 0; i < all_nodes.size(); i++) {
@@ -4646,7 +4611,6 @@ void backup_fix_ddl(CorruptedPages &corrupted_pages)
}
fil_space_free(n->space->id, false);
}
- datafiles_iter_free(it);
DBUG_EXECUTE_IF("check_mdl_lock_works", DBUG_ASSERT(new_tables.size() == 0););
for (std::set<std::string>::iterator iter = new_tables.begin();
@@ -4657,11 +4621,9 @@ void backup_fix_ddl(CorruptedPages &corrupted_pages)
xb_load_single_table_tablespace(*iter, false);
}
- it = datafiles_iter_new();
- if (!it)
- return;
+ datafiles_iter_t it2;
- while (fil_node_t *node = datafiles_iter_next(it)) {
+ while (fil_node_t *node = datafiles_iter_next(&it2)) {
fil_space_t * space = node->space;
if (!fil_is_user_tablespace_id(space->id))
continue;
@@ -4670,8 +4632,6 @@ void backup_fix_ddl(CorruptedPages &corrupted_pages)
xtrabackup_copy_datafile(node, 0, dest_name.c_str(), wf_write_through,
corrupted_pages);
}
-
- datafiles_iter_free(it);
}
/* ================= prepare ================= */
@@ -4787,10 +4747,8 @@ xb_space_create_file(
static fil_space_t* fil_space_get_by_name(const char* name)
{
mysql_mutex_assert_owner(&fil_system.mutex);
- for (fil_space_t* space = UT_LIST_GET_FIRST(fil_system.space_list);
- space != NULL;
- space = UT_LIST_GET_NEXT(space_list, space))
- if (!strcmp(space->name, name)) return space;
+ for (fil_space_t& space :fil_system.space_list)
+ if (!strcmp(space.name, name)) return &space;
return NULL;
}