Commit fc2ba5b6cc53045ca3fa22a963864d4649b6fbf8
1 parent
1654508d
Publish retained message count on $SYS
Showing
3 changed files
with
18 additions
and
3 deletions
mainapp.cpp
| ... | ... | @@ -355,6 +355,8 @@ void MainApp::publishStatsOnDollarTopic() |
| 355 | 355 | |
| 356 | 356 | publishStat("$SYS/broker/load/messages/sent/total", sentMessageCount); |
| 357 | 357 | publishStat("$SYS/broker/load/messages/sent/persecond", sentMessageCountPerSecond); |
| 358 | + | |
| 359 | + publishStat("$SYS/broker/retained messages/count", subscriptionStore->getRetainedMessageCount()); | |
| 358 | 360 | } |
| 359 | 361 | |
| 360 | 362 | void MainApp::publishStat(const std::string &topic, uint64_t n) | ... | ... |
subscriptionstore.cpp
| ... | ... | @@ -402,7 +402,7 @@ void SubscriptionStore::setRetainedMessage(const std::string &topic, const std:: |
| 402 | 402 | |
| 403 | 403 | if (deepestNode) |
| 404 | 404 | { |
| 405 | - deepestNode->addPayload(topic, payload, qos); | |
| 405 | + deepestNode->addPayload(topic, payload, qos, retainedMessageCount); | |
| 406 | 406 | } |
| 407 | 407 | |
| 408 | 408 | locker.unlock(); |
| ... | ... | @@ -489,6 +489,11 @@ void SubscriptionStore::removeExpiredSessionsClients(int expireSessionsAfterSeco |
| 489 | 489 | root.cleanSubscriptions(); |
| 490 | 490 | } |
| 491 | 491 | |
| 492 | +int64_t SubscriptionStore::getRetainedMessageCount() const | |
| 493 | +{ | |
| 494 | + return retainedMessageCount; | |
| 495 | +} | |
| 496 | + | |
| 492 | 497 | // QoS is not used in the comparision. This means you upgrade your QoS by subscribing again. The |
| 493 | 498 | // specs don't specify what to do there. |
| 494 | 499 | bool Subscription::operator==(const Subscription &rhs) const |
| ... | ... | @@ -515,8 +520,9 @@ bool Subscription::sessionGone() const |
| 515 | 520 | return session.expired(); |
| 516 | 521 | } |
| 517 | 522 | |
| 518 | -void RetainedMessageNode::addPayload(const std::string &topic, const std::string &payload, char qos) | |
| 523 | +void RetainedMessageNode::addPayload(const std::string &topic, const std::string &payload, char qos, int64_t &totalCount) | |
| 519 | 524 | { |
| 525 | + const int64_t countBefore = retainedMessages.size(); | |
| 520 | 526 | RetainedMessage rm(topic, payload, qos); |
| 521 | 527 | |
| 522 | 528 | auto retained_ptr = retainedMessages.find(rm); |
| ... | ... | @@ -528,6 +534,8 @@ void RetainedMessageNode::addPayload(const std::string &topic, const std::string |
| 528 | 534 | if (retained_found && payload.empty()) |
| 529 | 535 | { |
| 530 | 536 | retainedMessages.erase(rm); |
| 537 | + const int64_t diffCount = (retainedMessages.size() - countBefore); | |
| 538 | + totalCount += diffCount; | |
| 531 | 539 | return; |
| 532 | 540 | } |
| 533 | 541 | |
| ... | ... | @@ -535,6 +543,8 @@ void RetainedMessageNode::addPayload(const std::string &topic, const std::string |
| 535 | 543 | retainedMessages.erase(rm); |
| 536 | 544 | |
| 537 | 545 | retainedMessages.insert(std::move(rm)); |
| 546 | + const int64_t diffCount = (retainedMessages.size() - countBefore); | |
| 547 | + totalCount += diffCount; | |
| 538 | 548 | } |
| 539 | 549 | |
| 540 | 550 | /** | ... | ... |
subscriptionstore.h
| ... | ... | @@ -71,7 +71,7 @@ class RetainedMessageNode |
| 71 | 71 | std::unordered_map<std::string, std::unique_ptr<RetainedMessageNode>> children; |
| 72 | 72 | std::unordered_set<RetainedMessage> retainedMessages; |
| 73 | 73 | |
| 74 | - void addPayload(const std::string &topic, const std::string &payload, char qos); | |
| 74 | + void addPayload(const std::string &topic, const std::string &payload, char qos, int64_t &totalCount); | |
| 75 | 75 | RetainedMessageNode *getChildren(const std::string &subtopic) const; |
| 76 | 76 | }; |
| 77 | 77 | |
| ... | ... | @@ -86,6 +86,7 @@ class SubscriptionStore |
| 86 | 86 | pthread_rwlock_t retainedMessagesRwlock = PTHREAD_RWLOCK_INITIALIZER; |
| 87 | 87 | RetainedMessageNode retainedMessagesRoot; |
| 88 | 88 | RetainedMessageNode retainedMessagesRootDollar; |
| 89 | + int64_t retainedMessageCount = 0; | |
| 89 | 90 | |
| 90 | 91 | Logger *logger = Logger::getInstance(); |
| 91 | 92 | |
| ... | ... | @@ -111,6 +112,8 @@ public: |
| 111 | 112 | void setRetainedMessage(const std::string &topic, const std::vector<std::string> &subtopics, const std::string &payload, char qos); |
| 112 | 113 | |
| 113 | 114 | void removeExpiredSessionsClients(int expireSessionsAfterSeconds); |
| 115 | + | |
| 116 | + int64_t getRetainedMessageCount() const; | |
| 114 | 117 | }; |
| 115 | 118 | |
| 116 | 119 | #endif // SUBSCRIPTIONSTORE_H | ... | ... |