code: def _get_task_datastore(
      self,
      ds_type,
      ds_root,
      flow_name,
      run_id,
      step_name,
      task_id,
      attempt,
  ):
      flow_ds = self._get_flow_datastore(ds_type, ds_root, flow_name)
      cached_metadata = None
      if attempt is not None:
          cache_id = self._task_ds_id(
              ds_type,
              ds_root,
              flow_name,
              run_id,
              step_name,
              task_id,
              attempt,
          )
          cached_metadata = self._task_metadata_caches.get(cache_id)
          if cached_metadata:
              od_move_to_end(self._task_metadata_caches, cache_id)
              return flow_ds.get_task_datastore(
                  run_id,
                  step_name,
                  task_id,
                  attempt=attempt,
                  data_metadata=cached_metadata,
              )
      # If we are here, we either have attempt=None or nothing in the cache
      task_ds = flow_ds.get_task_datastore(
          run_id, step_name, task_id, attempt=attempt
      )
      cache_id = self._task_ds_id(
          ds_type,
          ds_root,
          flow_name,
          run_id,
          step_name,
          task_id,
          task_ds.attempt,
      )
      self._task_metadata_caches[cache_id] = task_ds.ds_metadata
      if (
          len(self._task_metadata_caches)
          > CLIENT_CACHE_MAX_TASKDATASTORE_COUNT
      ):
          self._task_metadata_caches.popitem(last=False)
      return task_ds
  
imports: from __future__ import print_function
  from collections import OrderedDict
  import os
  import sys
  import time
  from tempfile import NamedTemporaryFile
  from hashlib import sha1
  from metaflow.datastore import FlowDataStore
  from metaflow.datastore.content_addressed_store import BlobCache
  from metaflow.exception import MetaflowException
  from metaflow.metaflow_config import CLIENT_CACHE_PATH, CLIENT_CACHE_MAX_SIZE, CLIENT_CACHE_MAX_FLOWDATASTORE_COUNT, CLIENT_CACHE_MAX_TASKDATASTORE_COUNT
  from metaflow.plugins import DATASTORES
label_desc: Use image node_id 23 for calling the FileCache obj's underlying member method code with example usage: obj._get_task_datastore(ds_type, ds_root, flow_name, run_id, step_name, task_id, attempt) and returns: task_ds, flow_ds