docstr: Root client is datastore_root aware. All blob operations go through root_client's
  methods.
  
  Method calls may run on the main thread, or be submitted to a process or thread pool.
docstr_tok: ["Root","client","is","datastore_root","aware",".","All","blob","operations","go","through","root_client's","methods",".","Method","calls","may","run","on","the","main","thread",",","or","be","submitted","to","a","process","or","thread","pool","."]
code: def root_client(self):
      """Root client is datastore_root aware. All blob operations go through root_client's
      methods.
  
      Method calls may run on the main thread, or be submitted to a process or thread pool.
      """
      if self._root_client is None:
          self._root_client = _GSRootClient(
              datastore_root=self.datastore_root,
          )
      return self._root_client
  
imports: import json
  import os
  import shutil
  import uuid
  from concurrent.futures import as_completed
  from tempfile import mkdtemp
  from metaflow.datastore.datastore_storage import DataStoreStorage, CloseAfterUse
  from metaflow.exception import MetaflowInternalError
  from metaflow.metaflow_config import DATASTORE_SYSROOT_GS, ARTIFACT_LOCALROOT, GS_STORAGE_WORKLOAD_TYPE
  from metaflow.plugins.gcp.gs_storage_client_factory import get_gs_storage_client
  from metaflow.plugins.gcp.gs_utils import check_gs_deps, parse_gs_full_path, process_gs_exception
  from metaflow.plugins.storage_executor import StorageExecutor, handle_executor_exceptions
label_desc: Use image node_id 2 for calling the GSStorage obj's underlying member method code with example usage: obj.root_client() and returns: self