And waits for them. That's pointless.
{
    
    fetcher.blocker.cancelForever();
    merger_mutator.merges_blocker.cancelForever();
    parts_mover.moves_blocker.cancelForever();
    restarting_thread.shutdown();
    background_executor.finish();
    part_moves_between_shards_orchestrator.shutdown();
    {
        auto lock = queue.lockQueue();
        
        
        
        queue.pull_log_blocker.cancelForever();
    }
    background_moves_executor.finish();
    auto data_parts_exchange_ptr = std::atomic_exchange(&data_parts_exchange_endpoint, InterserverIOEndpointPtr{});
    if (data_parts_exchange_ptr)
    {
        getContext()->getInterserverIOHandler().removeEndpointIfExists(data_parts_exchange_ptr->getId(replica_path));
        
        data_parts_exchange_ptr->blocker.cancelForever();