From 858f3e53430207daea8eb3ccf6b3b9df40eaa5b6 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Thu, 21 Feb 2019 11:25:16 -0800 Subject: [PATCH] Reduce log spam from libprocessgroup EBUSY is expected when removing process group path if process is still active. ESRCH is expected when kill if process died already. ENOENT is also expected when opening cgroup path if process died already. This CL also skip removing parent path if child failed when remove process group. Bug: 125340804 Test: Build and boot Change-Id: Ief3b9cb913035a4050f6cf79c8b1e2f098e18244 --- libprocessgroup/processgroup.cpp | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/libprocessgroup/processgroup.cpp b/libprocessgroup/processgroup.cpp index e9dec1261..c6710d088 100644 --- a/libprocessgroup/processgroup.cpp +++ b/libprocessgroup/processgroup.cpp @@ -170,8 +170,9 @@ static int RemoveProcessGroup(const char* cgroup, uid_t uid, int pid) { return ret; } -static void RemoveUidProcessGroups(const std::string& uid_path) { +static bool RemoveUidProcessGroups(const std::string& uid_path) { std::unique_ptr uid(opendir(uid_path.c_str()), closedir); + bool empty = true; if (uid != NULL) { dirent* dir; while ((dir = readdir(uid.get())) != nullptr) { @@ -185,9 +186,15 @@ static void RemoveUidProcessGroups(const std::string& uid_path) { auto path = StringPrintf("%s/%s", uid_path.c_str(), dir->d_name); LOG(VERBOSE) << "Removing " << path; - if (rmdir(path.c_str()) == -1) PLOG(WARNING) << "Failed to remove " << path; + if (rmdir(path.c_str()) == -1) { + if (errno != EBUSY) { + PLOG(WARNING) << "Failed to remove " << path; + } + empty = false; + } } } + return empty; } void removeAllProcessGroups() { @@ -219,9 +226,14 @@ void removeAllProcessGroups() { } auto path = StringPrintf("%s/%s", cgroup_root_path.c_str(), dir->d_name); - RemoveUidProcessGroups(path); + if (!RemoveUidProcessGroups(path)) { + LOG(VERBOSE) << "Skip removing " << path; + continue; + } LOG(VERBOSE) << "Removing " << path; - if (rmdir(path.c_str()) == -1) PLOG(WARNING) << "Failed to remove " << path; + if (rmdir(path.c_str()) == -1 && errno != EBUSY) { + PLOG(WARNING) << "Failed to remove " << path; + } } } } @@ -249,6 +261,10 @@ static int DoKillProcessGroupOnce(const char* cgroup, uid_t uid, int initialPid, auto path = ConvertUidPidToPath(cgroup, uid, initialPid) + PROCESSGROUP_CGROUP_PROCS_FILE; std::unique_ptr fd(fopen(path.c_str(), "re"), fclose); if (!fd) { + if (errno == ENOENT) { + // This happens when process is already dead + return 0; + } PLOG(WARNING) << "Failed to open process cgroup uid " << uid << " pid " << initialPid; return -1; } @@ -293,7 +309,7 @@ static int DoKillProcessGroupOnce(const char* cgroup, uid_t uid, int initialPid, LOG(VERBOSE) << "Killing process group " << -pgid << " in uid " << uid << " as part of process cgroup " << initialPid; - if (kill(-pgid, signal) == -1) { + if (kill(-pgid, signal) == -1 && errno != ESRCH) { PLOG(WARNING) << "kill(" << -pgid << ", " << signal << ") failed"; } } @@ -303,7 +319,7 @@ static int DoKillProcessGroupOnce(const char* cgroup, uid_t uid, int initialPid, LOG(VERBOSE) << "Killing pid " << pid << " in uid " << uid << " as part of process cgroup " << initialPid; - if (kill(pid, signal) == -1) { + if (kill(pid, signal) == -1 && errno != ESRCH) { PLOG(WARNING) << "kill(" << pid << ", " << signal << ") failed"; } }