StatusWith<ClusterCursorManager::PinnedCursor> ClusterCursorManager::checkOutCursor( const NamespaceString& nss, CursorId cursorId) { // Read the clock out of the lock. const auto now = _clockSource->now(); stdx::lock_guard<stdx::mutex> lk(_mutex); if (_inShutdown) { return Status(ErrorCodes::ShutdownInProgress, "Cannot check out cursor as we are in the process of shutting down"); } CursorEntry* entry = getEntry_inlock(nss, cursorId); if (!entry) { return cursorNotFoundStatus(nss, cursorId); } if (entry->getKillPending()) { return cursorNotFoundStatus(nss, cursorId); } std::unique_ptr<ClusterClientCursor> cursor = entry->releaseCursor(); if (!cursor) { return cursorInUseStatus(nss, cursorId); } entry->setLastActive(now); // Note that pinning a cursor transfers ownership of the underlying ClusterClientCursor object // to the pin; the CursorEntry is left with a null ClusterClientCursor. return PinnedCursor(this, std::move(cursor), nss, cursorId); }
StatusWith<ClusterCursorManager::PinnedCursor> ClusterCursorManager::checkOutCursor( const NamespaceString& nss, CursorId cursorId) { stdx::lock_guard<stdx::mutex> lk(_mutex); CursorEntry* entry = getEntry_inlock(nss, cursorId); if (!entry) { return cursorNotFoundStatus(nss, cursorId); } if (entry->getKillPending()) { return cursorNotFoundStatus(nss, cursorId); } std::unique_ptr<ClusterClientCursor> cursor = entry->releaseCursor(); if (!cursor) { return cursorInUseStatus(nss, cursorId); } entry->setLastActive(_clockSource->now()); // Note that pinning a cursor transfers ownership of the underlying ClusterClientCursor object // to the pin; the CursorEntry is left with a null ClusterClientCursor. return PinnedCursor(this, std::move(cursor), nss, cursorId); }