Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[runtime env] URI reference refactor #22828

Merged
merged 27 commits into from
Mar 21, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
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
Prev Previous commit
Next Next commit
add test_reference_table
  • Loading branch information
SongGuyang committed Mar 18, 2022
commit b80289edd3a97cb47ddb703c122720b14277f3c5
6 changes: 3 additions & 3 deletions dashboard/modules/runtime_env/runtime_env_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,8 @@ class ReferenceTable:

def __init__(
self,
uris_parser: Callable[[RuntimeEnv], None],
unused_uris_callback: Callable[[List[Tuple[UriType, str]]], None],
uris_parser: Callable[[RuntimeEnv], Tuple[str, UriType]],
unused_uris_callback: Callable[[List[Tuple[str, UriType]]], None],
unused_runtime_env_callback: Callable[[str], None],
):
# Runtime Environment reference table. The key is serialized runtime env and
Expand Down Expand Up @@ -222,7 +222,7 @@ def uris_parser(self, runtime_env):
result.append((uri, UriType.CONDA))
return result

def unused_uris_processor(self, unused_uris: List[Tuple[UriType, str]]) -> None:
def unused_uris_processor(self, unused_uris: List[Tuple[str, UriType]]) -> None:
for uri, uri_type in unused_uris:
if uri_type == UriType.WORKING_DIR:
self._working_dir_uri_cache.mark_unused(uri)
Expand Down
82 changes: 82 additions & 0 deletions dashboard/modules/runtime_env/tests/test_runtime_env_agent.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
import sys
import pytest

from typing import List, Tuple
from ray.dashboard.modules.runtime_env.runtime_env_agent import UriType, ReferenceTable
from ray.runtime_env import RuntimeEnv


def test_reference_table():
expected_unused_uris = []
expected_unused_runtime_env = str()

def uris_parser(runtime_env) -> Tuple[str, UriType]:
result = list()
result.append((runtime_env.working_dir(), UriType.WORKING_DIR))
py_module_uris = runtime_env.py_modules()
for uri in py_module_uris:
result.append((uri, UriType.PY_MODULES))
return result

def unused_uris_processor(unused_uris: List[Tuple[str, UriType]]) -> None:
nonlocal expected_unused_uris
assert expected_unused_uris
for unused in unused_uris:
assert unused in expected_unused_uris
expected_unused_uris.remove(unused)
assert not expected_unused_uris

def unused_runtime_env_processor(unused_runtime_env: str) -> None:
nonlocal expected_unused_runtime_env
assert expected_unused_runtime_env
assert expected_unused_runtime_env == unused_runtime_env
expected_unused_runtime_env = None

reference_table = ReferenceTable(
uris_parser, unused_uris_processor, unused_runtime_env_processor
)
runtime_env_1 = RuntimeEnv(
working_dir="s3:https://working_dir_1.zip",
py_modules=["s3:https://py_module_A.zip", "s3:https://py_module_B.zip"],
)
runtime_env_2 = RuntimeEnv(
working_dir="s3:https://working_dir_2.zip",
py_modules=["s3:https://py_module_A.zip", "s3:https://py_module_C.zip"],
)
# Add runtime env 1
reference_table.increase_reference(
runtime_env_1, runtime_env_1.serialize(), "raylet"
)
# Add runtime env 2
reference_table.increase_reference(
runtime_env_2, runtime_env_2.serialize(), "raylet"
)
# Add runtime env 1 by `client_server`, this will be skipped by reference table.
reference_table.increase_reference(
runtime_env_1, runtime_env_1.serialize(), "client_server"
)

# Remove runtime env 1
expected_unused_uris.append(("s3:https://working_dir_1.zip", UriType.WORKING_DIR))
expected_unused_uris.append(("s3:https://py_module_B.zip", UriType.PY_MODULES))
expected_unused_runtime_env = runtime_env_1.serialize()
reference_table.decrease_reference(
runtime_env_1, runtime_env_1.serialize(), "raylet"
)
assert not expected_unused_uris
assert not expected_unused_runtime_env

# Remove runtime env 2
expected_unused_uris.append(("s3:https://working_dir_2.zip", UriType.WORKING_DIR))
expected_unused_uris.append(("s3:https://py_module_A.zip", UriType.PY_MODULES))
expected_unused_uris.append(("s3:https://py_module_C.zip", UriType.PY_MODULES))
expected_unused_runtime_env = runtime_env_2.serialize()
reference_table.decrease_reference(
runtime_env_2, runtime_env_2.serialize(), "raylet"
)
assert not expected_unused_uris
assert not expected_unused_runtime_env


if __name__ == "__main__":
sys.exit(pytest.main(["-v", __file__]))