diff --git a/src/mds/MDS.cc b/src/mds/MDS.cc index 15af84f840d..e717dd7f762 100644 --- a/src/mds/MDS.cc +++ b/src/mds/MDS.cc @@ -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;