1313// / \author Piotr Konopka
1414// /
1515#include " QualityControl/DataProducer.h"
16+ #include " QualityControl/QcInfoLogger.h"
1617
1718#include < random>
1819#include < Common/Timer.h>
1920#include < Monitoring/MonitoringFactory.h>
21+ #include < Framework/ControlService.h>
2022
2123using namespace o2 ::framework;
2224using namespace o2 ::monitoring;
@@ -27,28 +29,29 @@ using namespace AliceO2::Common;
2729namespace o2 ::quality_control::core
2830{
2931
30- DataProcessorSpec getDataProducerSpec (size_t minSize, size_t maxSize, double rate, bool fill, size_t index, std::string monitoringUrl)
32+ DataProcessorSpec getDataProducerSpec (size_t minSize, size_t maxSize, double rate, uint64_t amount, size_t index,
33+ std::string monitoringUrl, bool fill)
3134{
3235 return DataProcessorSpec{
3336 " producer-" + std::to_string (index),
3437 Inputs{},
3538 Outputs{
3639 { { " out" }, " TST" , " RAWDATA" , static_cast <SubSpec>(index) } },
37- getDataProducerAlgorithm ({ " TST" , " RAWDATA" , static_cast <SubSpec>(index) }, minSize, maxSize, rate, fill, monitoringUrl)
40+ getDataProducerAlgorithm ({ " TST" , " RAWDATA" , static_cast <SubSpec>(index) }, minSize, maxSize, rate, amount,
41+ monitoringUrl, fill)
3842 };
3943}
4044
41- framework::AlgorithmSpec
42- getDataProducerAlgorithm (ConcreteDataMatcher output, size_t minSize, size_t maxSize, double rate, bool fill,
43- std::string monitoringUrl)
45+ AlgorithmSpec getDataProducerAlgorithm (ConcreteDataMatcher output, size_t minSize, size_t maxSize, double rate,
46+ uint64_t amount, std::string monitoringUrl, bool fill)
4447{
4548 return AlgorithmSpec{
4649 [=](InitContext&) {
4750 // this is the initialization code
4851 std::default_random_engine generator (time (nullptr ));
4952 std::shared_ptr<Timer> timer = nullptr ;
5053
51- int messageCounter = 0 ;
54+ uint64_t messageCounter = 0 ;
5255 std::shared_ptr<monitoring::Monitoring> collector;
5356 if (!monitoringUrl.empty ()) {
5457 collector = MonitoringFactory::Get (monitoringUrl);
@@ -59,6 +62,14 @@ framework::AlgorithmSpec
5962 return [=](ProcessingContext& processingContext) mutable {
6063 // everything inside this lambda function is invoked in a loop, because it this Data Processor has no inputs
6164
65+ // checking if we have reached the maximum amount of messages
66+ if (amount != 0 && messageCounter >= amount) {
67+ ILOG (Info) << " Reached the maximum number of messages, requesting to quit the producer and sending an EndOfStream" << ENDM ;
68+ processingContext.services ().get <ControlService>().endOfStream ();
69+ processingContext.services ().get <ControlService>().readyToQuit (QuitRequest::Me);
70+ return ;
71+ }
72+
6273 // setting up the timer
6374 if (!timer) {
6475 timer = std::make_shared<Timer>();
@@ -72,17 +83,19 @@ framework::AlgorithmSpec
7283 timer->increment ();
7384
7485 // generating data
75- size_t length = minSize + (generator () % (maxSize - minSize));
86+ size_t length = ( minSize == maxSize) ? minSize : (minSize + (generator () % (maxSize - minSize) ));
7687 auto data = processingContext.outputs ().make <char >({ output.origin , output.description , output.subSpec },
7788 length);
89+ ++messageCounter;
7890 if (fill) {
7991 for (auto && item : data) {
8092 item = static_cast <char >(generator ());
8193 }
8294 }
8395
96+ // send metrics
8497 if (collector) {
85- collector->send ({ messageCounter++ , " Data_producer_" + std::to_string (output.subSpec ) + " _message_" },
98+ collector->send ({ messageCounter, " Data_producer_" + std::to_string (output.subSpec ) + " _message_" },
8699 DerivedMetricMode::RATE );
87100 }
88101 };
0 commit comments