Loading init/service.cpp +14 −10 Original line number Diff line number Diff line Loading @@ -506,7 +506,8 @@ void Service::ConfigureMemcg() { } // Enters namespaces, sets environment variables, writes PID files and runs the service executable. void Service::RunService(const std::vector<Descriptor>& descriptors, InterprocessFifo fifo) { void Service::RunService(const std::vector<Descriptor>& descriptors, InterprocessFifo cgroups_activated) { if (auto result = EnterNamespaces(namespaces_, name_, mount_namespace_); !result.ok()) { LOG(FATAL) << "Service '" << name_ << "' failed to set up namespaces: " << result.error(); } Loading @@ -528,11 +529,11 @@ void Service::RunService(const std::vector<Descriptor>& descriptors, Interproces // Wait until the cgroups have been created and until the cgroup controllers have been // activated. Result<uint8_t> byte = fifo.Read(); Result<uint8_t> byte = cgroups_activated.Read(); if (!byte.ok()) { LOG(ERROR) << name_ << ": failed to read from notification channel: " << byte.error(); } fifo.Close(); cgroups_activated.Close(); if (!*byte) { LOG(FATAL) << "Service '" << name_ << "' failed to start due to a fatal error"; _exit(EXIT_FAILURE); Loading Loading @@ -597,8 +598,11 @@ Result<void> Service::Start() { return {}; } InterprocessFifo fifo; OR_RETURN(fifo.Initialize()); InterprocessFifo cgroups_activated; if (Result<void> result = cgroups_activated.Initialize(); !result.ok()) { return result; } if (Result<void> result = CheckConsole(); !result.ok()) { return result; Loading Loading @@ -656,11 +660,11 @@ Result<void> Service::Start() { if (pid == 0) { umask(077); fifo.CloseWriteFd(); RunService(descriptors, std::move(fifo)); cgroups_activated.CloseWriteFd(); RunService(descriptors, std::move(cgroups_activated)); _exit(127); } else { fifo.CloseReadFd(); cgroups_activated.CloseReadFd(); } if (pid < 0) { Loading Loading @@ -689,7 +693,7 @@ Result<void> Service::Start() { limit_percent_ != -1 || !limit_property_.empty(); errno = -createProcessGroup(proc_attr_.uid, pid_, use_memcg); if (errno != 0) { Result<void> result = fifo.Write(0); Result<void> result = cgroups_activated.Write(0); if (!result.ok()) { return Error() << "Sending notification failed: " << result.error(); } Loading @@ -713,7 +717,7 @@ Result<void> Service::Start() { LmkdRegister(name_, proc_attr_.uid, pid_, oom_score_adjust_); } if (Result<void> result = fifo.Write(1); !result.ok()) { if (Result<void> result = cgroups_activated.Write(1); !result.ok()) { return Error() << "Sending cgroups activated notification failed: " << result.error(); } Loading Loading
init/service.cpp +14 −10 Original line number Diff line number Diff line Loading @@ -506,7 +506,8 @@ void Service::ConfigureMemcg() { } // Enters namespaces, sets environment variables, writes PID files and runs the service executable. void Service::RunService(const std::vector<Descriptor>& descriptors, InterprocessFifo fifo) { void Service::RunService(const std::vector<Descriptor>& descriptors, InterprocessFifo cgroups_activated) { if (auto result = EnterNamespaces(namespaces_, name_, mount_namespace_); !result.ok()) { LOG(FATAL) << "Service '" << name_ << "' failed to set up namespaces: " << result.error(); } Loading @@ -528,11 +529,11 @@ void Service::RunService(const std::vector<Descriptor>& descriptors, Interproces // Wait until the cgroups have been created and until the cgroup controllers have been // activated. Result<uint8_t> byte = fifo.Read(); Result<uint8_t> byte = cgroups_activated.Read(); if (!byte.ok()) { LOG(ERROR) << name_ << ": failed to read from notification channel: " << byte.error(); } fifo.Close(); cgroups_activated.Close(); if (!*byte) { LOG(FATAL) << "Service '" << name_ << "' failed to start due to a fatal error"; _exit(EXIT_FAILURE); Loading Loading @@ -597,8 +598,11 @@ Result<void> Service::Start() { return {}; } InterprocessFifo fifo; OR_RETURN(fifo.Initialize()); InterprocessFifo cgroups_activated; if (Result<void> result = cgroups_activated.Initialize(); !result.ok()) { return result; } if (Result<void> result = CheckConsole(); !result.ok()) { return result; Loading Loading @@ -656,11 +660,11 @@ Result<void> Service::Start() { if (pid == 0) { umask(077); fifo.CloseWriteFd(); RunService(descriptors, std::move(fifo)); cgroups_activated.CloseWriteFd(); RunService(descriptors, std::move(cgroups_activated)); _exit(127); } else { fifo.CloseReadFd(); cgroups_activated.CloseReadFd(); } if (pid < 0) { Loading Loading @@ -689,7 +693,7 @@ Result<void> Service::Start() { limit_percent_ != -1 || !limit_property_.empty(); errno = -createProcessGroup(proc_attr_.uid, pid_, use_memcg); if (errno != 0) { Result<void> result = fifo.Write(0); Result<void> result = cgroups_activated.Write(0); if (!result.ok()) { return Error() << "Sending notification failed: " << result.error(); } Loading @@ -713,7 +717,7 @@ Result<void> Service::Start() { LmkdRegister(name_, proc_attr_.uid, pid_, oom_score_adjust_); } if (Result<void> result = fifo.Write(1); !result.ok()) { if (Result<void> result = cgroups_activated.Write(1); !result.ok()) { return Error() << "Sending cgroups activated notification failed: " << result.error(); } Loading