Skip to content

Commit 332034c

Browse files
authored
DPL Analysis: update the ccdb paths options from configuration (#15974)
1 parent 04ab677 commit 332034c

2 files changed

Lines changed: 29 additions & 30 deletions

File tree

‎Framework/Core/src/ArrowSupport.cxx‎

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -638,34 +638,7 @@ o2::framework::ServiceSpec ArrowSupport::arrowBackendSpec()
638638
analysisCCDB->outputs.clear();
639639
analysisCCDB->inputs.clear();
640640
AnalysisSupportHelpers::addMissingOutputsToBuilder(dec.analysisCCDBInputs, dec.requestedAODs, dec.requestedDYNs, *analysisCCDB);
641-
// Register each ccdb: column path as an actual device option on the CCDB
642-
// device so it can be read from ConfigParamRegistry at runtime.
643-
// If any analysis task declared a Configurable<std::string> with the same
644-
// "ccdb:fXxx" name, prefer its default over the compile-time ::query value.
645-
// First encountered wins; log a warning if two tasks declare conflicting defaults.
646-
for (auto& input : dec.analysisCCDBInputs) {
647-
for (auto& m : input.metadata | std::views::filter(checks::has_params_with_name_starting("ccdb:"))) {
648-
ConfigParamSpec effective = m; // start with compile-time default
649-
bool foundFirst = false;
650-
for (auto& d : workflow | views::exclude_by_name(analysisCCDB->name)) {
651-
for (auto& opt : d.options) {
652-
if (opt.name == m.name) {
653-
if (!foundFirst) {
654-
effective = opt; // first task Configurable wins
655-
foundFirst = true;
656-
} else if (opt.defaultValue.asString() != effective.defaultValue.asString()) {
657-
LOGP(warn, "Task '{}' declares Configurable '{}' = '{}' which conflicts "
658-
"with an earlier value '{}'; earlier value will be used.",
659-
d.name, opt.name, opt.defaultValue.asString(),
660-
effective.defaultValue.asString());
661-
}
662-
break;
663-
}
664-
}
665-
}
666-
ConfigParamsHelper::addOptionIfMissing(analysisCCDB->options, effective);
667-
}
668-
}
641+
669642
// load real AlgorithmSpec before deployment
670643
analysisCCDB->algorithm = PluginManager::loadAlgorithmFromPlugin("O2FrameworkCCDBSupport", "AnalysisCCDBFetcherPlugin", ctx);
671644
}

‎Framework/Core/src/runDataProcessing.cxx‎

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1673,7 +1673,7 @@ int runStateMachine(DataProcessorSpecs const& workflow,
16731673
/// prune device inputs
16741674
auto altered_workflow = workflow;
16751675

1676-
auto confNameFromParam = [](std::string const& paramName) {
1676+
auto controlParamFromName = [](std::string const& paramName) {
16771677
std::regex name_regex(R"(^control:([\w-]+)\/(\w+))");
16781678
auto match = std::sregex_token_iterator(paramName.begin(), paramName.end(), name_regex, 0);
16791679
if (match == std::sregex_token_iterator()) {
@@ -1684,6 +1684,8 @@ int runStateMachine(DataProcessorSpecs const& workflow,
16841684
return std::pair{task, conf};
16851685
};
16861686
bool altered = false;
1687+
// verify uniformity of ccdb request for a each unique column
1688+
std::unordered_map<std::string, std::string> ccdbPaths;
16871689
for (auto& device : altered_workflow) {
16881690
// ignore internal devices
16891691
if (device.name.find("internal") != std::string::npos) {
@@ -1718,14 +1720,38 @@ int runStateMachine(DataProcessorSpecs const& workflow,
17181720
for (auto& input : device.inputs) {
17191721
for (auto& param : input.metadata) {
17201722
if (param.type == VariantType::Bool && param.name.starts_with("control:")) {
1723+
// update inputs from process switches
17211724
if (param.name != "control:default" && param.name != "control:spawn" && param.name != "control:build" && param.name != "control:define") {
1722-
auto confName = confNameFromParam(param.name).second;
1725+
auto confName = controlParamFromName(param.name).second;
17231726
param.defaultValue = reg->get<bool>(confName.c_str());
17241727
}
1728+
} else if (param.type == VariantType::String && param.name.starts_with("ccdb:")) {
1729+
// update inputs ccdb urls from configuration
1730+
param.defaultValue = reg->get<std::string>(param.name.c_str());
17251731
}
17261732
}
17271733
}
17281734
}
1735+
// after updating the urls, verify the consistency
1736+
for (auto& input : device.inputs) {
1737+
for (auto& param : input.metadata) {
1738+
if (param.type != VariantType::String || !param.name.starts_with("ccdb:")) {
1739+
continue;
1740+
}
1741+
if (ccdbPaths.contains(param.name)) {
1742+
if (ccdbPaths[param.name] != param.defaultValue.get<std::string>()) {
1743+
throw runtime_error_f(fmt::format("Task {} has a CCDB path inconsistent with another found in same workflow: {} vs {}",
1744+
device.name.c_str(),
1745+
param.defaultValue.get<std::string>().c_str(),
1746+
ccdbPaths[param.name].c_str())
1747+
.c_str());
1748+
}
1749+
} else {
1750+
ccdbPaths.emplace(param.name, param.defaultValue.get<std::string>());
1751+
}
1752+
}
1753+
}
1754+
17291755
/// FIXME: use commandline arguments as alternative
17301756
LOGP(debug, "Original inputs: ");
17311757
for (auto& input : device.inputs) {

0 commit comments

Comments
 (0)