summaryrefslogtreecommitdiff
path: root/src/mongo/db/op_observer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/op_observer.cpp')
-rw-r--r--src/mongo/db/op_observer.cpp36
1 files changed, 29 insertions, 7 deletions
diff --git a/src/mongo/db/op_observer.cpp b/src/mongo/db/op_observer.cpp
index fc2f4485b53..b4dacd091c5 100644
--- a/src/mongo/db/op_observer.cpp
+++ b/src/mongo/db/op_observer.cpp
@@ -40,6 +40,7 @@
#include "mongo/db/repl/replication_coordinator_global.h"
#include "mongo/s/d_state.h"
#include "mongo/scripting/engine.h"
+#include "mongo/db/operation_context.h"
namespace mongo {
@@ -91,16 +92,37 @@ void OpObserver::onUpdate(OperationContext* txn, oplogUpdateEntryArgs args) {
}
}
+OpObserver::DeleteState OpObserver::aboutToDelete(OperationContext* txn,
+ const NamespaceString& ns,
+ const BSONObj& doc) {
+ OpObserver::DeleteState deleteState;
+ BSONElement idElement = doc["_id"];
+ if (!idElement.eoo()) {
+ deleteState.idDoc = idElement.wrap();
+ }
+ deleteState.isMigrating = isInMigratingChunk(txn, ns, doc);
+ return deleteState;
+}
+
void OpObserver::onDelete(OperationContext* txn,
- const std::string& ns,
- const BSONObj& idDoc,
+ const NamespaceString& ns,
+ OpObserver::DeleteState deleteState,
bool fromMigrate) {
- repl::logOp(txn, "d", ns.c_str(), idDoc, nullptr, fromMigrate);
+ if (deleteState.idDoc.isEmpty())
+ return;
- getGlobalAuthorizationManager()->logOp(txn, "d", ns.c_str(), idDoc, nullptr);
- logOpForSharding(txn, "d", ns.c_str(), idDoc, nullptr, fromMigrate);
- logOpForDbHash(txn, ns.c_str());
- if (strstr(ns.c_str(), ".system.js")) {
+ repl::logOp(txn, "d", ns.ns().c_str(), deleteState.idDoc, nullptr, fromMigrate);
+
+ AuthorizationManager::get(txn->getServiceContext())
+ ->logOp(txn, "d", ns.ns().c_str(), deleteState.idDoc, nullptr);
+ logOpForSharding(txn,
+ "d",
+ ns.ns().c_str(),
+ deleteState.idDoc,
+ nullptr,
+ fromMigrate || !deleteState.isMigrating);
+ logOpForDbHash(txn, ns.ns().c_str());
+ if (ns.coll() == "system.js") {
Scope::storedFuncMod(txn);
}
}