@@ -1672,7 +1672,7 @@ int runStateMachine(DataProcessorSpecs const& workflow,
16721672 // / prune device inputs
16731673 auto altered_workflow = workflow;
16741674
1675- auto confNameFromParam = [](std::string const & paramName) {
1675+ auto controlParamFromName = [](std::string const & paramName) {
16761676 std::regex name_regex (R"( ^control:([\w-]+)\/(\w+))" );
16771677 auto match = std::sregex_token_iterator (paramName.begin (), paramName.end (), name_regex, 0 );
16781678 if (match == std::sregex_token_iterator ()) {
@@ -1683,6 +1683,8 @@ int runStateMachine(DataProcessorSpecs const& workflow,
16831683 return std::pair{task, conf};
16841684 };
16851685 bool altered = false ;
1686+ // verify uniformity of ccdb request for a each unique column
1687+ std::unordered_map<std::string, std::string> ccdbPaths;
16861688 for (auto & device : altered_workflow) {
16871689 // ignore internal devices
16881690 if (device.name .find (" internal" ) != std::string::npos) {
@@ -1717,14 +1719,37 @@ int runStateMachine(DataProcessorSpecs const& workflow,
17171719 for (auto & input : device.inputs ) {
17181720 for (auto & param : input.metadata ) {
17191721 if (param.type == VariantType::Bool && param.name .starts_with (" control:" )) {
1722+ // update inputs from process switches
17201723 if (param.name != " control:default" && param.name != " control:spawn" && param.name != " control:build" && param.name != " control:define" ) {
1721- auto confName = confNameFromParam (param.name ).second ;
1724+ auto confName = controlParamFromName (param.name ).second ;
17221725 param.defaultValue = reg->get <bool >(confName.c_str ());
17231726 }
1727+ } else if (param.type == VariantType::String && param.name .starts_with (" ccdb:" )) {
1728+ // update inputs ccdb urls from configuration
1729+ param.defaultValue = reg->get <std::string>(param.name .c_str ());
17241730 }
17251731 }
17261732 }
17271733 }
1734+ // after updating the urls, verify the consistency
1735+ for (auto & input : device.inputs ) {
1736+ for (auto & param : input.metadata ) {
1737+ if (param.type != VariantType::String || param.name .starts_with (" ccdb:" )) {
1738+ continue ;
1739+ }
1740+ if (ccdbPaths.contains (param.name )) {
1741+ if (ccdbPaths[param.name ] != param.defaultValue .get <std::string>()) {
1742+ throw runtime_error_f (" Task {} has a CCDB path inconsistent with another found in same workflow: {} vs {}" ,
1743+ device.name .c_str (),
1744+ param.defaultValue .get <std::string>().c_str (),
1745+ ccdbPaths[param.name ].c_str ());
1746+ }
1747+ } else {
1748+ ccdbPaths.emplace (param.name , param.defaultValue .get <std::string>());
1749+ }
1750+ }
1751+ }
1752+
17281753 // / FIXME: use commandline arguments as alternative
17291754 LOGP (debug, " Original inputs: " );
17301755 for (auto & input : device.inputs ) {
0 commit comments