Skip to content

[pull] master from ray-project:master#1074

Merged
pull[bot] merged 5 commits into
garymm:masterfrom
ray-project:master
Jun 15, 2026
Merged

[pull] master from ray-project:master#1074
pull[bot] merged 5 commits into
garymm:masterfrom
ray-project:master

Conversation

@pull

@pull pull Bot commented Jun 15, 2026

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

edoakes and others added 5 commits June 15, 2026 08:57
Continuing the effort to unify our time usage on the `ClockInterface` to
enable deterministic and fast unit testing.

---------

Signed-off-by: Edward Oakes <ed.nmi.oakes@gmail.com>
…3795)

## Why are these changes needed?

This PR partially resolves #49342 (specifically addressing the first
bullet point regarding Cluster view navigation).

**The Problem:** Currently, when viewing the Nodes table in the Cluster
view, the worker process name is plain text. There is no quick way to
jump to the details of a specific Actor running on that node without
manually copy-pasting IDs into the search bar.

**The Solution:** This PR updates the `WorkerRow` component inside
`NodeRow.tsx` so that the worker's process name (the `cmdline` string)
now acts as a direct `<Link>` to the Actor Detail page (if the worker is
hosting an Actor).

### Architectural Code Choices
During implementation, I had to account for several backend data
structures exported by Ray:
1. **Array Extraction:** `worker.coreWorkerStats` is passed as an array
to the frontend. The logic extracts `coreWorkerStats[0]` to safely
access the ID.
2. **"Nil" ID Handling:** If a worker is *not* an actor, Ray does not
set `actorId` to null/undefined. Instead, it passes a "Nil" ID (a string
of 32 or 40 `f`s). I added an explicit check against this `ffff...`
string to prevent linking users to non-existent actor pages.
3. **Task IDs are 1:N:** We cannot natively link generic task workers to
a specific `/tasks/{taskId}` page from this view. A worker process is
long-lived and executes many tasks sequentially, so the backend does not
expose a single `taskId` in the top-level worker stats.
4. **The Fallback:** If the worker is not an Actor, it safely falls back
to linking to `/cluster/nodes/{nodeId}` (the Node Detail page) to
preserve navigation utility.

## Related issue number
Resolves #49342

## Testing Instructions
1. Start a local Ray cluster.
2. Run a script that spawns a long-running Actor:
```python
import ray
import time

ray.init()

@ray.remote
class DummyActor:
    def do_work(self):
        time.sleep(3600)

a = DummyActor.remote()
a.do_work.remote()

while True:
    time.sleep(1)

---------

Signed-off-by: Ayush KAshyap <kashyap11ayush02@gmail.com>
Updates consumers of `PeriodicalRunner` to take the dependency-injected
interface.

This sets us up to implement a `FakePeriodicalRunner` that integrates
with the `FakeClock` for deterministic testing:
#64065

---------

Signed-off-by: Edward Oakes <ed.nmi.oakes@gmail.com>
Cleans up a few remaining callsites that did not use the clock
interface.

Also addressing this comment:
#63956 (comment) and
fixing a few other places where we should be using monotonic time but
are using wall-clock time.

---------

Signed-off-by: Edward Oakes <ed.nmi.oakes@gmail.com>
Previously, the metrics exported by the `IOContextMonitor` were:

- A gauge indicating the most recent probe latency.
- A gauge indicating if the io_context was currently deemed healthy or
unhealthy.

These were chosen for simplicity. However, in my manual testing of the
PR that integrates the monitor into the GCS
(#63930), I found some issues
with this, primarily due to load spikes on the io_context that cause
transient problems to get missed. To address this, I'm making the
following two changes:

- Modifying the gauge of the probe latency to be based on a sliding
window. The default sliding window duration is set to 20s, which exceeds
the default prometheus scraping interval of 15s. This way, we should be
able to see the _max_ io_context latency within each interval.
- Changing the health gauge to an unhealthy count. This way, if we have
transient spikes that cause a probe to miss the deadline but then
recover, we will see it reflected in the metrics as the count increasing
over time. This again means we won't miss unhealthy io contexts due to
the scraping interval.

I've opted for the windowed latency instead of a histogram because I
think it's the minimal thing that will give us the signal that we want
here, without needing to deal with the complexities of prometheus
histograms which have been confusing in the past due to the discrete
bucketing. The downside is it does not indicate the median io_context
latency. That could be added in the future.

---------

Signed-off-by: Edward Oakes <ed.nmi.oakes@gmail.com>
@pull pull Bot locked and limited conversation to collaborators Jun 15, 2026
@pull pull Bot added the ⤵️ pull label Jun 15, 2026
@pull pull Bot merged commit 5e3e23a into garymm:master Jun 15, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants