summaryrefslogtreecommitdiff
path: root/src/mongo/db/free_mon/free_mon_queue.h
diff options
context:
space:
mode:
authorMark Benvenuto <mark.benvenuto@mongodb.com>2018-10-26 11:36:37 -0400
committerMark Benvenuto <mark.benvenuto@mongodb.com>2018-10-26 11:36:37 -0400
commiteb2157a3d7c6b02d7d8f873afafd630f3d9aed4f (patch)
treed82e14ca27cd428979adcf66bffb02daf0d5f2de /src/mongo/db/free_mon/free_mon_queue.h
parenta15cf62de1d5de973160ec1a23609aaf6f0f500f (diff)
downloadmongo-eb2157a3d7c6b02d7d8f873afafd630f3d9aed4f.tar.gz
SERVER-37685 Ensure free monitoring queue preserves FIFO on messages with same deadline
Diffstat (limited to 'src/mongo/db/free_mon/free_mon_queue.h')
-rw-r--r--src/mongo/db/free_mon/free_mon_queue.h14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/mongo/db/free_mon/free_mon_queue.h b/src/mongo/db/free_mon/free_mon_queue.h
index c36636b4c96..d8f90d32b60 100644
--- a/src/mongo/db/free_mon/free_mon_queue.h
+++ b/src/mongo/db/free_mon/free_mon_queue.h
@@ -49,7 +49,15 @@ namespace mongo {
struct FreeMonMessageGreater {
bool operator()(const std::shared_ptr<FreeMonMessage>& left,
const std::shared_ptr<FreeMonMessage>& right) const {
- return (left->getDeadline() > right->getDeadline());
+ if (left->getDeadline() > right->getDeadline()) {
+ return true;
+ }
+
+ if (left->getDeadline() == right->getDeadline()) {
+ return left->getId() > right->getId();
+ }
+
+ return false;
}
};
@@ -137,6 +145,10 @@ private:
// Use manual crank to process messages in-order instead of based on deadlines.
bool _useCrank{false};
+ // Stamp each message with a unique counter. This ensures that if two messages are queued with
+ // the same deadline, FIFO is achieved.
+ uint64_t _counter;
+
// Number of messages to ignore
size_t _countMessagesToIgnore{0};