@@ -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