Symptoms: all threads in BackgroundScheduledPool busy, lot of tasks in replication queue, none of the tasks is executing. 

![Screenshot from 2021-04-16 16-21-44_](https://user-images.githubusercontent.com/1549571/115193796-e767d600-a0ec-11eb-887c-5c9c2412e50c.png)

Related to #16895

Possible workarounds (poor options): increasing the background_schedule_pool_size to huge values, or restart server every time when that happens etc. - 

}
                {
                    String s = zk->get(entry.to_shard + "/pinned_part_uuids", &dst_pins.stat);
                    dst_pins.fromString(s);
                }
                src_pins.part_uuids.erase(entry.part_uuid);
                dst_pins.part_uuids.erase(entry.part_uuid);
                Coordination::Requests ops;
                ops.emplace_back(zkutil::makeSetRequest(zookeeper_path + "/pinned_part_uuids", src_pins.toString(), src_pins.stat.version));
                ops.emplace_back(zkutil::makeSetRequest(entry.to_shard + "/pinned_part_uuids", dst_pins.toString(), dst_pins.stat.version));
                zk->multi(ops);
            }
            
            Entry entry_copy = entry;
            entry_copy.state = EntryState::DONE;
            entry_copy.update_time = std::time(nullptr);
            zk->set(entry_copy.znode_path, entry_copy.toString(), entry_copy.version);
        }
        break;
    }
}
std::vector<PartMovesBetweenShardsOrchestrator::Entry> PartMovesBetweenShardsOrchestrator::getEntries() const
{
    std::lock_guard lock(state_mutex);
    std::vector<Entry> res;
    for (const auto & e : entries)
        res.push_back(e.second);
    return res;
}
String PartMovesBetweenShardsOrchestrator::Entry::toString() const