Invoke `paccache` as part of the build service cleanup
This commit is contained in:
parent
08af21ddb5
commit
836b7da8a3
|
@ -461,16 +461,41 @@ LibPkg::StorageID BuildAction::conclude(BuildActionResult result)
|
||||||
|
|
||||||
BuildServiceCleanup::BuildServiceCleanup(ServiceSetup &setup, const std::shared_ptr<BuildAction> &buildAction)
|
BuildServiceCleanup::BuildServiceCleanup(ServiceSetup &setup, const std::shared_ptr<BuildAction> &buildAction)
|
||||||
: InternalBuildAction(setup, buildAction)
|
: InternalBuildAction(setup, buildAction)
|
||||||
|
, m_dbCleanupConcluded(false)
|
||||||
|
, m_cacheCleanupConcluded(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void BuildServiceCleanup::run()
|
void BuildServiceCleanup::run()
|
||||||
{
|
{
|
||||||
// validate parameter
|
// validate parameter and read parameter/settings
|
||||||
if (auto error = validateParameter(RequiredDatabases::None, RequiredParameters::None); !error.empty()) {
|
if (auto error = validateParameter(RequiredDatabases::None, RequiredParameters::None); !error.empty()) {
|
||||||
reportError(std::move(error));
|
reportError(std::move(error));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
const auto flags = static_cast<BuildServiceCleanupFlags>(m_buildAction->flags);
|
||||||
|
m_dryCacheCleanup = flags & BuildServiceCleanupFlags::DryPackageCacheCleanup;
|
||||||
|
|
||||||
|
// get variables from setup
|
||||||
|
auto setupLock = m_setup.lockToRead();
|
||||||
|
m_paccachePath = findExecutable(m_setup.building.paccachePath);
|
||||||
|
const auto packageCachePath = m_setup.building.packageCacheDir;
|
||||||
|
setupLock.unlock();
|
||||||
|
|
||||||
|
// find concrete cache dirs (packageCachePath does not contain arch subdir) and start invoking paccache
|
||||||
|
m_concreteCacheDirs.reserve(8);
|
||||||
|
for (auto i = boost::filesystem::directory_iterator(packageCachePath, boost::filesystem::directory_options::follow_directory_symlink);
|
||||||
|
auto entry : i) {
|
||||||
|
if (entry.path().filename_is_dot() || entry.path().filename_is_dot_dot()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
auto canonical = boost::filesystem::canonical(entry.path());
|
||||||
|
if (boost::filesystem::is_directory(canonical)) {
|
||||||
|
m_concreteCacheDirs.emplace_back(entry.path().filename().string(), std::move(canonical));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_concreteCacheDirsIterator = m_concreteCacheDirs.begin();
|
||||||
|
invokePaccache();
|
||||||
|
|
||||||
// iterate though build actions and delete those that are unlikely to be relevant anymore
|
// iterate though build actions and delete those that are unlikely to be relevant anymore
|
||||||
auto count = std::size_t();
|
auto count = std::size_t();
|
||||||
|
@ -491,7 +516,42 @@ void BuildServiceCleanup::run()
|
||||||
return --count <= stopAt;
|
return --count <= stopAt;
|
||||||
},
|
},
|
||||||
&count);
|
&count);
|
||||||
|
auto lock = lockToWrite();
|
||||||
|
m_dbCleanupConcluded = true;
|
||||||
|
conclude(std::move(lock));
|
||||||
|
}
|
||||||
|
|
||||||
|
void BuildServiceCleanup::invokePaccache()
|
||||||
|
{
|
||||||
|
if (m_concreteCacheDirsIterator == m_concreteCacheDirs.end()) {
|
||||||
|
auto lock = lockToWrite();
|
||||||
|
m_cacheCleanupConcluded = true;
|
||||||
|
conclude(std::move(lock));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const auto &cacheDirArch = m_concreteCacheDirsIterator->first;
|
||||||
|
const auto &cacheDirPath = m_concreteCacheDirsIterator->second;
|
||||||
|
auto processSession = m_buildAction->makeBuildProcess(
|
||||||
|
"paccache-" + cacheDirArch, "paccache-" % cacheDirArch + ".log", [this](boost::process::child &&child, ProcessResult &&result) {
|
||||||
|
CPP_UTILITIES_UNUSED(child)
|
||||||
|
if (result.errorCode) {
|
||||||
|
const auto errorMessage = result.errorCode.message();
|
||||||
|
m_errors.emplace_back("unable to invoke paccache: " + errorMessage);
|
||||||
|
} else if (result.exitCode != 0) {
|
||||||
|
m_errors.emplace_back(argsToString("paccache returned with exit code ", result.exitCode));
|
||||||
|
}
|
||||||
|
invokePaccache();
|
||||||
|
});
|
||||||
|
++m_concreteCacheDirsIterator;
|
||||||
|
processSession->launch(m_paccachePath, m_dryCacheCleanup ? "--dryrun" : "--remove", "--cachedir", cacheDirPath.string());
|
||||||
|
}
|
||||||
|
|
||||||
|
void BuildServiceCleanup::conclude(std::unique_lock<std::shared_mutex> &&lock)
|
||||||
|
{
|
||||||
|
if (!m_dbCleanupConcluded || !m_cacheCleanupConcluded) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
lock.unlock();
|
||||||
const auto buildActionLock = m_setup.building.lockToWrite();
|
const auto buildActionLock = m_setup.building.lockToWrite();
|
||||||
reportSuccess();
|
reportSuccess();
|
||||||
}
|
}
|
||||||
|
|
|
@ -378,7 +378,14 @@ BuildActionMetaInfo::BuildActionMetaInfo()
|
||||||
.category = "Misc",
|
.category = "Misc",
|
||||||
.name = "Clean build-service-internal data",
|
.name = "Clean build-service-internal data",
|
||||||
.type = "build-service-cleanup",
|
.type = "build-service-cleanup",
|
||||||
.flags = {},
|
.flags = {
|
||||||
|
BuildActionFlagMetaInfo{
|
||||||
|
.id = static_cast<BuildActionFlagType>(BuildServiceCleanupFlags::DryPackageCacheCleanup),
|
||||||
|
.name = "Dry package cache cleanup",
|
||||||
|
.desc = "Use --dryrun (instead of --remove) when invoking paccache",
|
||||||
|
.param = "dry-package-cache-cleanup",
|
||||||
|
},
|
||||||
|
},
|
||||||
.settings = {},
|
.settings = {},
|
||||||
.directory = false,
|
.directory = false,
|
||||||
.sourceDb = false,
|
.sourceDb = false,
|
||||||
|
|
|
@ -94,6 +94,10 @@ enum class CleanRepositoryFlags : BuildActionFlagType {
|
||||||
None,
|
None,
|
||||||
DryRun = (1 << 0),
|
DryRun = (1 << 0),
|
||||||
};
|
};
|
||||||
|
enum class BuildServiceCleanupFlags : BuildActionFlagType {
|
||||||
|
None,
|
||||||
|
DryPackageCacheCleanup = (1 << 0),
|
||||||
|
};
|
||||||
enum class ReloadLibraryDependenciesSettings : std::size_t { PackageExcludeRegex };
|
enum class ReloadLibraryDependenciesSettings : std::size_t { PackageExcludeRegex };
|
||||||
enum class CheckForProblemsSettings : std::size_t { IgnoreDeps, IgnoreLibDeps };
|
enum class CheckForProblemsSettings : std::size_t { IgnoreDeps, IgnoreLibDeps };
|
||||||
enum class PrepareBuildSettings : std::size_t { PKGBUILDsDirs };
|
enum class PrepareBuildSettings : std::size_t { PKGBUILDsDirs };
|
||||||
|
@ -197,6 +201,7 @@ CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(LibRepoMgr, LibRepoMgr::ReloadLibraryDependen
|
||||||
CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(LibRepoMgr, LibRepoMgr::PrepareBuildFlags)
|
CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(LibRepoMgr, LibRepoMgr::PrepareBuildFlags)
|
||||||
CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(LibRepoMgr, LibRepoMgr::ConductBuildFlags)
|
CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(LibRepoMgr, LibRepoMgr::ConductBuildFlags)
|
||||||
CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(LibRepoMgr, LibRepoMgr::CleanRepositoryFlags)
|
CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(LibRepoMgr, LibRepoMgr::CleanRepositoryFlags)
|
||||||
|
CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(LibRepoMgr, LibRepoMgr::BuildServiceCleanupFlags)
|
||||||
CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(LibRepoMgr, LibRepoMgr::CheckForProblemsFlags)
|
CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(LibRepoMgr, LibRepoMgr::CheckForProblemsFlags)
|
||||||
|
|
||||||
#endif // LIBREPOMGR_BUILD_ACTION_META_H
|
#endif // LIBREPOMGR_BUILD_ACTION_META_H
|
||||||
|
|
|
@ -675,11 +675,20 @@ private:
|
||||||
bool m_useContainer;
|
bool m_useContainer;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct LIBREPOMGR_EXPORT BuildServiceCleanup : public InternalBuildAction {
|
struct LIBREPOMGR_EXPORT BuildServiceCleanup : public InternalBuildAction, private LibPkg::Lockable {
|
||||||
BuildServiceCleanup(ServiceSetup &setup, const std::shared_ptr<BuildAction> &buildAction);
|
BuildServiceCleanup(ServiceSetup &setup, const std::shared_ptr<BuildAction> &buildAction);
|
||||||
void run();
|
void run();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void invokePaccache();
|
||||||
|
void conclude(std::unique_lock<std::shared_mutex> &&lock);
|
||||||
|
|
||||||
|
boost::filesystem::path m_paccachePath;
|
||||||
|
std::vector<std::pair<std::string, boost::filesystem::path>> m_concreteCacheDirs;
|
||||||
|
std::vector<std::pair<std::string, boost::filesystem::path>>::iterator m_concreteCacheDirsIterator;
|
||||||
|
std::vector<std::string> m_errors;
|
||||||
|
bool m_dryCacheCleanup;
|
||||||
|
bool m_dbCleanupConcluded, m_cacheCleanupConcluded;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef LIBREPOMGR_DUMMY_BUILD_ACTION_ENABLED
|
#ifdef LIBREPOMGR_DUMMY_BUILD_ACTION_ENABLED
|
||||||
|
|
Loading…
Reference in New Issue