pytorch/r2-outage-toggle
Disable or re-enable Cloudflare R2 (download-r2.pytorch.org) usage in manage_v2.py during R2 outages. Can toggle R2 off/on for nightly builds, prod/stable builds, or both. The affected packages are PT_FOUNDATION_PACKAGES (torch, torchvision, torchaudio, fbgemm_gpu, fbgemm_gpu_genai, triton, pytorch_triton, pytorch_triton_rocm, pytorch_triton_xpu).
npx skills add https://github.com/pytorch/test-infra --skill r2-outage-toggle
Modifies s3_management/manage_v2.py to disable or re-enable Cloudflare R2 (download-r2.pytorch.org) URL generation for PyTorch foundation packages. Use during R2 outages to fall back to S3/CloudFront, or to restore R2 usage after an outage is resolved.
Use when the user asks to:
s3_management/manage_v2.py (relative to repo root)
There are two sets that control which packages use R2 URLs:
| Set | Purpose | Location |
|-----|---------|----------|
| PT_R2_PACKAGES | Packages using R2 for nightly builds (whl/nightly) | ~line 437 |
| PT_R2_PACKAGES_PROD | Packages using R2 for prod/stable builds (not test, not nightly) | ~line 452 |
Both sets contain members of PT_FOUNDATION_PACKAGES. The URL routing logic is in the to_simple_package_html method (~line 799-824).
Ask the user (if not already clear) two things:
Read s3_management/manage_v2.py and check the current contents of PT_R2_PACKAGES and PT_R2_PACKAGES_PROD. They may already be empty (disabled) or populated (enabled).
To disable R2, empty the relevant set(s) while preserving a comment showing the original contents. This ensures easy re-enablement.
Disable R2 for nightly — Replace the PT_R2_PACKAGES set with an empty set:
# Packages that should use R2 (download-r2.pytorch.org) for nightly builds
# These packages will have their URLs point to R2 instead of S3/CloudFront
# when the path is whl/nightly
# R2 DISABLED - original packages commented out during R2 outage:
# "torch", "torchvision", "torchaudio", "fbgemm_gpu", "fbgemm_gpu_genai",
# "triton", "pytorch_triton", "pytorch_triton_rocm", "pytorch_triton_xpu"
PT_R2_PACKAGES: set[str] = set()
Disable R2 for prod — Replace the PT_R2_PACKAGES_PROD set with an empty set:
# Packages that should use R2 (download-r2.pytorch.org) for prod/stable builds
# These packages will have their URLs point to R2 instead of S3/CloudFront
# when the path is NOT whl/test and NOT whl/nightly (i.e., prod)
# R2 DISABLED - original packages commented out during R2 outage:
# "torchaudio", "fbgemm_gpu", "fbgemm_gpu_genai"
PT_R2_PACKAGES_PROD: set[str] = set()
Restore the original set contents and remove the outage comments.
Re-enable R2 for nightly — Restore PT_R2_PACKAGES:
# Packages that should use R2 (download-r2.pytorch.org) for nightly builds
# These packages will have their URLs point to R2 instead of S3/CloudFront
# when the path is whl/nightly
PT_R2_PACKAGES = {
"torch",
"torchvision",
"torchaudio",
"fbgemm_gpu",
"fbgemm_gpu_genai",
"triton",
"pytorch_triton",
"pytorch_triton_rocm",
"pytorch_triton_xpu",
}
Re-enable R2 for prod — Restore PT_R2_PACKAGES_PROD:
# Packages that should use R2 (download-r2.pytorch.org) for prod/stable builds
# These packages will have their URLs point to R2 instead of S3/CloudFront
# when the path is NOT whl/test and NOT whl/nightly (i.e., prod)
PT_R2_PACKAGES_PROD = {
"torchaudio",
"fbgemm_gpu",
"fbgemm_gpu_genai",
}
After editing, read back the modified sections to confirm correctness. Also verify that:
to_simple_package_html method logic (~line 799-824) was NOT modified — it naturally handles empty sets correctly (no packages will match, so R2 URLs won't be generated).PT_R2_PACKAGES or PT_R2_PACKAGES_PROD were affected.After making the change, remind the user:
> Important: This change only modifies the source file. To take effect, you need to:
> 1. Commit and land this change
> 2. Re-run the index generation: python s3_management/manage_v2.py all
> (or target specific prefixes like whl/nightly or whl depending on scope)
>
> The index HTML files will be regenerated with S3/CloudFront URLs (relative URLs for foundation packages) instead of download-r2.pytorch.org URLs.
The URL routing in to_simple_package_html checks package membership in these sets:
if package_name.lower() in PT_R2_PACKAGES and resolved_subdir.startswith("whl/nightly"):
base_url = "https://download-r2.pytorch.org"
elif package_name.lower() in PT_R2_PACKAGES_PROD and not test and not nightly:
base_url = "https://download-r2.pytorch.org"
elif use_cloudfront_for_non_foundation and package not in PT_FOUNDATION_PACKAGES:
base_url = "https://d21usjoq99fcb9.cloudfront.net"
else:
base_url = "" # relative URL (served from S3)
When the sets are empty, no package matches the R2 conditions, so foundation packages fall through to base_url = "" (relative URLs served from S3). This is the safe fallback during an R2 outage.
Disable R2 for everything during an outage:
R2 is down, disable R2 for both nightly and prod
Disable R2 for nightly only:
Turn off R2 for nightly builds
Re-enable after outage is resolved:
R2 outage is over, re-enable R2 for nightly and prod
Take pytorch/r2-outage-toggle from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.