diff options
author | Dianna Hohensee <dianna.hohensee@10gen.com> | 2015-12-02 11:51:41 -0500 |
---|---|---|
committer | Dianna Hohensee <dianna.hohensee@10gen.com> | 2015-12-22 09:12:08 -0500 |
commit | 3663e004dfc2f73b82b3d88b5fa1ac6b7dcd1d33 (patch) | |
tree | d46813559c37225f31768042e2bd2a4ba8ce1ba0 /src/mongo/db/op_observer.cpp | |
parent | 07b2e02ffddbd9998b8c738895f3fae85b592176 (diff) | |
download | mongo-3663e004dfc2f73b82b3d88b5fa1ac6b7dcd1d33.tar.gz |
SERVER-21382 fixing sharding migration to transfer only document deletions relevant to the chunk being migrated, not every deletion
Diffstat (limited to 'src/mongo/db/op_observer.cpp')
-rw-r--r-- | src/mongo/db/op_observer.cpp | 36 |
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); } } |