From 9317ebca2f940d8ee9ba595ec7d24468d812a9f7 Mon Sep 17 00:00:00 2001 From: cccclai Date: Thu, 20 Nov 2025 15:40:57 -0800 Subject: [PATCH 1/5] Refactor download function for robustness and retries Updated the download function to use requests for robust streaming with retries and improved error handling. --- backends/qualcomm/scripts/download_qnn_sdk.py | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/backends/qualcomm/scripts/download_qnn_sdk.py b/backends/qualcomm/scripts/download_qnn_sdk.py index 1bd844e2288..705de3bfa47 100644 --- a/backends/qualcomm/scripts/download_qnn_sdk.py +++ b/backends/qualcomm/scripts/download_qnn_sdk.py @@ -115,22 +115,43 @@ def _atomic_download(url: str, dest: pathlib.Path): def _download_archive(url: str, archive_path: pathlib.Path) -> bool: - """Download archive from URL with progress reporting.""" + """Robust streaming download with retries.""" + logger.debug("Archive will be saved to: %s", archive_path) + session = requests.Session() + retries = Retry( + total=5, + backoff_factor=1.0, + status_forcelist=[429, 500, 502, 503, 504], + allowed_methods=["GET"], + ) + session.mount("https://", HTTPAdapter(max_retries=retries)) + try: - urllib.request.urlretrieve(url, archive_path, _make_report_progress()) + with session.get(url, stream=True) as r: + r.raise_for_status() + + total = int(r.headers.get("content-length", 0)) + downloaded = 0 + chunk_size = 1024 * 1024 # 1MB + + with open(archive_path, "wb") as f: + for chunk in r.iter_content(chunk_size): + if chunk: + f.write(chunk) + downloaded += len(chunk) + _make_report_progress()(downloaded, downloaded, total) + logger.info("Download completed!") + except Exception as e: - logger.exception("Error during download: %s", e) + logger.error("Error during download: %s", e) return False if archive_path.exists() and archive_path.stat().st_size == 0: logger.warning("Downloaded file is empty!") return False - elif not archive_path.exists(): - logger.error("File was not downloaded!") - return False return True From 520aedadf066255e4568c046318afd52314b5091 Mon Sep 17 00:00:00 2001 From: cccclai Date: Thu, 20 Nov 2025 15:49:30 -0800 Subject: [PATCH 2/5] Import requests and HTTPAdapter in download_qnn_sdk.py Added requests library and HTTPAdapter for improved HTTP handling. --- backends/qualcomm/scripts/download_qnn_sdk.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backends/qualcomm/scripts/download_qnn_sdk.py b/backends/qualcomm/scripts/download_qnn_sdk.py index 705de3bfa47..cbf3fc98740 100644 --- a/backends/qualcomm/scripts/download_qnn_sdk.py +++ b/backends/qualcomm/scripts/download_qnn_sdk.py @@ -13,7 +13,8 @@ import urllib.request import zipfile from typing import Dict, List, Optional, Tuple - +import requests +from requests.adapters import HTTPAdapter, Retry logger = logging.getLogger(__name__) logger.addHandler(logging.NullHandler()) From c526f3b30accbe0d311e52a97bfb97266da465f8 Mon Sep 17 00:00:00 2001 From: cccclai Date: Thu, 20 Nov 2025 16:27:16 -0800 Subject: [PATCH 3/5] Improve error logging during download process update --- backends/qualcomm/scripts/download_qnn_sdk.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backends/qualcomm/scripts/download_qnn_sdk.py b/backends/qualcomm/scripts/download_qnn_sdk.py index cbf3fc98740..7fc506f5c6a 100644 --- a/backends/qualcomm/scripts/download_qnn_sdk.py +++ b/backends/qualcomm/scripts/download_qnn_sdk.py @@ -13,6 +13,7 @@ import urllib.request import zipfile from typing import Dict, List, Optional, Tuple + import requests from requests.adapters import HTTPAdapter, Retry @@ -147,12 +148,16 @@ def _download_archive(url: str, archive_path: pathlib.Path) -> bool: logger.info("Download completed!") except Exception as e: - logger.error("Error during download: %s", e) + logger.exception("Error during download: %s", e) return False if archive_path.exists() and archive_path.stat().st_size == 0: logger.warning("Downloaded file is empty!") return False + elif not archive_path.exists(): + logger.error("File was not downloaded!") + return False + return True From 0d91c11e128b35a1ee8374699c0b335ad0c16a2f Mon Sep 17 00:00:00 2001 From: Chen Lai Date: Thu, 20 Nov 2025 17:54:29 -0800 Subject: [PATCH 4/5] more retry --- backends/qualcomm/scripts/install_qnn_sdk.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/qualcomm/scripts/install_qnn_sdk.sh b/backends/qualcomm/scripts/install_qnn_sdk.sh index d9d79d3d0db..5bc0f7eeb1d 100644 --- a/backends/qualcomm/scripts/install_qnn_sdk.sh +++ b/backends/qualcomm/scripts/install_qnn_sdk.sh @@ -27,7 +27,7 @@ setup_android_ndk() { mkdir -p "${NDK_INSTALL_DIR}" NDK_ZIP="android-ndk-${NDK_VERSION}-linux.zip" - curl --retry 3 -Lo "/tmp/${NDK_ZIP}" "https://dl.google.com/android/repository/${NDK_ZIP}" + curl --retry 3 --retry-delay 5 --retry-connrefused --continue-at - -Lo "/tmp/${NDK_ZIP}" "https://dl.google.com/android/repository/${NDK_ZIP}" unzip -q "/tmp/${NDK_ZIP}" -d "${NDK_INSTALL_DIR}" mv "${NDK_INSTALL_DIR}/android-ndk-${NDK_VERSION}" "${NDK_INSTALL_DIR}/ndk" From de5ca1ccb3e46e371ea440c299a517e71f291baf Mon Sep 17 00:00:00 2001 From: Chen Lai Date: Thu, 20 Nov 2025 18:02:36 -0800 Subject: [PATCH 5/5] update --- backends/qualcomm/scripts/download_qnn_sdk.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/qualcomm/scripts/download_qnn_sdk.py b/backends/qualcomm/scripts/download_qnn_sdk.py index 7fc506f5c6a..ebae7238e14 100644 --- a/backends/qualcomm/scripts/download_qnn_sdk.py +++ b/backends/qualcomm/scripts/download_qnn_sdk.py @@ -157,7 +157,7 @@ def _download_archive(url: str, archive_path: pathlib.Path) -> bool: elif not archive_path.exists(): logger.error("File was not downloaded!") return False - + return True