Skip to content

Commit

Permalink
Merge pull request #41643 from makortel/fixNumberOfThreadsTypeCheck_106x
Browse files Browse the repository at this point in the history
[10_6_X] Make sure to report an error if process.options.numberOfThreads has wrong type
  • Loading branch information
cmsbuild authored May 12, 2023
2 parents 6fff8a6 + d62754c commit 5c157df
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 4 deletions.
11 changes: 7 additions & 4 deletions FWCore/Framework/bin/cmsRun.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -293,12 +293,15 @@ int main(int argc, char* argv[]) {

// check the "options" ParameterSet
std::shared_ptr<edm::ParameterSet> pset = processDesc->getProcessPSet();
if (pset->existsAs<edm::ParameterSet>("options", false)) {
// Note: it is important to not check the type or trackedness in
// exists() call to ensure that the getUntrackedParameter() calls
// will fail if the parameters have an incorrect type
if (pset->exists("options")) {
auto const& ops = pset->getUntrackedParameterSet("options");
if (ops.existsAs<unsigned int>("numberOfThreads", false)) {
if (ops.exists("numberOfThreads")) {
nThreads = ops.getUntrackedParameter<unsigned int>("numberOfThreads");
}
if (ops.existsAs<unsigned int>("sizeOfStackForThreadsInKB", false)) {
if (ops.exists("sizeOfStackForThreadsInKB")) {
stackSize = ops.getUntrackedParameter<unsigned int>("sizeOfStackForThreadsInKB");
}
}
Expand All @@ -318,7 +321,7 @@ int main(int argc, char* argv[]) {

// update the numberOfThreads and sizeOfStackForThreadsInKB in the "options" ParameterSet
edm::ParameterSet newOp;
if (pset->existsAs<edm::ParameterSet>("options", false)) {
if (pset->exists("options")) {
newOp = pset->getUntrackedParameterSet("options");
}
newOp.addUntrackedParameter<unsigned int>("numberOfThreads", nThreads);
Expand Down
5 changes: 5 additions & 0 deletions FWCore/Framework/test/BuildFile.xml
Original file line number Diff line number Diff line change
Expand Up @@ -325,3 +325,8 @@
<use name="catch2"/>
<use name="FWCore/Framework"/>
</bin>

<test name="testFWCoreFrameworkOptionsNumberOfThreadsType" command="cmsRun ${LOCALTOP}/src/FWCore/Framework/test/test_wrongOptionsType_cfg.py -- --name=numberOfThreads --value='cms.untracked.uint32(1)'"/>
<test name="testFWCoreFrameworkWrongOptionsNumberOfThreadsType" command="run_wrongOptionsType.sh numberOfThreads 'cms.untracked.int32(1)'"/>
<test name="testFWCoreFrameworkWrongOptionsNumberOfStreamsType" command="run_wrongOptionsType.sh numberOfStreams 'cms.untracked.int32(1)'"/>
<test name="testFWCoreFrameworkWrongOptionssizeOfStackForThreadsInKBType" command="run_wrongOptionsType.sh sizeOfStackForThreadsInKB 'cms.untracked.int32(1024)'"/>
10 changes: 10 additions & 0 deletions FWCore/Framework/test/run_wrongOptionsType.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#!/bin/bash

NAME=$1
VALUE=$2

function die { echo $1: status $2 ; echo === Log file === ; cat ${3:-/dev/null} ; echo === End log file === ; exit $2; }

cmsRun ${LOCALTOP}/src/FWCore/Framework/test/test_wrongOptionsType_cfg.py -- --name=${NAME} --value="$VALUE" > ${NAME}.log 2>&1 && die "cmsRun for ${NAME} succeeded, should have failed" 1 ${NAME}.log
grep -E "(The type in the configuration is incorrect)|(ValueError type of .* is expected to be .* but declared as)" ${NAME}.log > /dev/null || die "cmsRun for ${NAME} failed for other reason than incorrect configuration type" $? ${NAME}.log

22 changes: 22 additions & 0 deletions FWCore/Framework/test/test_wrongOptionsType_cfg.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import FWCore.ParameterSet.Config as cms

import argparse
import sys

parser = argparse.ArgumentParser(prog=sys.argv[0], description='Test wrong process.options parameter types')

parser.add_argument("--name", help="Name of parameter", type=str)
parser.add_argument("--value", help="Value of the parameter", type=str)

argv = sys.argv[:]
if '--' in argv:
argv.remove("--")
args, unknown = parser.parse_known_args(argv)

process = cms.Process("TEST")
process.source = cms.Source("EmptySource")

process.maxEvents = cms.untracked.PSet(input = cms.untracked.int32(2))

process.options = cms.untracked.PSet()
setattr(process.options, args.name, eval(str(args.value)))

0 comments on commit 5c157df

Please sign in to comment.