@@ -77,23 +77,24 @@ struct MetricIndices {
7777 size_t shmOfferBytesConsumed = -1 ;
7878 size_t timeframesRead = -1 ;
7979 size_t timeframesConsumed = -1 ;
80+ size_t timeframesExpired = -1 ;
8081};
8182
8283std::vector<MetricIndices> createDefaultIndices (std::vector<DeviceMetricsInfo>& allDevicesMetrics)
8384{
8485 std::vector<MetricIndices> results;
8586
8687 for (auto & info : allDevicesMetrics) {
87- MetricIndices indices;
88- indices .arrowBytesCreated = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " arrow-bytes-created" );
89- indices .arrowBytesDestroyed = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " arrow-bytes-destroyed" );
90- indices .arrowMessagesCreated = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " arrow-messages-created" );
91- indices .arrowMessagesDestroyed = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " arrow-messages-destroyed" );
92- indices .arrowBytesExpired = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " arrow-bytes-expired" );
93- indices .shmOfferBytesConsumed = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " shm-offer-bytes-consumed" );
94- indices .timeframesRead = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " df-sent" );
95- indices .timeframesConsumed = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " consumed-timeframes" );
96- results. push_back (indices );
88+ results. emplace_back ( MetricIndices{
89+ .arrowBytesCreated = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " arrow-bytes-created" ),
90+ .arrowBytesDestroyed = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " arrow-bytes-destroyed" ),
91+ .arrowMessagesCreated = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " arrow-messages-created" ),
92+ .arrowMessagesDestroyed = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " arrow-messages-destroyed" ),
93+ .arrowBytesExpired = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " arrow-bytes-expired" ),
94+ .shmOfferBytesConsumed = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " shm-offer-bytes-consumed" ),
95+ .timeframesRead = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " df-sent" ),
96+ .timeframesConsumed = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " consumed-timeframes" ),
97+ . timeframesExpired = DeviceMetricsHelper::bookNumericMetric< uint64_t >(info, " expired-timeframes " )} );
9798 }
9899 return results;
99100}
@@ -258,6 +259,7 @@ o2::framework::ServiceSpec ArrowSupport::arrowBackendSpec()
258259 int64_t totalMessagesDestroyed = 0 ;
259260 int64_t totalTimeframesRead = 0 ;
260261 int64_t totalTimeframesConsumed = 0 ;
262+ int64_t totalTimeframesExpired = 0 ;
261263 auto &driverMetrics = sm.driverMetricsInfo ;
262264 auto &allDeviceMetrics = sm.deviceMetricsInfos ;
263265 auto &specs = sm.deviceSpecs ;
@@ -266,9 +268,14 @@ o2::framework::ServiceSpec ArrowSupport::arrowBackendSpec()
266268 static auto stateMetric = DeviceMetricsHelper::createNumericMetric<uint64_t >(driverMetrics, " rate-limit-state" );
267269 static auto totalBytesCreatedMetric = DeviceMetricsHelper::createNumericMetric<uint64_t >(driverMetrics, " total-arrow-bytes-created" );
268270 static auto shmOfferConsumedMetric = DeviceMetricsHelper::createNumericMetric<uint64_t >(driverMetrics, " total-shm-offer-bytes-consumed" );
271+ // These are really to monitor the rate limiting
269272 static auto unusedOfferedSharedMemoryMetric = DeviceMetricsHelper::createNumericMetric<int >(driverMetrics, " total-unused-offered-shared-memory" );
273+ static auto unusedOfferedTimeslicesMetric = DeviceMetricsHelper::createNumericMetric<int >(driverMetrics, " total-unused-offered-timeslices" );
270274 static auto availableSharedMemoryMetric = DeviceMetricsHelper::createNumericMetric<int >(driverMetrics, " total-available-shared-memory" );
275+ static auto availableTimeslicesMetric = DeviceMetricsHelper::createNumericMetric<int >(driverMetrics, " total-available-timeslices" );
271276 static auto offeredSharedMemoryMetric = DeviceMetricsHelper::createNumericMetric<int >(driverMetrics, " total-offered-shared-memory" );
277+ static auto offeredTimeslicesMetric = DeviceMetricsHelper::createNumericMetric<int >(driverMetrics, " total-offered-timeslices" );
278+
272279 static auto totalBytesDestroyedMetric = DeviceMetricsHelper::createNumericMetric<uint64_t >(driverMetrics, " total-arrow-bytes-destroyed" );
273280 static auto totalBytesExpiredMetric = DeviceMetricsHelper::createNumericMetric<uint64_t >(driverMetrics, " total-arrow-bytes-expired" );
274281 static auto totalMessagesCreatedMetric = DeviceMetricsHelper::createNumericMetric<uint64_t >(driverMetrics, " total-arrow-messages-created" );
@@ -390,6 +397,18 @@ o2::framework::ServiceSpec ArrowSupport::arrowBackendSpec()
390397 auto const & timestamps = DeviceMetricsHelper::getTimestampsStore<uint64_t >(deviceMetrics)[info.storeIdx ];
391398 lastTimestamp = std::max (lastTimestamp, timestamps[(info.pos - 1 ) % data.size ()]);
392399 }
400+ {
401+ size_t index = indices.timeframesExpired ;
402+ assert (index < deviceMetrics.metrics .size ());
403+ changed |= deviceMetrics.changed [index];
404+ MetricInfo info = deviceMetrics.metrics [index];
405+ assert (info.storeIdx < deviceMetrics.uint64Metrics .size ());
406+ auto & data = deviceMetrics.uint64Metrics [info.storeIdx ];
407+ auto value = (int64_t )data[(info.pos - 1 ) % data.size ()];
408+ totalTimeframesExpired += value;
409+ auto const & timestamps = DeviceMetricsHelper::getTimestampsStore<uint64_t >(deviceMetrics)[info.storeIdx ];
410+ lastTimestamp = std::max (lastTimestamp, timestamps[(info.pos - 1 ) % data.size ()]);
411+ }
393412 }
394413 static uint64_t unchangedCount = 0 ;
395414 if (changed) {
@@ -407,26 +426,45 @@ o2::framework::ServiceSpec ArrowSupport::arrowBackendSpec()
407426 unchangedCount++;
408427 }
409428 changedCountMetric (driverMetrics, unchangedCount, timestamp);
410- auto maxTimeframes = registry.get <RateLimitConfig>().maxTimeframes ;
411- if (maxTimeframes && (totalTimeframesRead - totalTimeframesConsumed) > maxTimeframes) {
412- return ;
413- }
429+
414430 static const ResourceSpec shmResourceSpec{
415431 .name = " shared memory" ,
416432 .unit = " MB" ,
417433 .api = " /shm-offer {}" ,
418- .maxAvailable = (int64_t )calculateAvailableSharedMemory ( registry) ,
434+ .maxAvailable = (int64_t )registry. get <RateLimitConfig>(). maxMemory ,
419435 .maxQuantum = 100 ,
420436 .minQuantum = 50 ,
421437 .metricOfferScaleFactor = 1000000 ,
422438 };
439+ static const ResourceSpec timesliceResourceSpec{
440+ .name = " timeslice" ,
441+ .unit = " timeslices" ,
442+ .api = " /timeslice-offer {}" ,
443+ .maxAvailable = (int64_t )registry.get <RateLimitConfig>().maxTimeframes ,
444+ .maxQuantum = 2 ,
445+ .minQuantum = 1 ,
446+ .metricOfferScaleFactor = 1 ,
447+ };
423448 static ResourceState shmResourceState{
424449 .available = shmResourceSpec.maxAvailable ,
425450 };
451+ static ResourceState timesliceResourceState{
452+ .available = timesliceResourceSpec.maxAvailable ,
453+ };
426454 static ResourceStats shmResourceStats{
427455 .enoughCount = shmResourceState.available - shmResourceSpec.minQuantum > 0 ? 1 : 0 ,
428456 .lowCount = shmResourceState.available - shmResourceSpec.minQuantum > 0 ? 0 : 1
429457 };
458+ static ResourceStats timesliceResourceStats{
459+ .enoughCount = shmResourceState.available - shmResourceSpec.minQuantum > 0 ? 1 : 0 ,
460+ .lowCount = shmResourceState.available - shmResourceSpec.minQuantum > 0 ? 0 : 1
461+ };
462+
463+ offerResources (timesliceResourceState, timesliceResourceSpec, timesliceResourceStats,
464+ specs, infos, manager, totalTimeframesConsumed, totalTimeframesExpired,
465+ totalTimeframesRead, totalTimeframesConsumed, timestamp, driverMetrics,
466+ availableTimeslicesMetric, unusedOfferedTimeslicesMetric, offeredTimeslicesMetric,
467+ (void *)&sm);
430468
431469 offerResources (shmResourceState, shmResourceSpec, shmResourceStats,
432470 specs, infos, manager, shmOfferBytesConsumed, totalBytesExpired,
@@ -497,8 +535,8 @@ o2::framework::ServiceSpec ArrowSupport::arrowBackendSpec()
497535 if (!once) {
498536 O2_SIGNPOST_ID_GENERATE (sid, rate_limiting);
499537 O2_SIGNPOST_EVENT_EMIT_INFO (rate_limiting, sid, " setup" ,
500- " Rate limiting set up at %{bytes}llu MB distributed over %d readers" ,
501- config->maxMemory , readers);
538+ " Rate limiting set up at %{bytes}llu MB and %llu timeframes distributed over %d readers" ,
539+ config->maxMemory , config-> maxTimeframes , readers);
502540 registry.registerService (ServiceRegistryHelpers::handleForService<RateLimitConfig>(config));
503541 once = true ;
504542 } },
0 commit comments