Problem
Since #144, SimpleStorage hard round-robins storage units across every alive Ray node. This preserves even distribution on a homogeneous cluster, but it also places storage units across unrelated node groups in a shared heterogeneous cluster.
A public two-node reproduction is:
# Node A
ray start --head --resources='{"storage_pool": 1}'
# Node B
ray start --address='<head-address>' --resources='{"compute_pool": 1}'
With both nodes alive, initializing SimpleStorage schedules units across both nodes even when only nodes advertising storage_pool should host storage.
Proposed behavior
Add an optional SimpleStorage placement filter based on a Ray custom resource, for example an eligible custom-resource name or equivalent node filter.
- When the option is unset, keep the current behavior exactly: round-robin across all alive Ray nodes.
- When set, include only alive nodes whose matching custom resource has a positive capacity.
- Keep hard
NodeAffinitySchedulingStrategy placement and round-robin only within the eligible set.
- If no alive node matches, fail during initialization with a clear error instead of creating actors that cannot satisfy the intended placement.
- Dead nodes must never be eligible.
This should only filter the node list used by SimpleStorage; it should not monkeypatch Ray scheduling or change other storage backends.
Suggested tests
- Unset option preserves all-alive-node round-robin behavior.
- A custom-resource filter excludes otherwise alive nodes.
- Dead nodes are excluded even when they advertise the resource.
- No matching alive node raises a clear initialization error.
Problem
Since #144,
SimpleStoragehard round-robins storage units across every alive Ray node. This preserves even distribution on a homogeneous cluster, but it also places storage units across unrelated node groups in a shared heterogeneous cluster.A public two-node reproduction is:
With both nodes alive, initializing
SimpleStorageschedules units across both nodes even when only nodes advertisingstorage_poolshould host storage.Proposed behavior
Add an optional
SimpleStorageplacement filter based on a Ray custom resource, for example an eligible custom-resource name or equivalent node filter.NodeAffinitySchedulingStrategyplacement and round-robin only within the eligible set.This should only filter the node list used by
SimpleStorage; it should not monkeypatch Ray scheduling or change other storage backends.Suggested tests