string getExecutorHttpMarkerPath( const string& rootDir, const SlaveID& slaveId, const FrameworkID& frameworkId, const ExecutorID& executorId, const ContainerID& containerId) { return path::join( getExecutorRunPath( rootDir, slaveId, frameworkId, executorId, containerId), HTTP_MARKER_FILE); }
string getExecutorSentinelPath( const string& rootDir, const SlaveID& slaveId, const FrameworkID& frameworkId, const ExecutorID& executorId, const ContainerID& containerId) { return path::join( getExecutorRunPath( rootDir, slaveId, frameworkId, executorId, containerId), EXECUTOR_SENTINEL_FILE); }
Try<list<string>> getTaskPaths( const string& rootDir, const SlaveID& slaveId, const FrameworkID& frameworkId, const ExecutorID& executorId, const ContainerID& containerId) { return fs::list(path::join( getExecutorRunPath( rootDir, slaveId, frameworkId, executorId, containerId), "tasks", "*")); }
string getForkedPidPath( const string& rootDir, const SlaveID& slaveId, const FrameworkID& frameworkId, const ExecutorID& executorId, const ContainerID& containerId) { return path::join( getExecutorRunPath( rootDir, slaveId, frameworkId, executorId, containerId), "pids", FORKED_PID_FILE); }
string getLibprocessPidPath( const string& rootDir, const SlaveID& slaveId, const FrameworkID& frameworkId, const ExecutorID& executorId, const ContainerID& containerId) { return path::join( getExecutorRunPath( rootDir, slaveId, frameworkId, executorId, containerId), "pids", LIBPROCESS_PID_FILE); }
string getTaskPath( const string& rootDir, const SlaveID& slaveId, const FrameworkID& frameworkId, const ExecutorID& executorId, const ContainerID& containerId, const TaskID& taskId) { return path::join( getExecutorRunPath( rootDir, slaveId, frameworkId, executorId, containerId), "tasks", stringify(taskId)); }
string createExecutorDirectory( const string& rootDir, const SlaveID& slaveId, const FrameworkID& frameworkId, const ExecutorID& executorId, const ContainerID& containerId, const Option<string>& user) { // These IDs should be valid as they are either assigned by the // master/agent or validated by the master but we do a sanity check // here before using them to create a directory. CHECK_NONE(common::validation::validateSlaveID(slaveId)); CHECK_NONE(common::validation::validateFrameworkID(frameworkId)); CHECK_NONE(common::validation::validateExecutorID(executorId)); CHECK_NONE(slave::validation::container::validateContainerId(containerId)); const string directory = getExecutorRunPath(rootDir, slaveId, frameworkId, executorId, containerId); Try<Nothing> mkdir = os::mkdir(directory); CHECK_SOME(mkdir) << "Failed to create executor directory '" << directory << "'"; // Remove the previous "latest" symlink. const string latest = getExecutorLatestRunPath(rootDir, slaveId, frameworkId, executorId); if (os::exists(latest)) { CHECK_SOME(os::rm(latest)) << "Failed to remove latest symlink '" << latest << "'"; } // Symlink the new executor directory to "latest". Try<Nothing> symlink = ::fs::symlink(directory, latest); CHECK_SOME(symlink) << "Failed to symlink directory '" << directory << "' to '" << latest << "'"; // `os::chown()` is not available on Windows. #ifndef __WINDOWS__ if (user.isSome()) { // Per MESOS-2592, we need to set the ownership of the executor // directory during its creation. We should not rely on subsequent // phases of the executor creation to ensure the ownership as // those may be conditional and in some cases leave the executor // directory owned by the slave user instead of the specified // framework or per-executor user. LOG(INFO) << "Trying to chown '" << directory << "' to user '" << user.get() << "'"; Try<Nothing> chown = os::chown(user.get(), directory); if (chown.isError()) { // TODO(nnielsen): We currently have tests which depend on using // user names which may not be available on the test machines. // Therefore, we cannot make the chown validation a hard // CHECK(). LOG(WARNING) << "Failed to chown executor directory '" << directory << "'. This may be due to attempting to run the executor " << "as a nonexistent user on the agent; see the description" << " for the `--switch_user` flag for more information: " << chown.error(); } } #endif // __WINDOWS__ return directory; }