Small improvements for IStorage::rename

This commit is contained in:
Alexey Milovidov 2020-09-17 22:50:43 +03:00
parent 0597ad3150
commit 7fb4dfea2c
5 changed files with 32 additions and 20 deletions

View File

@ -866,7 +866,7 @@ void StorageDistributed::flushClusterNodesAllData()
void StorageDistributed::rename(const String & new_path_to_table_data, const StorageID & new_table_id)
{
if (!relative_data_path.empty())
if (!relative_data_path.empty() && relative_data_path != new_path_to_table_data)
renameOnDisk(new_path_to_table_data);
renameInMemory(new_table_id);
}
@ -878,7 +878,7 @@ void StorageDistributed::renameOnDisk(const String & new_path_to_table_data)
{
const String path(disk->getPath());
auto new_path = path + new_path_to_table_data;
Poco::File(path + relative_data_path).renameTo(new_path);
disk->moveDirectory(path + relative_data_path, new_path);
LOG_DEBUG(log, "Updating path to {}", new_path);

View File

@ -525,9 +525,12 @@ void StorageFile::rename(const String & new_path_to_table_data, const StorageID
if (paths.size() != 1)
throw Exception("Can't rename table " + getStorageID().getNameForLogs() + " in readonly mode", ErrorCodes::DATABASE_ACCESS_DENIED);
std::string path_new = getTablePath(base_path + new_path_to_table_data, format_name);
if (path_new == paths[0])
return;
std::unique_lock<std::shared_mutex> lock(rwlock);
std::string path_new = getTablePath(base_path + new_path_to_table_data, format_name);
Poco::File(Poco::Path(path_new).parent()).createDirectories();
Poco::File(paths[0]).renameTo(path_new);

View File

@ -548,17 +548,20 @@ void StorageLog::loadMarks()
void StorageLog::rename(const String & new_path_to_table_data, const StorageID & new_table_id)
{
std::unique_lock<std::shared_mutex> lock(rwlock);
if (table_path != new_path_to_table_data)
{
std::unique_lock<std::shared_mutex> lock(rwlock);
disk->moveDirectory(table_path, new_path_to_table_data);
disk->moveDirectory(table_path, new_path_to_table_data);
table_path = new_path_to_table_data;
file_checker.setPath(table_path + "sizes.json");
table_path = new_path_to_table_data;
file_checker.setPath(table_path + "sizes.json");
for (auto & file : files)
file.second.data_file_path = table_path + fileName(file.second.data_file_path);
for (auto & file : files)
file.second.data_file_path = table_path + fileName(file.second.data_file_path);
marks_file_path = table_path + DBMS_STORAGE_LOG_MARKS_FILE_NAME;
marks_file_path = table_path + DBMS_STORAGE_LOG_MARKS_FILE_NAME;
}
renameInMemory(new_table_id);
}

View File

@ -282,12 +282,15 @@ StorageStripeLog::StorageStripeLog(
void StorageStripeLog::rename(const String & new_path_to_table_data, const StorageID & new_table_id)
{
std::unique_lock<std::shared_mutex> lock(rwlock);
if (table_path != new_path_to_table_data)
{
std::unique_lock<std::shared_mutex> lock(rwlock);
disk->moveDirectory(table_path, new_path_to_table_data);
disk->moveDirectory(table_path, new_path_to_table_data);
table_path = new_path_to_table_data;
file_checker.setPath(table_path + "sizes.json");
table_path = new_path_to_table_data;
file_checker.setPath(table_path + "sizes.json");
}
renameInMemory(new_table_id);
}

View File

@ -407,15 +407,18 @@ void StorageTinyLog::addFiles(const String & column_name, const IDataType & type
void StorageTinyLog::rename(const String & new_path_to_table_data, const StorageID & new_table_id)
{
std::unique_lock<std::shared_mutex> lock(rwlock);
if (table_path != new_path_to_table_data)
{
std::unique_lock<std::shared_mutex> lock(rwlock);
disk->moveDirectory(table_path, new_path_to_table_data);
disk->moveDirectory(table_path, new_path_to_table_data);
table_path = new_path_to_table_data;
file_checker.setPath(table_path + "sizes.json");
table_path = new_path_to_table_data;
file_checker.setPath(table_path + "sizes.json");
for (auto & file : files)
file.second.data_file_path = table_path + fileName(file.second.data_file_path);
for (auto & file : files)
file.second.data_file_path = table_path + fileName(file.second.data_file_path);
}
renameInMemory(new_table_id);
}