in esrally/track/loader.py [0:0]
def download(self, base_url, target_path, size_in_bytes):
file_name = os.path.basename(target_path)
if not base_url:
raise exceptions.DataError("Cannot download data because no base URL is provided.")
if self.offline:
raise exceptions.SystemSetupError(f"Cannot find [{target_path}]. Please disable offline mode and retry.")
if base_url.endswith("/"):
separator = ""
else:
separator = "/"
# join manually as `urllib.parse.urljoin` does not work with S3 or GS URL schemes.
data_url = f"{base_url}{separator}{file_name}"
try:
io.ensure_dir(os.path.dirname(target_path))
if size_in_bytes:
size_in_mb = round(convert.bytes_to_mb(size_in_bytes))
self.logger.info("Downloading data from [%s] (%s MB) to [%s].", data_url, size_in_mb, target_path)
else:
self.logger.info("Downloading data from [%s] to [%s].", data_url, target_path)
# we want to have a bit more accurate download progress as these files are typically very large
progress = net.Progress("[INFO] Downloading track data", accuracy=1)
net.download(data_url, target_path, size_in_bytes, progress_indicator=progress)
progress.finish()
self.logger.info("Downloaded data from [%s] to [%s].", data_url, target_path)
except urllib.error.HTTPError as e:
if e.code == 404 and self.test_mode:
raise exceptions.DataError(
"This track does not support test mode. Ask the track author to add it or disable test mode and retry."
) from None
msg = f"Could not download [{data_url}] to [{target_path}]"
if e.reason:
msg += f" (HTTP status: {e.code}, reason: {e.reason})"
else:
msg += f" (HTTP status: {e.code})"
raise exceptions.DataError(msg) from e
except urllib.error.URLError as e:
raise exceptions.DataError(f"Could not download [{data_url}] to [{target_path}].") from e
if not os.path.isfile(target_path):
raise exceptions.SystemSetupError(
f"Could not download [{data_url}] to [{target_path}]. Verify data "
f"are available at [{data_url}] and check your Internet connection."
)
actual_size = os.path.getsize(target_path)
if size_in_bytes is not None and actual_size != size_in_bytes:
raise exceptions.DataError(
f"[{target_path}] is corrupt. Downloaded [{actual_size}] bytes but [{size_in_bytes}] bytes are expected."
)