From a1469cc8f4615364e61a3e66feb70813e5d73190 Mon Sep 17 00:00:00 2001 From: Alexander Bantyev Date: Tue, 5 May 2020 13:04:36 +0300 Subject: [PATCH] Wait for build users when none are available (cherry picked from commit 880a62b08443a6baa55dab027b69bb8b1551a588) --- src/libstore/build.cc | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/libstore/build.cc b/src/libstore/build.cc index 4b345fe37..faa41c0f0 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -508,6 +508,9 @@ private: Path fnUserLock; AutoCloseFD fdUserLock; + bool findFreeUser(); + + string user; uid_t uid; gid_t gid; @@ -528,13 +531,22 @@ public: }; - Sync UserLock::lockedPaths_; UserLock::UserLock() { assert(settings.buildUsersGroup != ""); + createDirs(settings.nixStateDir + "/userpool"); + + if (findFreeUser()) return; + + printError("waiting for build users"); + + do std::this_thread::sleep_for(std::chrono::seconds(2)); while (! findFreeUser()); +} + +bool UserLock::findFreeUser() { /* Get the members of the build-users-group. */ struct group * gr = getgrnam(settings.buildUsersGroup.get().c_str()); @@ -564,7 +576,6 @@ UserLock::UserLock() throw Error(format("the user '%1%' in the group '%2%' does not exist") % i % settings.buildUsersGroup); - createDirs(settings.nixStateDir + "/userpool"); fnUserLock = (format("%1%/userpool/%2%") % settings.nixStateDir % pw->pw_uid).str(); @@ -605,20 +616,17 @@ UserLock::UserLock() supplementaryGIDs.resize(ngroups); #endif - return; + return true; } } catch (...) { lockedPaths_.lock()->erase(fnUserLock); + return false; } } - - throw Error(format("all build users are currently in use; " - "consider creating additional users and adding them to the '%1%' group") - % settings.buildUsersGroup); + return false; } - UserLock::~UserLock() { auto lockedPaths(lockedPaths_.lock()); @@ -626,7 +634,6 @@ UserLock::~UserLock() lockedPaths->erase(fnUserLock); } - void UserLock::kill() { killUser(uid);