aboutsummaryrefslogtreecommitdiff
path: root/clean/clean.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'clean/clean.cxx')
-rw-r--r--clean/clean.cxx76
1 files changed, 52 insertions, 24 deletions
diff --git a/clean/clean.cxx b/clean/clean.cxx
index a48308b..55fb59b 100644
--- a/clean/clean.cxx
+++ b/clean/clean.cxx
@@ -1,5 +1,4 @@
// file : clean/clean.cxx -*- C++ -*-
-// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
// license : MIT; see accompanying LICENSE file
#include <map>
@@ -13,9 +12,7 @@
#include <odb/pgsql/database.hxx>
-#include <libbutl/pager.mxx>
-
-#include <libbbot/build-config.hxx>
+#include <libbutl/pager.hxx>
#include <libbrep/build.hxx>
#include <libbrep/build-odb.hxx>
@@ -25,10 +22,11 @@
#include <libbrep/build-package-odb.hxx>
#include <libbrep/database-lock.hxx>
+#include <mod/build-target-config.hxx>
+
#include <clean/clean-options.hxx>
using namespace std;
-using namespace bbot;
using namespace odb::core;
namespace brep
@@ -62,7 +60,7 @@ namespace brep
<< "libbbot " << LIBBBOT_VERSION_ID << endl
<< "libbpkg " << LIBBPKG_VERSION_ID << endl
<< "libbutl " << LIBBUTL_VERSION_ID << endl
- << "Copyright (c) 2014-2019 Code Synthesis Ltd" << endl
+ << "Copyright (c) " << BREP_COPYRIGHT << "." << endl
<< "This is free software released under the MIT license." << endl;
return 0;
@@ -112,8 +110,8 @@ namespace brep
ops.db_port (),
"options='-c default_transaction_isolation=serializable'");
- // Prevent several brep-clean/migrate instances from updating build
- // database simultaneously.
+ // Prevent several brep utility instances from updating the database
+ // simultaneously.
//
database_lock l (db);
@@ -206,12 +204,13 @@ namespace brep
return 1;
}
- set<string> configs;
+ // Load build target configurations.
+ //
+ build_target_configs configs;
try
{
- for (auto& c: parse_buildtab (cp))
- configs.emplace (move (c.name));
+ configs = bbot::parse_buildtab (cp);
}
catch (const io_error& e)
{
@@ -219,6 +218,13 @@ namespace brep
return 1;
}
+ // Note: contains shallow references to the configuration targets/names.
+ //
+ set<build_target_config_id> configs_set;
+
+ for (const build_target_config& c: configs)
+ configs_set.insert (build_target_config_id {c.target, c.name});
+
// Parse timestamps.
//
map<string, timestamp> timeouts; // Toolchain timeouts.
@@ -260,18 +266,26 @@ namespace brep
//
// Query package builds in chunks in order not to hold locks for too long.
// Sort the result by package version to minimize number of queries to the
- // package database.
+ // package database. Note that we still need to sort by configuration and
+ // toolchain to make sure that builds are sorted consistently across
+ // queries and we don't miss any of them.
//
using bld_query = query<build>;
using prep_bld_query = prepared_query<build>;
size_t offset (0);
bld_query bq ("ORDER BY" +
- bld_query::id.package.tenant + "," +
- bld_query::id.package.name +
+ bld_query::id.package.tenant + "," +
+ bld_query::id.package.name +
order_by_version_desc (bld_query::id.package.version,
- false) +
- "OFFSET" + bld_query::_ref (offset) + "LIMIT 100");
+ false) + "," +
+ bld_query::id.target + "," +
+ bld_query::id.target_config_name + "," +
+ bld_query::id.package_config_name + "," +
+ bld_query::id.toolchain_name +
+ order_by_version (bld_query::id.toolchain_version,
+ false /* first */) +
+ "OFFSET" + bld_query::_ref (offset) + "LIMIT 2000");
connection_ptr conn (db.connection ());
@@ -285,19 +299,19 @@ namespace brep
// be made once per tenant package name due to the builds query sorting
// criteria (see above).
//
- using pkg_query = query<buildable_package>;
- using prep_pkg_query = prepared_query<buildable_package>;
+ using pkg_query = query<build_package_version>;
+ using prep_pkg_query = prepared_query<build_package_version>;
string tnt;
package_name pkg_name;
set<version> package_versions;
- pkg_query pq (
- pkg_query::build_package::id.tenant == pkg_query::_ref (tnt) &&
- pkg_query::build_package::id.name == pkg_query::_ref (pkg_name));
+ pkg_query pq (pkg_query::buildable &&
+ pkg_query::id.tenant == pkg_query::_ref (tnt) &&
+ pkg_query::id.name == pkg_query::_ref (pkg_name));
prep_pkg_query pkg_prep_query (
- conn->prepare_query<buildable_package> ("package-query", pq));
+ conn->prepare_query<build_package_version> ("package-query", pq));
for (bool ne (true); ne; )
{
@@ -317,6 +331,17 @@ namespace brep
? i->second
: default_timeout);
+ // Note that we don't consider the case when both the configuration
+ // and the package still exist but the package now excludes the
+ // configuration (configuration is now of the legacy class instead
+ // of the default class, etc). Should we handle this case and
+ // re-implement in a way brep-monitor does it? Probably not since
+ // the described situation is not very common and storing some extra
+ // builds which sooner or later will be wiped out due to the timeout
+ // is harmless. The current implementation, however, is simpler and
+ // consumes less resources in runtime (doesn't load build package
+ // objects, etc).
+ //
bool cleanup (
// Check that the build is not stale.
//
@@ -327,7 +352,10 @@ namespace brep
// Note that we unable to detect configuration changes and rely on
// periodic rebuilds to take care of that.
//
- configs.find (b.configuration) == configs.end ());
+ configs_set.find (
+ build_target_config_id {b.target,
+ b.target_config_name}) ==
+ configs_set.end ());
// Check that the build package still exists.
//
@@ -344,7 +372,7 @@ namespace brep
}
cleanup = package_versions.find (b.package_version) ==
- package_versions.end ();
+ package_versions.end ();
}
if (cleanup)