Fix dashboard agent check ppid is raylet pid (#12256)

* Dashboard agent check ppid is raylet pid

* Improve implementation

* Refine code

* Make the RAY_NODE_PID environment required for dashboard agent

Co-authored-by: 刘宝 <po.lb@antfin.com>
This commit is contained in:
fyrestone
2020-12-09 09:12:34 -05:00
committed by GitHub
co-authored by 刘宝
parent 840de49161
commit 3ce9286977
3 changed files with 11 additions and 1 deletions
+4 -1
View File
@@ -91,9 +91,12 @@ class DashboardAgent(object):
async def _check_parent():
"""Check if raylet is dead."""
curr_proc = psutil.Process()
ppid = int(os.environ["RAY_NODE_PID"])
logger.info("Parent pid is %s", ppid)
while True:
parent = curr_proc.parent()
if parent is None or parent.pid == 1:
if parent is None or parent.pid == 1 or (ppid and
ppid != parent.pid):
logger.error("raylet is dead, agent will die because "
"it fate-shares with raylet.")
sys.exit(0)
+5
View File
@@ -137,6 +137,11 @@ def test_basic(ray_start_with_dashboard):
assert agent_proc.pid == agent_pid
time.sleep(1)
# The agent should be dead if raylet exits.
raylet_proc.kill()
raylet_proc.wait()
agent_proc.wait(5)
# Check redis keys are set.
logger.info("Check redis keys are set.")
dashboard_address = client.get(dashboard_consts.REDIS_KEY_DASHBOARD)
+2
View File
@@ -58,8 +58,10 @@ void AgentManager::StartAgent() {
}
argv.push_back(NULL);
// Set node id to agent.
static std::string pid_string = std::to_string(getpid());
ProcessEnvironment env;
env.insert({"RAY_NODE_ID", options_.node_id.Hex()});
env.insert({"RAY_NODE_PID", pid_string});
Process child(argv.data(), nullptr, ec, false, env);
if (!child.IsValid() || ec) {
// The worker failed to start. This is a fatal error.