summaryrefslogtreecommitdiff
path: root/src/mongo/db/commands/repair_cursor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/commands/repair_cursor.cpp')
-rw-r--r--src/mongo/db/commands/repair_cursor.cpp144
1 files changed, 69 insertions, 75 deletions
diff --git a/src/mongo/db/commands/repair_cursor.cpp b/src/mongo/db/commands/repair_cursor.cpp
index 0598b67b9c3..5cf096fc511 100644
--- a/src/mongo/db/commands/repair_cursor.cpp
+++ b/src/mongo/db/commands/repair_cursor.cpp
@@ -42,83 +42,77 @@
namespace mongo {
- using std::string;
-
- class RepairCursorCmd : public Command {
- public:
- RepairCursorCmd() : Command("repairCursor") {}
-
- virtual bool isWriteCommandForConfigServer() const { return false; }
- virtual bool slaveOk() const { return true; }
-
- virtual Status checkAuthForCommand(ClientBasic* client,
- const std::string& dbname,
- const BSONObj& cmdObj) {
- ActionSet actions;
- actions.addAction(ActionType::find);
- Privilege p(parseResourcePattern(dbname, cmdObj), actions);
- if (AuthorizationSession::get(client)->isAuthorizedForPrivilege(p))
- return Status::OK();
- return Status(ErrorCodes::Unauthorized, "Unauthorized");
+using std::string;
+
+class RepairCursorCmd : public Command {
+public:
+ RepairCursorCmd() : Command("repairCursor") {}
+
+ virtual bool isWriteCommandForConfigServer() const {
+ return false;
+ }
+ virtual bool slaveOk() const {
+ return true;
+ }
+
+ virtual Status checkAuthForCommand(ClientBasic* client,
+ const std::string& dbname,
+ const BSONObj& cmdObj) {
+ ActionSet actions;
+ actions.addAction(ActionType::find);
+ Privilege p(parseResourcePattern(dbname, cmdObj), actions);
+ if (AuthorizationSession::get(client)->isAuthorizedForPrivilege(p))
+ return Status::OK();
+ return Status(ErrorCodes::Unauthorized, "Unauthorized");
+ }
+
+ virtual bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int options,
+ string& errmsg,
+ BSONObjBuilder& result) {
+ NamespaceString ns(parseNs(dbname, cmdObj));
+
+ AutoGetCollectionForRead ctx(txn, ns.ns());
+
+ Collection* collection = ctx.getCollection();
+ if (!collection) {
+ return appendCommandStatus(
+ result, Status(ErrorCodes::NamespaceNotFound, "ns does not exist: " + ns.ns()));
}
- virtual bool run(OperationContext* txn,
- const string& dbname,
- BSONObj& cmdObj,
- int options,
- string& errmsg,
- BSONObjBuilder& result) {
-
- NamespaceString ns(parseNs(dbname, cmdObj));
-
- AutoGetCollectionForRead ctx(txn, ns.ns());
-
- Collection* collection = ctx.getCollection();
- if (!collection) {
- return appendCommandStatus(result,
- Status(ErrorCodes::NamespaceNotFound,
- "ns does not exist: " + ns.ns()));
- }
-
- auto cursor = collection->getRecordStore()->getCursorForRepair(txn);
- if (!cursor) {
- return appendCommandStatus(result,
- Status(ErrorCodes::CommandNotSupported,
- "repair iterator not supported"));
- }
-
- std::unique_ptr<WorkingSet> ws(new WorkingSet());
- std::unique_ptr<MultiIteratorStage> stage(new MultiIteratorStage(txn, ws.get(),
- collection));
- stage->addIterator(std::move(cursor));
-
- PlanExecutor* rawExec;
- Status execStatus = PlanExecutor::make(txn,
- ws.release(),
- stage.release(),
- collection,
- PlanExecutor::YIELD_AUTO,
- &rawExec);
- invariant(execStatus.isOK());
- std::unique_ptr<PlanExecutor> exec(rawExec);
-
- // 'exec' will be used in getMore(). It was automatically registered on construction
- // due to the auto yield policy, so it could yield during plan selection. We deregister
- // it now so that it can be registed with ClientCursor.
- exec->deregisterExec();
- exec->saveState();
-
- // ClientCursors' constructor inserts them into a global map that manages their
- // lifetimes. That is why the next line isn't leaky.
- ClientCursor* cc = new ClientCursor(collection->getCursorManager(),
- exec.release(),
- ns.ns());
-
- appendCursorResponseObject(cc->cursorid(), ns.ns(), BSONArray(), &result);
-
- return true;
-
+ auto cursor = collection->getRecordStore()->getCursorForRepair(txn);
+ if (!cursor) {
+ return appendCommandStatus(
+ result, Status(ErrorCodes::CommandNotSupported, "repair iterator not supported"));
}
- } repairCursorCmd;
+ std::unique_ptr<WorkingSet> ws(new WorkingSet());
+ std::unique_ptr<MultiIteratorStage> stage(
+ new MultiIteratorStage(txn, ws.get(), collection));
+ stage->addIterator(std::move(cursor));
+
+ PlanExecutor* rawExec;
+ Status execStatus = PlanExecutor::make(
+ txn, ws.release(), stage.release(), collection, PlanExecutor::YIELD_AUTO, &rawExec);
+ invariant(execStatus.isOK());
+ std::unique_ptr<PlanExecutor> exec(rawExec);
+
+ // 'exec' will be used in getMore(). It was automatically registered on construction
+ // due to the auto yield policy, so it could yield during plan selection. We deregister
+ // it now so that it can be registed with ClientCursor.
+ exec->deregisterExec();
+ exec->saveState();
+
+ // ClientCursors' constructor inserts them into a global map that manages their
+ // lifetimes. That is why the next line isn't leaky.
+ ClientCursor* cc =
+ new ClientCursor(collection->getCursorManager(), exec.release(), ns.ns());
+
+ appendCursorResponseObject(cc->cursorid(), ns.ns(), BSONArray(), &result);
+
+ return true;
+ }
+} repairCursorCmd;
}