@@ -1495,6 +1495,8 @@ void MergeTreeData::changeSettings(
14951495{
14961496 if (new_settings)
14971497 {
1498+ bool has_storage_policy_changed = false ;
1499+
14981500 const auto & new_changes = new_settings->as <const ASTSetQuery &>().changes ;
14991501
15001502 for (const auto & change : new_changes)
@@ -1503,28 +1505,34 @@ void MergeTreeData::changeSettings(
15031505 StoragePolicyPtr new_storage_policy = global_context.getStoragePolicy (change.value .safeGet <String>());
15041506 StoragePolicyPtr old_storage_policy = getStoragePolicy ();
15051507
1506- checkStoragePolicy (new_storage_policy);
1508+ // / StoragePolicy of different version or name is guaranteed to have different pointer
1509+ if (new_storage_policy != old_storage_policy)
1510+ {
1511+ checkStoragePolicy (new_storage_policy);
15071512
1508- std::unordered_set<String> all_diff_disk_names;
1509- for (const auto & disk : new_storage_policy->getDisks ())
1510- all_diff_disk_names.insert (disk->getName ());
1511- for (const auto & disk : old_storage_policy->getDisks ())
1512- all_diff_disk_names.erase (disk->getName ());
1513+ std::unordered_set<String> all_diff_disk_names;
1514+ for (const auto & disk : new_storage_policy->getDisks ())
1515+ all_diff_disk_names.insert (disk->getName ());
1516+ for (const auto & disk : old_storage_policy->getDisks ())
1517+ all_diff_disk_names.erase (disk->getName ());
15131518
1514- for (const String & disk_name : all_diff_disk_names)
1515- {
1516- auto disk = new_storage_policy->getDiskByName (disk_name);
1517- if (disk->exists (relative_data_path))
1518- throw Exception (" New storage policy contain disks which already contain data of a table with the same name" , ErrorCodes::LOGICAL_ERROR);
1519- }
1519+ for (const String & disk_name : all_diff_disk_names)
1520+ {
1521+ auto disk = new_storage_policy->getDiskByName (disk_name);
1522+ if (disk->exists (relative_data_path))
1523+ throw Exception (" New storage policy contain disks which already contain data of a table with the same name" , ErrorCodes::LOGICAL_ERROR);
1524+ }
15201525
1521- for (const String & disk_name : all_diff_disk_names)
1522- {
1523- auto disk = new_storage_policy->getDiskByName (disk_name);
1524- disk->createDirectories (relative_data_path);
1525- disk->createDirectories (relative_data_path + " detached" );
1526+ for (const String & disk_name : all_diff_disk_names)
1527+ {
1528+ auto disk = new_storage_policy->getDiskByName (disk_name);
1529+ disk->createDirectories (relative_data_path);
1530+ disk->createDirectories (relative_data_path + " detached" );
1531+ }
1532+ // / FIXME how would that be done while reloading configuration???
1533+
1534+ has_storage_policy_changed = true ;
15261535 }
1527- // / FIXME how would that be done while reloading configuration???
15281536 }
15291537
15301538 MergeTreeSettings copy = *getSettings ();
@@ -1533,6 +1541,9 @@ void MergeTreeData::changeSettings(
15331541 StorageInMemoryMetadata new_metadata = getInMemoryMetadata ();
15341542 new_metadata.setSettingsChanges (new_settings);
15351543 setInMemoryMetadata (new_metadata);
1544+
1545+ if (has_storage_policy_changed)
1546+ startBackgroundMovesIfNeeded ();
15361547 }
15371548}
15381549
@@ -3291,12 +3302,11 @@ bool MergeTreeData::selectPartsAndMove()
32913302bool MergeTreeData::areBackgroundMovesNeeded () const
32923303{
32933304 auto policy = getStoragePolicy ();
3294- auto metadata_snapshot = getInMemoryMetadataPtr ();
32953305
32963306 if (policy->getVolumes ().size () > 1 )
32973307 return true ;
32983308
3299- return policy->getVolumes ().size () == 1 && policy->getVolumes ()[0 ]->getDisks ().size () > 1 && metadata_snapshot-> hasAnyMoveTTL () ;
3309+ return policy->getVolumes ().size () == 1 && policy->getVolumes ()[0 ]->getDisks ().size () > 1 ;
33003310}
33013311
33023312bool MergeTreeData::movePartsToSpace (const DataPartsVector & parts, SpacePtr space)
0 commit comments