code: def test_syncer_wait_or_retry_failure(temp_data_dirs, tmp_path):
      """Check that the wait or retry API fails after max_retries."""
      tmp_source, tmp_target = temp_data_dirs
  
      syncer = _FilesystemSyncer(
          storage_filesystem=lambda: "error", sync_period=60
      )
  
      # Will fail since the storage filesystem is invalid
      syncer.sync_up(
          local_dir=tmp_source,
          remote_dir="/test/test_syncer_wait_or_retry",
      )
      with pytest.raises(RuntimeError) as e:
          syncer.wait_or_retry(max_retries=3, backoff_s=0)
  
      assert "Failed sync even after 3 retries." in str(e.value)
  
imports: import logging
  import os
  import time
  from typing import List, Optional
  from freezegun import freeze_time
  import pytest
  import ray
  import ray.cloudpickle
  from ray.train._internal.storage import _upload_to_fs_path, _download_from_fs_path, get_fs_and_path, _FilesystemSyncer
  from ray.train._internal.syncer import _BackgroundProcess
  from ray.train.tests.test_new_persistence import _create_mock_custom_fs
label_desc: Use image node_id 15 for calling a global function with example usage: test_syncer_wait_or_retry_failure(temp_data_dirs, tmp_path) without return types