Skip to content

Commit 92fe168

Browse files
authored
[QC-1176] Display a warning for developers if a registered object is not mergeable (#2400)
--------- Co-authored-by: Michal Tichák <michal.tichak@cern.ch>
1 parent c0ec83f commit 92fe168

14 files changed

Lines changed: 62 additions & 36 deletions

File tree

Framework/include/QualityControl/ObjectsManager.h

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@
2121
#include "QualityControl/Activity.h"
2222
#include "QualityControl/MonitorObject.h"
2323
#include "QualityControl/MonitorObjectCollection.h"
24+
#include <Mergers/Mergeable.h>
2425
// stl
26+
#include <concepts>
2527
#include <string>
2628
#include <memory>
29+
#include <type_traits>
2730

2831
class TObject;
29-
class TObjArray;
3032

3133
namespace o2::quality_control::core
3234
{
@@ -76,10 +78,26 @@ class ObjectsManager
7678
/**
7779
* Start publishing the object obj, i.e. it will be pushed forward in the workflow at regular intervals.
7880
* The ownership remains to the caller.
81+
* @param IgnoreMergeable if you want to ignore static_assert check for Mergeable
82+
* @param T type of object that we want to publish.
7983
* @param obj The object to publish.
8084
* @throws DuplicateObjectError
8185
*/
82-
void startPublishing(TObject* obj, PublicationPolicy = PublicationPolicy::Forever);
86+
template <bool IgnoreMergeable = false, typename T>
87+
void startPublishing(T obj, PublicationPolicy policy = PublicationPolicy::Forever)
88+
{
89+
// We don't want to do this compile time check in PostProcessing, and we want to turn off runtime check as well
90+
bool ignoreMergeableRuntime = IgnoreMergeable;
91+
#ifndef QUALITYCONTROL_POSTPROCESSINTERFACE_H
92+
static_assert(std::same_as<std::remove_pointer_t<T>, TObject> ||
93+
IgnoreMergeable || mergers::Mergeable<T>,
94+
"you are trying to startPublishing object that is not mergeable."
95+
" If you know what you are doing use startPublishing<true>(...)");
96+
#else
97+
ignoreMergeableRuntime = true;
98+
#endif
99+
startPublishingImpl(obj, policy, ignoreMergeableRuntime);
100+
}
83101

84102
/**
85103
* Stop publishing this object
@@ -223,6 +241,8 @@ class ObjectsManager
223241
bool mUpdateServiceDiscovery;
224242
Activity mActivity;
225243
std::vector<std::string> mMovingWindowsList;
244+
245+
void startPublishingImpl(TObject* obj, PublicationPolicy, bool ignoreMergeableWarning);
226246
};
227247

228248
} // namespace o2::quality_control::core

Framework/src/ObjectsManager.cxx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,22 @@ ObjectsManager::~ObjectsManager()
6060
ILOG(Debug, Devel) << "ObjectsManager destructor" << ENDM;
6161
}
6262

63-
void ObjectsManager::startPublishing(TObject* object, PublicationPolicy publicationPolicy)
63+
void ObjectsManager::startPublishingImpl(TObject* object, PublicationPolicy publicationPolicy, bool ignoreMergeableWarning)
6464
{
6565
if (!object) {
6666
ILOG(Warning, Support) << "A nullptr provided to ObjectManager::startPublishing" << ENDM;
6767
return;
6868
}
69+
6970
if (mMonitorObjects->FindObject(object->GetName()) != nullptr) {
7071
ILOG(Warning, Support) << "Object is already being published (" << object->GetName() << "), will remove it and add the new one" << ENDM;
7172
stopPublishing(object->GetName());
7273
}
74+
75+
if (!ignoreMergeableWarning && !mergers::isMergeable(object)) {
76+
ILOG(Warning, Support) << "Object '" + std::string(object->GetName()) + "' with type '" + std::string(object->ClassName()) + "' is not one of the mergeable types, it will not be correctly merged in distributed setups, such as P2 and Grid" << ENDM;
77+
}
78+
7379
auto* newObject = new MonitorObject(object, mTaskName, mTaskClass, mDetectorName);
7480
newObject->setIsOwner(false);
7581
newObject->setActivity(mActivity);

Framework/src/SliceTrendingTask.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -671,4 +671,4 @@ std::string SliceTrendingTask::beautifyTitle(const std::string_view rawtitle, co
671671
}
672672

673673
return beautified;
674-
}
674+
}

Framework/test/testObjectsManager.cxx

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,12 @@ BOOST_AUTO_TEST_CASE(duplicate_object_test)
5353
config.consulUrl = "";
5454
ObjectsManager objectsManager(config.taskName, config.taskClass, config.detectorName, config.consulUrl, 0, true);
5555
TObjString s("content");
56-
objectsManager.startPublishing(&s, PublicationPolicy::Forever);
57-
BOOST_CHECK_NO_THROW(objectsManager.startPublishing(&s, PublicationPolicy::Forever));
56+
objectsManager.startPublishing<true>(&s, PublicationPolicy::Forever);
57+
BOOST_CHECK_NO_THROW(objectsManager.startPublishing<true>(&s, PublicationPolicy::Forever));
5858
BOOST_REQUIRE(objectsManager.getMonitorObject("content") != nullptr);
5959

6060
TObjString s2("content");
61-
BOOST_CHECK_NO_THROW(objectsManager.startPublishing(&s2, PublicationPolicy::Forever));
61+
BOOST_CHECK_NO_THROW(objectsManager.startPublishing<true>(&s2, PublicationPolicy::Forever));
6262
auto mo2 = objectsManager.getMonitorObject("content");
6363
BOOST_REQUIRE(mo2 != nullptr);
6464
BOOST_REQUIRE(mo2->getObject() != &s);
@@ -73,8 +73,8 @@ BOOST_AUTO_TEST_CASE(is_being_published_test)
7373
ObjectsManager objectsManager(config.taskName, config.taskClass, config.detectorName, config.consulUrl, 0, true);
7474
TObjString s("content");
7575
BOOST_CHECK(!objectsManager.isBeingPublished("content"));
76-
objectsManager.startPublishing(&s, PublicationPolicy::Forever);
77-
BOOST_CHECK_NO_THROW(objectsManager.startPublishing(&s, PublicationPolicy::Forever));
76+
objectsManager.startPublishing<true>(&s, PublicationPolicy::Forever);
77+
BOOST_CHECK_NO_THROW(objectsManager.startPublishing<true>(&s, PublicationPolicy::Forever));
7878
BOOST_CHECK(objectsManager.isBeingPublished("content"));
7979
}
8080

@@ -84,46 +84,46 @@ BOOST_AUTO_TEST_CASE(unpublish_test)
8484
config.taskName = "test";
8585
ObjectsManager objectsManager(config.taskName, config.taskClass, config.detectorName, config.consulUrl, 0, true);
8686
TObjString s("content");
87-
objectsManager.startPublishing(&s, PublicationPolicy::Forever);
87+
objectsManager.startPublishing<true>(&s, PublicationPolicy::Forever);
8888
BOOST_CHECK_EQUAL(objectsManager.getNumberPublishedObjects(), 1);
8989
objectsManager.stopPublishing(&s);
9090
BOOST_CHECK_EQUAL(objectsManager.getNumberPublishedObjects(), 0);
91-
objectsManager.startPublishing(&s, PublicationPolicy::Forever);
91+
objectsManager.startPublishing<true>(&s, PublicationPolicy::Forever);
9292
BOOST_CHECK_EQUAL(objectsManager.getNumberPublishedObjects(), 1);
9393
objectsManager.stopPublishing("content");
9494
BOOST_CHECK_EQUAL(objectsManager.getNumberPublishedObjects(), 0);
9595
BOOST_CHECK_THROW(objectsManager.stopPublishing("content"), ObjectNotFoundError);
9696
BOOST_CHECK_THROW(objectsManager.stopPublishing("asdf"), ObjectNotFoundError);
9797

9898
// unpublish all
99-
objectsManager.startPublishing(&s, PublicationPolicy::Forever);
99+
objectsManager.startPublishing<true>(&s, PublicationPolicy::Forever);
100100
BOOST_CHECK_EQUAL(objectsManager.getNumberPublishedObjects(), 1);
101101
objectsManager.stopPublishingAll();
102102
BOOST_CHECK_EQUAL(objectsManager.getNumberPublishedObjects(), 0);
103103
BOOST_CHECK_NO_THROW(objectsManager.stopPublishingAll());
104104

105105
// unpublish after deletion
106106
auto s2 = new TObjString("content");
107-
objectsManager.startPublishing(s2, PublicationPolicy::Forever);
107+
objectsManager.startPublishing<true>(s2, PublicationPolicy::Forever);
108108
BOOST_CHECK_EQUAL(objectsManager.getNumberPublishedObjects(), 1);
109109
delete s2;
110110
objectsManager.stopPublishing(s2);
111111
BOOST_CHECK_EQUAL(objectsManager.getNumberPublishedObjects(), 0);
112112

113113
// unpublish for publication policy
114114
auto s3 = new TObjString("content3");
115-
objectsManager.startPublishing(s3, PublicationPolicy::Once);
115+
objectsManager.startPublishing<true>(s3, PublicationPolicy::Once);
116116
auto s4 = new TObjString("content4");
117-
objectsManager.startPublishing(s4, PublicationPolicy::Once);
117+
objectsManager.startPublishing<true>(s4, PublicationPolicy::Once);
118118
auto s5 = new TObjString("content5");
119-
objectsManager.startPublishing(s5, PublicationPolicy::ThroughStop);
119+
objectsManager.startPublishing<true>(s5, PublicationPolicy::ThroughStop);
120120
BOOST_CHECK_EQUAL(objectsManager.getNumberPublishedObjects(), 3);
121121
objectsManager.stopPublishing(PublicationPolicy::Once);
122122
BOOST_CHECK_EQUAL(objectsManager.getNumberPublishedObjects(), 1);
123123
objectsManager.stopPublishing(PublicationPolicy::ThroughStop);
124124
BOOST_CHECK_EQUAL(objectsManager.getNumberPublishedObjects(), 0);
125125

126-
objectsManager.startPublishing(s3, PublicationPolicy::Once);
126+
objectsManager.startPublishing<true>(s3, PublicationPolicy::Once);
127127
objectsManager.stopPublishing(s3);
128128
BOOST_CHECK_EQUAL(objectsManager.getNumberPublishedObjects(), 0);
129129
BOOST_CHECK_NO_THROW(objectsManager.stopPublishing(PublicationPolicy::Once));
@@ -145,8 +145,8 @@ BOOST_AUTO_TEST_CASE(getters_test)
145145
TObjString s("content");
146146
TH1F h("histo", "h", 100, 0, 99);
147147

148-
objectsManager.startPublishing(&s, PublicationPolicy::Forever);
149-
objectsManager.startPublishing(&h, PublicationPolicy::Forever);
148+
objectsManager.startPublishing<true>(&s, PublicationPolicy::Forever);
149+
objectsManager.startPublishing<true>(&h, PublicationPolicy::Forever);
150150

151151
// basic gets
152152
BOOST_CHECK_NO_THROW(objectsManager.getMonitorObject("content"));
@@ -174,8 +174,8 @@ BOOST_AUTO_TEST_CASE(metadata_test)
174174

175175
TObjString s("content");
176176
TH1F h("histo", "h", 100, 0, 99);
177-
objectsManager.startPublishing(&s, PublicationPolicy::Forever);
178-
objectsManager.startPublishing(&h, PublicationPolicy::Forever);
177+
objectsManager.startPublishing<true>(&s, PublicationPolicy::Forever);
178+
objectsManager.startPublishing<true>(&h, PublicationPolicy::Forever);
179179

180180
objectsManager.addMetadata("content", "aaa", "bbb");
181181
BOOST_CHECK_EQUAL(objectsManager.getMonitorObject("content")->getMetadataMap().at("aaa"), "bbb");
@@ -211,7 +211,7 @@ BOOST_AUTO_TEST_CASE(feed_with_nullptr)
211211
config.consulUrl = "";
212212
ObjectsManager objectsManager(config.taskName, config.taskClass, config.detectorName, config.consulUrl, 0, true);
213213

214-
BOOST_CHECK_NO_THROW(objectsManager.startPublishing(nullptr, PublicationPolicy::Forever));
214+
BOOST_CHECK_NO_THROW(objectsManager.startPublishing<true>(nullptr, PublicationPolicy::Forever));
215215
BOOST_CHECK_NO_THROW(objectsManager.setDefaultDrawOptions(nullptr, ""));
216216
BOOST_CHECK_NO_THROW(objectsManager.setDisplayHint(nullptr, ""));
217217
BOOST_CHECK_NO_THROW(objectsManager.stopPublishing(nullptr));

Framework/test/testPublisher.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ BOOST_AUTO_TEST_CASE(publisher_test)
3838
std::string consulUrl = "invalid";
3939
ObjectsManager objectsManager(taskName, "taskClass", detectorName, consulUrl, 0, true);
4040
TObjString s("content");
41-
objectsManager.startPublishing(&s, PublicationPolicy::Forever);
41+
objectsManager.startPublishing<true>(&s, PublicationPolicy::Forever);
4242

4343
TObjString* s2 = (TObjString*)(objectsManager.getMonitorObject("content")->getObject());
4444
BOOST_CHECK_EQUAL(s.GetString(), s2->GetString());

Modules/CTP/src/CountersQcTask.cxx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ void CTPCountersTask::initialize(o2::framework::InitContext& /*ctx*/)
6262
mHistInputRate[i]->Draw();
6363
mHistInputRate[i]->SetBit(TObject::kCanDelete);
6464
}
65-
getObjectsManager()->startPublishing(mTCanvasInputs);
65+
getObjectsManager()->startPublishing<true>(mTCanvasInputs);
6666
}
6767

6868
{
@@ -79,7 +79,7 @@ void CTPCountersTask::initialize(o2::framework::InitContext& /*ctx*/)
7979
mHistClassRate[i]->Draw();
8080
mHistClassRate[i]->SetBit(TObject::kCanDelete);
8181
}
82-
getObjectsManager()->startPublishing(mTCanvasClasses);
82+
getObjectsManager()->startPublishing<true>(mTCanvasClasses);
8383
}
8484

8585
{
@@ -100,7 +100,7 @@ void CTPCountersTask::initialize(o2::framework::InitContext& /*ctx*/)
100100
mHistClassRate[k]->Draw();
101101
mHistClassRate[k]->SetBit(TObject::kCanDelete);
102102
}*/
103-
getObjectsManager()->startPublishing(mTCanvasClassRates[j]);
103+
getObjectsManager()->startPublishing<true>(mTCanvasClassRates[j]);
104104
}
105105
}
106106

@@ -136,7 +136,7 @@ void CTPCountersTask::initialize(o2::framework::InitContext& /*ctx*/)
136136
mHistClassTotalCounts[i]->Draw();
137137
mHistClassTotalCounts[i]->SetBit(TObject::kCanDelete);
138138
}
139-
getObjectsManager()->startPublishing(mTCanvasTotalCountsClasses);
139+
getObjectsManager()->startPublishing<true>(mTCanvasTotalCountsClasses);
140140
}
141141
}
142142

Modules/Example/src/EveryObject.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ void EveryObject::initialize(o2::framework::InitContext& /*ctx*/)
8282
mTCanvasMembers[i]->Draw();
8383
mTCanvasMembers[i]->SetBit(TObject::kCanDelete);
8484
}
85-
getObjectsManager()->startPublishing(mTCanvas, PublicationPolicy::Forever);
85+
getObjectsManager()->startPublishing<true>(mTCanvas, PublicationPolicy::Forever);
8686
}
8787
}
8888

Modules/GLO/src/DataCompressionQcTask.cxx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ void DataCompressionQcTask::initialize(o2::framework::InitContext&)
7070
mEntropyCompressionCanvas->DivideSquare(mCompressionHists.size());
7171
mCompressionCanvas->DivideSquare(mCompressionHists.size());
7272

73-
getObjectsManager()->startPublishing(mEntropyCompressionCanvas.get());
74-
getObjectsManager()->startPublishing(mCompressionCanvas.get());
73+
getObjectsManager()->startPublishing<true>(mEntropyCompressionCanvas.get());
74+
getObjectsManager()->startPublishing<true>(mCompressionCanvas.get());
7575
}
7676
}
7777

Modules/HMPID/src/HmpidTask.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ void HmpidTask::initialize(o2::framework::InitContext& /*ctx*/)
194194

195195
// Error messages
196196
CheckerMessages = new TCanvas("CheckerMessages");
197-
getObjectsManager()->startPublishing(CheckerMessages);
197+
getObjectsManager()->startPublishing<true>(CheckerMessages);
198198

199199
// TH2 to check HV
200200
hCheckHV = new TH2F("hCheckHV", "hCheckHV", 42, -0.5, 41.5, 4, 0, 4);

Modules/MUON/MCH/src/PedestalsTask.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ void PedestalsTask::initialize(o2::framework::InitContext& /*ctx*/)
168168
}
169169

170170
mCanvasCheckerMessages = std::make_unique<TCanvas>("CheckerMessages", "Checker Messages", 800, 600);
171-
getObjectsManager()->startPublishing(mCanvasCheckerMessages.get());
171+
getObjectsManager()->startPublishing<true>(mCanvasCheckerMessages.get());
172172

173173
mPrintLevel = 0;
174174
}

0 commit comments

Comments
 (0)