In class IDiskRemote, all metadata file system operations use os file system api directly.
There is little extendiability if we want store the metadata of HDFS or S3 into distributed file system.
So I suggest change this way by using DiskPtr and will propose a pull request.

In addition, metadata of HDFS or S3 only store local FS which is not sharable.

{
    auto new_settings = settings_getter(config, "storage_configuration.disks." + name, context_);
    current_settings.set(std::move(new_settings));
    if (AsyncExecutor * exec = dynamic_cast<AsyncExecutor*>(&getExecutor()))
        exec->setMaxThreads(current_settings.get()->thread_pool_size);
}
DiskS3Settings::DiskS3Settings(
    const std::shared_ptr<Aws::S3::S3Client> & client_,
    size_t s3_max_single_read_retries_,
    size_t s3_min_upload_part_size_,
    size_t s3_max_single_part_upload_size_,
    size_t min_bytes_for_seek_,
    bool send_metadata_,
    int thread_pool_size_,
    int list_object_keys_size_,
    int objects_chunk_size_to_delete_)
    : client(client_)
    , s3_max_single_read_retries(s3_max_single_read_retries_)
    , s3_min_upload_part_size(s3_min_upload_part_size_)
    , s3_max_single_part_upload_size(s3_max_single_part_upload_size_)
    , min_bytes_for_seek(min_bytes_for_seek_)
    , send_metadata(send_metadata_)
    , thread_pool_size(thread_pool_size_)
    , list_object_keys_size(list_object_keys_size_)
    , objects_chunk_size_to_delete(objects_chunk_size_to_delete_)
{
}
}
#endif