`DataTypeFactory::get` locks a mutex inside shared a context, there was a case when many threads were locked inside it

https://pastila.nl/?0043b3e6/c557368f4cf0eb87a3c6f2cc162bc693

It is not clear which thread locked the mutex for a long time. However, it may be possible to lock less inside `DataTypeFactory::get`.
FileProgressCallback getFileProgressCallback() const { return file_progress_callback; }
    /** Set in executeQuery and InterpreterSelectQuery. Then it is used in QueryPipeline,
      *  to update and monitor information about the total number of resources spent for the query.
      */
    void setProcessListElement(QueryStatus * elem);
    
    QueryStatus * getProcessListElement() const;
    
    ProcessList & getProcessList();
    const ProcessList & getProcessList() const;
    OvercommitTracker * getGlobalOvercommitTracker() const;
    MergeList & getMergeList();
    const MergeList & getMergeList() const;
    ReplicatedFetchList & getReplicatedFetchList();
    const ReplicatedFetchList & getReplicatedFetchList() const;
    
    
    std::shared_ptr<zkutil::ZooKeeper> getZooKeeper() const;
    
    std::shared_ptr<zkutil::ZooKeeper> getAuxiliaryZooKeeper(const String & name) const;
    
    
    
    
    bool tryCheckClientConnectionToMyKeeperCluster() const;
    UInt32 getZooKeeperSessionUptime() const;
#if USE_ROCKSDB
    MergeTreeMetadataCachePtr getMergeTreeMetadataCache() const;
    MergeTreeMetadataCachePtr tryGetMergeTreeMetadataCache() const;