Skip to content
Permalink
Browse files
MDEV-12266: Remove fil_system_t::named_spaces
fil_space_get_by_name(): Remove.
(Implement differently in mariabackup.)

fil_ibd_open(): Check if the tablespace by the same ID already
exists. If it is the same name, return success, else failure.
  • Loading branch information
dr-m committed Mar 29, 2018
1 parent 9043bec commit 0586314
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 108 deletions.
@@ -4212,6 +4212,16 @@ xb_space_create_file(
return TRUE;
}

static fil_space_t* fil_space_get_by_name(const char* name)
{
ut_ad(mutex_own(&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;
return NULL;
}

/***********************************************************************
Searches for matching tablespace file for given .delta file and space_id
in given directory. When matching tablespace found, renames it to match the
@@ -322,28 +322,6 @@ fil_space_get_by_id(
return(space);
}

/** Look up a tablespace.
@param[in] name tablespace name
@return tablespace
@retval NULL if not found */
fil_space_t*
fil_space_get_by_name(const char* name)
{
fil_space_t* space;
ulint fold;

ut_ad(mutex_own(&fil_system.mutex));

fold = ut_fold_string(name);

HASH_SEARCH(name_hash, fil_system.name_hash, fold,
fil_space_t*, space,
ut_ad(space->magic_n == FIL_SPACE_MAGIC_N),
!strcmp(name, space->name));

return(space);
}

/** Look up a tablespace.
The caller should hold an InnoDB table lock or a MDL that prevents
the tablespace from being dropped during the operation,
@@ -1318,13 +1296,6 @@ fil_space_detach(

HASH_DELETE(fil_space_t, hash, fil_system.spaces, space->id, space);

fil_space_t* fnamespace = fil_space_get_by_name(space->name);

ut_a(space == fnamespace);

HASH_DELETE(fil_space_t, name_hash, fil_system.name_hash,
ut_fold_string(space->name), space);

if (space->is_in_unflushed_spaces) {

ut_ad(!fil_buffering_disabled(space));
@@ -1476,18 +1447,6 @@ fil_space_create(

mutex_enter(&fil_system.mutex);

/* Look for a matching tablespace. */
space = fil_space_get_by_name(name);

if (space != NULL) {
mutex_exit(&fil_system.mutex);

ib::warn() << "Tablespace '" << name << "' exists in the"
" cache with id " << space->id << " != " << id;

return(NULL);
}

space = fil_space_get_by_id(id);

if (space != NULL) {
@@ -1553,9 +1512,6 @@ fil_space_create(

HASH_INSERT(fil_space_t, hash, fil_system.spaces, id, space);

HASH_INSERT(fil_space_t, name_hash, fil_system.name_hash,
ut_fold_string(name), space);

UT_LIST_ADD_LAST(fil_system.space_list, space);

if (id < SRV_LOG_SPACE_FIRST_ID && id > fil_system.max_assigned_id) {
@@ -1889,7 +1845,6 @@ void fil_system_t::create(ulint hash_size)
ut_ad(!(srv_page_size % FSP_EXTENT_SIZE));
ut_ad(srv_page_size);
ut_ad(!spaces);
ut_ad(!name_hash);

m_initialised = true;

@@ -1901,7 +1856,6 @@ void fil_system_t::create(ulint hash_size)
mutex_create(LATCH_ID_FIL_SYSTEM, &mutex);

spaces = hash_create(hash_size);
name_hash = hash_create(hash_size);

fil_space_crypt_init();
}
@@ -1918,15 +1872,12 @@ void fil_system_t::close()
if (is_initialised()) {
m_initialised = false;
hash_table_free(spaces);
hash_table_free(name_hash);
spaces = NULL;
name_hash = NULL;
mutex_free(&mutex);
fil_space_crypt_cleanup();
}

ut_ad(!spaces);
ut_ad(!name_hash);
}

/*******************************************************************//**
@@ -3197,19 +3148,6 @@ fil_rename_tablespace(
space->stop_ios = false;
goto func_exit;
}
if (space != fil_space_get_by_name(space->name)) {
ib::error() << "Cannot find " << space->name
<< " in tablespace memory cache";
space->stop_ios = false;
goto func_exit;
}

if (fil_space_get_by_name(new_name)) {
ib::error() << new_name
<< " is already in tablespace memory cache";
space->stop_ios = false;
goto func_exit;
}

/* We temporarily close the .ibd file because we do not trust that
operating systems can rename an open file. For the closing we have to
@@ -3257,8 +3195,6 @@ fil_rename_tablespace(
char* old_file_name = node->name;
char* new_space_name = mem_strdup(new_name);
char* old_space_name = space->name;
ulint old_fold = ut_fold_string(old_space_name);
ulint new_fold = ut_fold_string(new_space_name);

ut_ad(strchr(old_file_name, OS_PATH_SEPARATOR) != NULL);
ut_ad(strchr(new_file_name, OS_PATH_SEPARATOR) != NULL);
@@ -3272,9 +3208,6 @@ fil_rename_tablespace(
ut_ad(log_mutex_own());
mutex_enter(&fil_system.mutex);
ut_ad(space->name == old_space_name);
/* We already checked these. */
ut_ad(space == fil_space_get_by_name(old_space_name));
ut_ad(!fil_space_get_by_name(new_space_name));
ut_ad(node->name == old_file_name);

bool success;
@@ -3300,11 +3233,7 @@ fil_rename_tablespace(

ut_ad(space->name == old_space_name);
if (success) {
HASH_DELETE(fil_space_t, name_hash, fil_system.name_hash,
old_fold, space);
space->name = new_space_name;
HASH_INSERT(fil_space_t, name_hash, fil_system.name_hash,
new_fold, space);
} else {
/* Because nothing was renamed, we must free the new
names, not the old ones. */
@@ -3570,6 +3499,28 @@ fil_ibd_open(
const char* path_in)
{
dberr_t err = DB_SUCCESS;

mutex_enter(&fil_system.mutex);
if (fil_space_t* space = fil_space_get_by_id(id)) {
if (strcmp(space->name, space_name)) {
ib::error()
<< "Trying to open tablespace '" << space_name
<< "' with id " << id
<< " while tablespace '"
<< space->name << "' exists!";
err = DB_TABLESPACE_EXISTS;
}

mutex_exit(&fil_system.mutex);

if (err == DB_SUCCESS && validate && !srv_read_only_mode) {
fsp_flags_try_adjust(id, flags & ~FSP_FLAGS_MEM_MASK);
}

return err;
}
mutex_exit(&fil_system.mutex);

bool dict_filepath_same_as_default = false;
bool link_file_found = false;
bool link_file_is_bad = false;
@@ -4328,7 +4279,6 @@ fil_space_for_table_exists_in_mem(
mem_heap_t* heap,
ulint table_flags)
{
fil_space_t* fnamespace;
fil_space_t* space;

const ulint expected_flags = dict_tf_to_fsp_flags(table_flags);
@@ -4339,16 +4289,12 @@ fil_space_for_table_exists_in_mem(

space = fil_space_get_by_id(id);

/* Look if there is a space with the same name; the name is the
directory path from the datadir to the file */

fnamespace = fil_space_get_by_name(name);
bool valid = space && !((space->flags ^ expected_flags)
& ~FSP_FLAGS_MEM_MASK);

if (!space) {
} else if (!valid || space == fnamespace) {
/* Found with the same file name, or got a flag mismatch. */
} else if (!valid) {
/* Flag mismatch. */
goto func_exit;
}

@@ -4358,18 +4304,8 @@ fil_space_for_table_exists_in_mem(
}

if (space == NULL) {
if (fnamespace == NULL) {
if (print_error_if_does_not_exist) {
fil_report_missing_tablespace(name, id);
}
} else {
ib::error() << "Table " << name << " in InnoDB data"
" dictionary has tablespace id " << id
<< ", but a tablespace with that id does not"
" exist. There is a tablespace of name "
<< fnamespace->name << " and id "
<< fnamespace->id << ", though. Have you"
" deleted or moved .ibd files?";
if (print_error_if_does_not_exist) {
fil_report_missing_tablespace(name, id);
}
error_exit:
ib::info() << TROUBLESHOOT_DATADICT_MSG;
@@ -4378,18 +4314,10 @@ fil_space_for_table_exists_in_mem(
}

if (0 != strcmp(space->name, name)) {

ib::error() << "Table " << name << " in InnoDB data dictionary"
" has tablespace id " << id << ", but the tablespace"
" with that id has name " << space->name << "."
" Have you deleted or moved .ibd files?";

if (fnamespace != NULL) {
ib::error() << "There is a tablespace with the right"
" name: " << fnamespace->name << ", but its id"
" is " << fnamespace->id << ".";
}

goto error_exit;
}

@@ -528,8 +528,6 @@ struct fil_system_t {
hash_table_t* spaces; /*!< The hash table of spaces in the
system; they are hashed on the space
id */
hash_table_t* name_hash; /*!< hash table based on the space
name */
UT_LIST_BASE_NODE_T(fil_node_t) LRU;
/*!< base node for the LRU list of the
most recently used open files with no
@@ -1390,14 +1388,7 @@ fil_space_get_by_id(
/*================*/
ulint id); /*!< in: space id */

/** Look up a tablespace.
@param[in] name tablespace name
@return tablespace
@retval NULL if not found */
fil_space_t*
fil_space_get_by_name(const char* name);

/*******************************************************************//**
/** Note that a non-predefined persistent tablespace has been modified
by redo log.
@param[in,out] space tablespace */
void

0 comments on commit 0586314

Please sign in to comment.