Merge pull request #1671 from ceph/wip-7699

mds: Fix respawn (add path resolution)

Reviewed-by: Greg Farnum <greg@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
This commit is contained in:
Sage Weil 2014-04-17 10:05:22 -07:00
commit b0338ca361

View File

@ -749,6 +749,9 @@ void MDS::handle_command(MMonCommand *m)
else if (m->cmd[0] == "exit") {
suicide();
}
else if (m->cmd[0] == "respawn") {
respawn();
}
else if (m->cmd[0] == "session" && m->cmd[1] == "kill") {
Session *session = sessionmap.get_session(entity_name_t(CEPH_ENTITY_TYPE_CLIENT,
strtol(m->cmd[2].c_str(), 0, 10)));
@ -1696,13 +1699,25 @@ void MDS::respawn()
}
new_argv[orig_argc] = NULL;
char buf[PATH_MAX];
char *cwd = getcwd(buf, sizeof(buf));
assert(cwd);
dout(1) << " cwd " << cwd << dendl;
/* Determine the path to our executable, try to read
* linux-specific /proc/ path first */
char exe_path[PATH_MAX];
ssize_t exe_path_bytes = readlink("/proc/self/exe", exe_path, sizeof(exe_path));
if (exe_path_bytes == -1) {
/* Print CWD for the user's interest */
char buf[PATH_MAX];
char *cwd = getcwd(buf, sizeof(buf));
assert(cwd);
dout(1) << " cwd " << cwd << dendl;
/* Fall back to a best-effort: just running in our CWD */
strncpy(exe_path, orig_argv[0], sizeof(exe_path));
}
dout(1) << " exe_path " << exe_path << dendl;
unblock_all_signals(NULL);
execv(orig_argv[0], new_argv);
execv(exe_path, new_argv);
dout(0) << "respawn execv " << orig_argv[0]
<< " failed with " << cpp_strerror(errno) << dendl;