diff options
author | Mark Benvenuto <mark.benvenuto@mongodb.com> | 2018-06-11 17:04:50 -0400 |
---|---|---|
committer | Mark Benvenuto <mark.benvenuto@mongodb.com> | 2018-06-11 17:04:50 -0400 |
commit | 23dbc49cee99273eeec6910072222d936641f97c (patch) | |
tree | f580061c736b1092ba68212d6f5337a401fe00c3 /src/mongo/db | |
parent | 666ae1c0efa1f02f3236ff7f49037c3e06b1eb83 (diff) | |
download | mongo-23dbc49cee99273eeec6910072222d936641f97c.tar.gz |
SERVER-35480 Fix op observer for free monitoring
Diffstat (limited to 'src/mongo/db')
-rw-r--r-- | src/mongo/db/free_mon/free_mon_op_observer.cpp | 17 | ||||
-rw-r--r-- | src/mongo/db/free_mon/free_mon_op_observer.h | 2 | ||||
-rw-r--r-- | src/mongo/db/free_mon/free_mon_processor.cpp | 10 |
3 files changed, 26 insertions, 3 deletions
diff --git a/src/mongo/db/free_mon/free_mon_op_observer.cpp b/src/mongo/db/free_mon/free_mon_op_observer.cpp index b3457a687a6..8dde8c8b53e 100644 --- a/src/mongo/db/free_mon/free_mon_op_observer.cpp +++ b/src/mongo/db/free_mon/free_mon_op_observer.cpp @@ -32,6 +32,7 @@ #include "mongo/db/free_mon/free_mon_controller.h" #include "mongo/db/free_mon/free_mon_storage.h" +#include "mongo/db/operation_context.h" namespace mongo { namespace { @@ -44,6 +45,8 @@ bool isStandaloneOrPrimary(OperationContext* opCtx) { repl::MemberState::RS_PRIMARY); } +const auto getFreeMonDeleteState = OperationContext::declareDecoration<bool>(); + } // namespace FreeMonOpObserver::FreeMonOpObserver() = default; @@ -111,6 +114,18 @@ void FreeMonOpObserver::onUpdate(OperationContext* opCtx, const OplogUpdateEntry } } +void FreeMonOpObserver::aboutToDelete(OperationContext* opCtx, + const NamespaceString& nss, + const BSONObj& doc) { + + bool isFreeMonDoc = (nss == NamespaceString::kServerConfigurationNamespace) && + (doc["_id"].str() == FreeMonStorage::kFreeMonDocIdKey); + + // Set a flag that indicates whether the document to be delete is the free monitoring state + // document + getFreeMonDeleteState(opCtx) = isFreeMonDoc; +} + void FreeMonOpObserver::onDelete(OperationContext* opCtx, const NamespaceString& nss, OptionalCollectionUUID uuid, @@ -125,7 +140,7 @@ void FreeMonOpObserver::onDelete(OperationContext* opCtx, return; } - if (deletedDoc.get()["_id"].str() == FreeMonStorage::kFreeMonDocIdKey) { + if (getFreeMonDeleteState(opCtx) == true) { auto controller = FreeMonController::get(opCtx->getServiceContext()); if (controller != nullptr) { diff --git a/src/mongo/db/free_mon/free_mon_op_observer.h b/src/mongo/db/free_mon/free_mon_op_observer.h index c084c440dd2..05d16a21e4a 100644 --- a/src/mongo/db/free_mon/free_mon_op_observer.h +++ b/src/mongo/db/free_mon/free_mon_op_observer.h @@ -61,7 +61,7 @@ public: void aboutToDelete(OperationContext* opCtx, const NamespaceString& nss, - const BSONObj& doc) final {} + const BSONObj& doc) final; void onDelete(OperationContext* opCtx, const NamespaceString& nss, diff --git a/src/mongo/db/free_mon/free_mon_processor.cpp b/src/mongo/db/free_mon/free_mon_processor.cpp index c192ab21d93..4ff1411145e 100644 --- a/src/mongo/db/free_mon/free_mon_processor.cpp +++ b/src/mongo/db/free_mon/free_mon_processor.cpp @@ -791,6 +791,11 @@ void FreeMonProcessor::doAsyncMetricsComplete( auto opCtxUnique = client->makeOperationContext(); FreeMonStorage::deleteState(opCtxUnique.get()); + _state->setState(StorageStateEnum::pending); + + // Clear out the in-memory state + _lastReadState = boost::none; + return; } @@ -945,7 +950,10 @@ void FreeMonProcessor::doNotifyOnDelete(Client* client) { // the same and stop free monitoring. We continue collecting though. // So we mark the internal state as disabled which stop registration and metrics send - _state->setState(StorageStateEnum::disabled); + _state->setState(StorageStateEnum::pending); + + // Clear out the in-memory state + _lastReadState = boost::none; } void FreeMonProcessor::doNotifyOnRollback(Client* client) { |