11 #include <framework/database/MetadataProvider.h>
12 #include <framework/logging/Logger.h>
14 #include <boost/algorithm/string.hpp>
16 namespace Belle2::Conditions {
20 const size_t validTags = std::count_if(
m_tags.begin(),
m_tags.end(), [
this](
const auto & name) {
22 auto status = getGlobaltagStatus(name);
24 if (status.empty()) return false;
26 if (m_usableTagStates.count(status) == 0) {
27 B2ERROR(
"The globaltag has a status which is not permitted for use. This is for your own protection"
28 << LogVar(
"globaltag", name)
29 << LogVar(
"status", status)
30 << LogVar(
"allowed states", boost::algorithm::join(m_usableTagStates,
", ")));
35 return validTags == tags.size();
38 bool MetadataProvider::getPayloads(
int exp,
int run, std::vector<PayloadMetadata>& info)
40 if (info.empty())
return true;
41 for (
const auto& tag : m_tags) {
44 std::tie(present, m_payloads) = m_cache[tag].get(exp, run);
46 if (!present && !updatePayloads(tag, exp, run)) {
49 throw std::runtime_error(
"Problem updating metadata");
52 const auto& existing = *m_payloads;
57 const size_t found = std::count_if(info.begin(), info.end(), [&existing](
auto & payload) {
59 if (payload.revision > 0) return true;
61 if (auto && it = existing.find(payload.name); it != existing.end()) {
62 payload.update(it->second);
63 B2DEBUG(35,
"Found requested payload metadata"
64 << LogVar(
"globaltag", payload.globaltag)
65 << LogVar(
"name", payload.name)
66 << LogVar(
"revision", payload.revision)
67 << LogVar(
"checksum", payload.checksum));
74 if (found == info.size())
break;
79 const int missing = std::count_if(info.begin(), info.end(), [
this, exp, run](
const auto & p) {
80 if (p.revision == 0 and p.required) {
81 B2ERROR(
"Cannot find payload in any of the configured global tags"
82 << LogVar(
"name", p.name)
83 << LogVar(
"globaltags", boost::algorithm::join(m_tags,
", "))
84 << LogVar(
"experiment", exp) << LogVar(
"run", run));
93 void MetadataProvider::addPayload(PayloadMetadata&& payload,
const std::string& messagePrefix)
95 const auto [it, inserted] = m_payloads->emplace(payload.name, payload);
97 auto& existing = it->second;
98 if (existing.revision < payload.revision) {
99 std::swap(existing, payload);
101 B2DEBUG(36, messagePrefix << (messagePrefix.empty() ?
"" :
": ") <<
"Found duplicate payload. Discarding one of them"
102 <<
LogVar(
"globaltag", existing.globaltag)
103 <<
LogVar(
"name", existing.name)
104 <<
LogVar(
"revision", existing.revision)
105 <<
LogVar(
"checksum", existing.checksum)
106 <<
LogVar(
"discarded revision", payload.revision));
108 B2DEBUG(37, messagePrefix << (messagePrefix.empty() ?
"" :
": ") <<
"Found payload"
109 <<
LogVar(
"globaltag", payload.globaltag)
110 <<
LogVar(
"name", payload.name)
111 <<
LogVar(
"revision", payload.revision)
112 <<
LogVar(
"checksum", payload.checksum));
116 std::string NullMetadataProvider::getGlobaltagStatus([[maybe_unused]]
const std::string& name)
118 if (!m_errorShown) B2ERROR(
"No Metadata provider configured, globaltags cannot be used");