Skip to content

Commit b294920

Browse files
author
Michal Tichák
committed
startPublishing in ObjectManager uses check for mergeable items
1 parent 10f85b8 commit b294920

File tree

6 files changed

+44
-40
lines changed

6 files changed

+44
-40
lines changed

Framework/include/QualityControl/ObjectsManager.h

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +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;
30-
class TH1;
31-
class TTree;
32-
class THnBase;
33-
class TEfficiency;
34-
class TGraph;
3532

3633
namespace o2::quality_control::core
3734
{
@@ -81,20 +78,23 @@ class ObjectsManager
8178
/**
8279
* Start publishing the object obj, i.e. it will be pushed forward in the workflow at regular intervals.
8380
* 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.
8483
* @param obj The object to publish.
8584
* @throws DuplicateObjectError
8685
*/
87-
template <typename T>
88-
void startPublishing(T* obj, PublicationPolicy policy = PublicationPolicy::Forever)
86+
template <bool IgnoreMergeable = false, typename T>
87+
void startPublishing(T obj, PublicationPolicy policy = PublicationPolicy::Forever)
8988
{
90-
if constexpr (!std::is_base_of_v<mergers::MergeInterface, T>() &&
91-
!std::is_base_of_v<TCollection, T>() &&
92-
!std::is_base_of_v<TH1, T>() &&
93-
!std::is_base_of_v<TTree, T>() &&
94-
!std::is_base_of_v<TGraph, T>() &&
95-
!std::is_base_of_v<TEfficiency, T>()) {
96-
static_assert(true, "You are trying to start publish object, that is not mergeable");
97-
}
89+
// If you want to ignore Mergeable check for whole module
90+
#ifndef IGNORE_MERGEABLE_CHECK
91+
static_assert(std::same_as<std::remove_pointer_t<T>, TObject> ||
92+
// there is TCanvas mentioned here because users are using it a lot when they should not
93+
// std::same_as<std::remove_pointer_t<T>, TCanvas> ||
94+
IgnoreMergeable || mergers::Mergeable<T>,
95+
"you are trying to startPublishing object that is not mergeable."
96+
" If you know what you are doing use startPublishing<true>(...)");
97+
#endif
9898
startPublishingImpl(obj, policy);
9999
}
100100

@@ -103,7 +103,8 @@ class ObjectsManager
103103
* @param obj
104104
* @throw ObjectNotFoundError if object is not found.
105105
*/
106-
void stopPublishing(TObject* obj);
106+
void
107+
stopPublishing(TObject* obj);
107108

108109
/**
109110
* Stop publishing this object

Framework/src/ObjectsManager.cxx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ 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)
6464
{
6565
if (!object) {
6666
ILOG(Warning, Support) << "A nullptr provided to ObjectManager::startPublishing" << ENDM;
@@ -70,6 +70,9 @@ void ObjectsManager::startPublishing(TObject* object, PublicationPolicy publicat
7070
ILOG(Warning, Support) << "Object is already being published (" << object->GetName() << "), will remove it and add the new one" << ENDM;
7171
stopPublishing(object->GetName());
7272
}
73+
if (mergers::isMergeable(object)) {
74+
ILOG(Warning, Support) << "Object '" + std::string(object->GetName()) + "' with type '" + std::string(object->ClassName()) + "' is not one of the mergeable types, it might cause issues during publishing";
75+
}
7376
auto* newObject = new MonitorObject(object, mTaskName, mTaskClass, mDetectorName);
7477
newObject->setIsOwner(false);
7578
newObject->setActivity(mActivity);

Framework/src/SliceTrendingTask.cxx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ void SliceTrendingTask::generatePlots()
253253
}
254254

255255
mPlots[plot.name] = c;
256-
getObjectsManager()->startPublishing(c, PublicationPolicy::Once);
256+
getObjectsManager()->startPublishing<true>(c, PublicationPolicy::Once);
257257
}
258258
} // void SliceTrendingTask::generatePlots()
259259

@@ -666,4 +666,4 @@ std::string SliceTrendingTask::beautifyTitle(const std::string_view rawtitle, co
666666
}
667667

668668
return beautified;
669-
}
669+
}

Framework/src/TrendingTask.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ void TrendingTask::generatePlots()
257257
}
258258
auto c = drawPlot(plotConfig);
259259
mPlots[plotConfig.name].reset(c);
260-
getObjectsManager()->startPublishing(c, PublicationPolicy::Once);
260+
getObjectsManager()->startPublishing<true>(c, PublicationPolicy::Once);
261261
}
262262
}
263263

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());

0 commit comments

Comments
 (0)