Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
137303a
[TENT] Complete native transport integration with receiver credit
Le1zyCatt Jul 28, 2026
c0ba30f
[TENT] Preserve receiver credit fencing on HP TCP after migration
Connor-Matthew Oct 19, 2026
999edc7
[TENT] Fix TCP regression test after receiver-credit RPC changes
Connor-Matthew Oct 19, 2026
f1c63bd
[TENT] Fix mutable receiver-credit metadata setup in HP TCP test
Connor-Matthew Oct 19, 2026
cd561d9
[TENT] Surface RecvData server errors on TCP legacy replies
Connor-Matthew Oct 19, 2026
68f1b9c
[Store][Test] Restore DFS writes before retrying revoked key
Connor-Matthew Oct 19, 2026
15bd5c5
Merge upstream main (895202123) into ub/tent4-integration
Connor-Matthew Oct 20, 2026
5cfa3da
Merge upstream main (93bc4ff5) into ub/tent4-integration
Connor-Matthew Oct 26, 2026
9eb5b2f
[TENT] Test receiver credit is held until failed staged chunks drain
Connor-Matthew Oct 26, 2026
461b462
[TENT] Back off refused receiver-credit exchanges instead of retrying…
Connor-Matthew Oct 27, 2026
492f128
Merge upstream main (fe988639) into ub/tent4-integration
Connor-Matthew Oct 27, 2026
327ec9b
Merge upstream main (811c97f0) into ub/tent4-integration
Connor-Matthew Oct 29, 2026
390290f
[Store] Remove dead and test-only code from MasterService (#5032)
Aionw Oct 29, 2026
7cf2232
[Doc] Add PyPI download statistics to documentation (#5067)
stmatengss Oct 29, 2026
e174114
fix(ci): bind HiCache Mooncake e2e metadata server to loopback (#5062)
luketong777 Oct 29, 2026
1fc920f
[TransferEngine][ROCm] Fix false-positive P2PDMA detection in kallsym…
leonzzhu Oct 29, 2026
5805e84
[TE] hp_tcp: assign each operation to the least-loaded lane (#4935)
leoleoasd Oct 29, 2026
c5d355a
[Conductor] Support index vLLM CPU events as local/shared precedence …
Misak2333 Oct 29, 2026
5e50b61
[TENT] Wait for in-flight io_uring I/O before freeing a sub-batch (#5…
zxue2 Oct 30, 2026
16fb473
[TE] Integrate error-driven congestion control with Classic RDMA (#5064)
Bo-Vincent Oct 30, 2026
f3d8166
[CI] Cap NPU mooncake build at -j2 (#5091)
MooncakeHixl Oct 30, 2026
0a5ea84
[Bugfix][PG] Derive routable host_ip before P2PHANDSHAKE init (#5007)
huangxiaobai-ydmy Oct 30, 2026
522b716
[PG] Ship PTX with the default CUDA architectures (#4999)
0z5a Oct 30, 2026
4f06cda
Merge upstream main (522b716e) into ub/tent4-integration
Connor-Matthew Oct 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ on:
- '.github/workflows/deploy.yml'
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
schedule:
- cron: "17 6 * * *"

# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
Expand Down Expand Up @@ -47,6 +49,16 @@ jobs:
run: |
pip install -r docs/requirements-docs.txt

- name: Restore download statistics
uses: actions/cache@v4
with:
path: docs/source/_static/pypi-downloads.json
key: pypi-downloads-v1-${{ github.run_id }}-${{ github.run_attempt }}
restore-keys: pypi-downloads-v1-

- name: Refresh download statistics
run: python docs/scripts/update_pypi_downloads.py

- name: Build documentation
run: |
cd docs
Expand Down
5 changes: 4 additions & 1 deletion .github/workflows/pre-release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,10 @@ jobs:
export CMAKE_PREFIX_PATH="${CMAKE_PREFIX_PATH:-}"
source /usr/local/Ascend/cann/set_env.sh
cd build
cmake --build . -j"$(nproc)"
# Cap parallelism: the mooncake-store TUs (~3-4GB each with Ascend
# headers) at -j$(nproc)=4 peak at 12-16GB and get the 16GB runner
# killed mid-compile. -j2 peaks at ~7GB and builds in ~2x the time.
cmake --build . -j2
sudo cmake --install .

- name: Generate Python version tag
Expand Down
5 changes: 4 additions & 1 deletion .github/workflows/release-npu.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,10 @@ jobs:
source /usr/local/Ascend/cann/set_env.sh
export PATH="/usr/local/go/bin:${PATH}"
cd build
cmake --build . -j"$(nproc)"
# Cap parallelism: the mooncake-store TUs (~3-4GB each with Ascend
# headers) at -j$(nproc)=4 peak at 12-16GB and get the 16GB runner
# killed mid-compile. -j2 peaks at ~7GB and builds in ~2x the time.
cmake --build . -j2
sudo cmake --install .

- name: Generate Python version tag
Expand Down
20 changes: 20 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,23 @@ If port 8000 is already in use, you can specify a different port, for example:
```bash
python -m http.server 3000 -d build/html/
```

## PyPI downloads page

`source/community/pypi-downloads.md` uses a same-origin snapshot in
`source/_static/pypi-downloads.json`; it does not depend on an external app.
The Pages workflow refreshes this snapshot during deployment and runs daily.
Successful endpoint responses are reused for 24 hours, and the workflow cache
keeps the last available responses when PyPIStats is unavailable. Collection
age and partial data are visible on the page. The committed snapshot also
supports offline documentation builds.

To refresh manually and run the offline checks, from `docs/`:

```bash
python scripts/update_pypi_downloads.py
python -m unittest discover -s tests -p 'test_pypi_downloads.py'
node --test tests/pypi-downloads.test.cjs
```

Avoid repeatedly fetching the same PyPIStats endpoints within a day.
135 changes: 135 additions & 0 deletions docs/scripts/update_pypi_downloads.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
"""Refresh the static PyPIStats snapshot, keeping usable data on upstream failure."""

import argparse
import copy
import datetime as dt
import json
import re
import time
import urllib.request
from pathlib import Path

PREFIX = "mooncake-transfer-engine"
ENDPOINTS = ("recent", "overall", "python_major", "python_minor", "system")
DEFAULT_PATH = (
Path(__file__).resolve().parents[1] / "source/_static/pypi-downloads.json"
)


def now():
return dt.datetime.now(dt.timezone.utc)


def fresh(result):
try:
age = now() - dt.datetime.fromisoformat(result["fetchedAt"])
return result["status"] == "ok" and dt.timedelta(0) <= age < dt.timedelta(
days=1
)
except (KeyError, ValueError, TypeError):
return False


def open_url(url):
request = urllib.request.Request(
url, headers={"User-Agent": "Mooncake-Docs-PyPIStats/1.0"}
)
return urllib.request.urlopen(request, timeout=30)


def discover():
with open_url("https://pypi.org/simple/") as response:
names = set()
for line in response:
names.update(
re.findall(rb">(mooncake-transfer-engine(?:-[a-z0-9-]+)?)<", line)
)
if PREFIX.encode() not in names:
raise ValueError("Incomplete PyPI package index")
return sorted(name.decode() for name in names)


def validate(payload, name, endpoint):
if payload.get("package") != name:
raise ValueError("Package name mismatch")
data = payload["data"]
if endpoint == "recent":
values = [data[key] for key in ("last_day", "last_week", "last_month")]
else:
values = [row["downloads"] for row in data]
for row in data:
dt.date.fromisoformat(row["date"])
if row["category"] is not None and not isinstance(row["category"], str):
raise ValueError("Invalid category")
keys = [(row["date"], row["category"]) for row in data]
if len(set(keys)) != len(keys):
raise ValueError("Duplicate date/category")
if not all(type(value) is int and value >= 0 for value in values):
raise ValueError("Invalid download count")
return payload


def update(previous):
result = copy.deepcopy(previous)
catalog = result["catalog"]
if not fresh(catalog):
try:
result["catalog"] = dict(
names=discover(),
source="https://pypi.org/simple/",
fetchedAt=now().isoformat(),
status="ok",
)
except Exception as error:
catalog.update(status="stale", error=str(error))
by_name = {p["name"]: p for p in result["packages"]}
result["packages"] = []
rate_limited = False
for name in result["catalog"]["names"]:
package = by_name.get(name, {"name": name, "endpoints": {}})
for endpoint in ENDPOINTS:
old = package["endpoints"].get(endpoint, {})
if fresh(old) and "payload" in old:
continue
url = f"https://pypistats.org/api/packages/{name}/{endpoint}"
try:
if rate_limited:
raise RuntimeError("Skipped after upstream rate limit")
try:
with open_url(url) as response:
payload = validate(json.load(response), name, endpoint)
finally:
time.sleep(1.1)
package["endpoints"][endpoint] = dict(
payload=payload,
source=url,
fetchedAt=now().isoformat(),
status="ok",
)
except Exception as error:
rate_limited |= getattr(error, "code", None) == 429
package["endpoints"][endpoint] = {
**old,
"source": url,
"error": str(error),
"status": "stale" if "payload" in old else "error",
}
print(f"Warning: {name}/{endpoint}: {error}")
result["packages"].append(package)
result["collectedAt"] = now().isoformat()
return result


def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--output", type=Path, default=DEFAULT_PATH)
args = parser.parse_args()
result = update(json.loads(args.output.read_text()))
temporary = args.output.with_suffix(".tmp")
temporary.write_text(json.dumps(result, separators=(",", ":")) + "\n")
temporary.replace(args.output)
print(f"Saved {len(result['packages'])} packages to {args.output}")


if __name__ == "__main__":
main()
54 changes: 54 additions & 0 deletions docs/source/_static/pypi-downloads.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/* Scoped to the downloads widget; navigation and theme stay Sphinx-native. */
.pypi-downloads { margin: 1.2rem 0 1.6rem; }
.pypi-downloads button, .pypi-downloads select {
font: inherit; font-size: .8rem; color: var(--pst-color-text-base);
border: 1px solid var(--pst-color-border); border-radius: .35rem;
padding: .3rem .55rem; background: var(--pst-color-background);
}
.pypi-downloads button { cursor: pointer; }
.pypi-downloads :focus-visible { outline: 2px solid var(--pst-color-primary); outline-offset: 2px; }
.pypi-downloads .pypi-status { color: var(--pst-color-text-muted); font-size: .76rem; line-height: 1.6; margin: .6rem 0; }
.pypi-controls { display: flex; align-items: center; gap: .8rem; flex-wrap: wrap; font-size: .8rem; }
.pypi-controls label { display: flex; align-items: center; gap: .35rem; margin: 0; }
.pypi-controls button { margin-left: auto; }
.pypi-packages { display: flex; gap: .35rem; flex-wrap: wrap; margin: .8rem 0 1.3rem; }
.pypi-packages button[aria-pressed="true"] { color: var(--pst-color-primary); background: var(--pst-color-surface); border-color: var(--pst-color-primary); }
.pypi-packages button[aria-pressed="false"] { opacity: .6; }
.pypi-metrics { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: .7rem; }
.pypi-metrics > div { padding: .8rem 1rem; border: 1px solid var(--pst-color-border); border-radius: .45rem; }
.pypi-metrics span, .pypi-metrics small { display: block; color: var(--pst-color-text-muted); font-size: .75rem; }
.pypi-metrics strong { display: block; font-size: 1.6rem; font-weight: 600; margin: .3rem 0; font-variant-numeric: tabular-nums; }
.pypi-metrics small { font-size: .65rem; }
.pypi-chart-heading { display: flex; justify-content: space-between; gap: .8rem; flex-wrap: wrap; align-items: baseline; margin-top: 1.5rem; }
.pypi-chart-heading strong { font-size: .95rem; }
.pypi-chart-heading span { font-size: .7rem; color: var(--pst-color-text-muted); }
.pypi-chart svg { width: 100%; height: auto; display: block; }
.pypi-chart svg text { font: 11px sans-serif; fill: var(--pst-color-text-muted); }
.pypi-grid { stroke: var(--pst-color-border); stroke-width: 1; stroke-dasharray: 3 4; }
.pypi-point { opacity: .2; }
.pypi-point:hover, .pypi-point:focus { opacity: 1; r: 5; outline: none; }
.pypi-legend { display: flex; flex-wrap: wrap; gap: .8rem; font-size: .7rem; color: var(--pst-color-text-muted); }
.pypi-legend span { display: flex; align-items: center; gap: .3rem; }
.pypi-legend i { width: .4rem; height: .4rem; border-radius: 50%; }
.pypi-table { overflow-x: auto; margin-top: 1rem; }
.pypi-table table { width: 100%; border-collapse: collapse; font-size: .78rem; }
.pypi-table th, .pypi-table td { padding: .55rem .65rem; border-bottom: 1px solid var(--pst-color-border); text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; }
.pypi-table th:first-child { text-align: left; }
.pypi-table thead th { color: var(--pst-color-text-muted); font-size: .7rem; font-weight: 500; }
.pypi-table tbody th { font-weight: 500; }
.pypi-environment { border-top: 1px solid var(--pst-color-border); padding-top: .8rem; margin-top: 1.3rem; }
.pypi-environment summary { cursor: pointer; font-size: .85rem; font-weight: 600; }
.pypi-columns { display: grid; grid-template-columns: 1fr 1fr; gap: 2rem; margin-top: 1rem; }
.pypi-columns h2 { font-size: .9rem; margin: 0 0 .6rem; }
.pypi-bar { margin: .8rem 0; }
.pypi-bar > span { display: flex; justify-content: space-between; gap: .5rem; font-size: .7rem; }
.pypi-bar meter { width: 100%; height: .5rem; display: block; margin-top: .25rem; accent-color: var(--pst-color-primary); }
.pypi-downloads .pypi-warning { font-size: .8rem; border-left: 3px solid var(--pst-color-warning); padding: .5rem .8rem; }
@media (max-width: 600px) {
.pypi-metrics { gap: .4rem; }
.pypi-metrics > div { padding: .65rem .5rem; }
.pypi-metrics strong { font-size: 1.25rem; }
.pypi-metrics span { font-size: .65rem; }
.pypi-columns { grid-template-columns: 1fr; gap: 1rem; }
.pypi-controls { gap: .5rem; }
}
Loading
Loading