class_docstr: The class for filesystem-like external storage.
  
  Raises:
      ValueError: Raises directory path to
          spill objects doesn't exist.
class_docstr_tok: ["The","class","for","filesystem-like","external","storage",".","Raises",":","ValueError",":","Raises","directory","path","to","spill","objects","does","n't","exist","."]
code: def _destroy_external_storage(self, directory_path):
      # There's a race condition where IO workers are still
      # deleting each objects while we try deleting the
      # whole directory. So we should keep trying it until
      # The directory is actually deleted.
      while os.path.isdir(directory_path):
          try:
              shutil.rmtree(directory_path)
          except FileNotFoundError:
              # If exception occurs when other IO workers are
              # deleting the file at the same time.
              pass
          except Exception:
              logger.exception(
                  "Error cleaning up spill files. "
                  "You might still have remaining spilled "
                  "objects inside `ray_spilled_objects` directory."
              )
              break
  
imports: import abc
  import logging
  import os
  import random
  import shutil
  import time
  import urllib
  import uuid
  from collections import namedtuple
  from typing import IO, List, Optional, Tuple
  import ray
  from ray._private.ray_constants import DEFAULT_OBJECT_PREFIX
  from ray._raylet import ObjectRef
label_desc: Use image node_id 6 for calling the FileSystemStorage obj's underlying member method code with example usage: obj._destroy_external_storage(directory_path) without return types