And waits for them. That's pointless.
DataPartsLock lock(mutex);
            for (MutableDataPartPtr & part : dst_parts)
                dest_table_storage->renameTempPartAndReplace(part, nullptr, &transaction, lock);
            Coordination::Error code = zookeeper->tryMulti(ops, op_results);
            if (code == Coordination::Error::ZBADVERSION)
                throw Exception(ErrorCodes::CANNOT_ASSIGN_ALTER, "Cannot assign ALTER PARTITION, because another ALTER PARTITION query was concurrently executed");
            else
                zkutil::KeeperMultiException::check(code, ops, op_results);
            parts_to_remove = removePartsInRangeFromWorkingSet(drop_range, true, lock);
            transaction.commit(&lock);
        }
        PartLog::addNewParts(getContext(), dst_parts, watch.elapsed());
    }
    catch (...)
    {
        PartLog::addNewParts(getContext(), dst_parts, watch.elapsed(), ExecutionStatus::fromCurrentException());
        throw;
    }
    String log_znode_path = dynamic_cast<const Coordination::CreateResponse &>(*op_results.back()).path_created;
    entry.znode_name = log_znode_path.substr(log_znode_path.find_last_of('/') + 1);
    for (auto & lock : ephemeral_locks)
        lock.assumeUnlocked();
    tryRemovePartsFromZooKeeperWithRetries(parts_to_remove);
    parts_to_remove.clear();
    cleanup_thread.wakeup();
    if (query_context->getSettingsRef().replication_alter_partitions_sync > 1)
    {
        lock2.reset();
        dest_table_storage->waitForAllReplicasToProcessLogEntry(entry);
    }