diff options
Diffstat (limited to 'src/mongo/db/catalog/cursor_manager.h')
-rw-r--r-- | src/mongo/db/catalog/cursor_manager.h | 222 |
1 files changed, 109 insertions, 113 deletions
diff --git a/src/mongo/db/catalog/cursor_manager.h b/src/mongo/db/catalog/cursor_manager.h index 65fd204c5e3..81b9dd0107c 100644 --- a/src/mongo/db/catalog/cursor_manager.h +++ b/src/mongo/db/catalog/cursor_manager.h @@ -40,118 +40,114 @@ namespace mongo { - class OperationContext; - class PseudoRandom; - class PlanExecutor; - - class CursorManager { - public: - CursorManager( StringData ns ); - - /** - * will kill() all PlanExecutor instances it has - */ - ~CursorManager(); - - // ----------------- - - /** - * @param collectionGoingAway Pass as true if the Collection instance is going away. - * This could be because the db is being closed, or the - * collection/db is being dropped. - * @param reason The motivation for invalidating all cursors. Will be used - * for error reporting and logging when an operation finds that - * the cursor it was operating on has been killed. - */ - void invalidateAll(bool collectionGoingAway, const std::string& reason); - - /** - * Broadcast a document invalidation to all relevant PlanExecutor(s). invalidateDocument - * must called *before* the provided RecordId is about to be deleted or mutated. - */ - void invalidateDocument( OperationContext* txn, - const RecordId& dl, - InvalidationType type ); - - /* - * timesout cursors that have been idle for too long - * note: must have a readlock on the collection - * @return number timed out - */ - std::size_t timeoutCursors( int millisSinceLastCall ); - - // ----------------- - - /** - * Register an executor so that it can be notified of deletion/invalidation during yields. - * Must be called before an executor yields. If an executor is cached (inside a - * ClientCursor) it MUST NOT be registered; the two are mutually exclusive. - */ - void registerExecutor(PlanExecutor* exec); - - /** - * Remove an executor from the registry. - */ - void deregisterExecutor(PlanExecutor* exec); - - // ----------------- - - CursorId registerCursor( ClientCursor* cc ); - void deregisterCursor( ClientCursor* cc ); - - bool eraseCursor(OperationContext* txn, CursorId id, bool checkAuth ); - - /** - * Returns true if the space of cursor ids that cursor manager is responsible for includes - * the given cursor id. Otherwise, returns false. - * - * The return value of this method does not indicate any information about whether or not a - * cursor actually exists with the given cursor id. Use the find() method for that purpose. - */ - bool ownsCursorId( CursorId cursorId ) const; - - void getCursorIds( std::set<CursorId>* openCursors ) const; - std::size_t numCursors() const; - - /** - * @param pin - if true, will try to pin cursor - * if pinned already, will assert - * otherwise will pin - */ - ClientCursor* find( CursorId id, bool pin ); - - void unpin( ClientCursor* cursor ); - - // ---------------------- - - static CursorManager* getGlobalCursorManager(); - - static int eraseCursorGlobalIfAuthorized(OperationContext* txn, int n, - const char* ids); - static bool eraseCursorGlobalIfAuthorized(OperationContext* txn, CursorId id); - - static bool eraseCursorGlobal(OperationContext* txn, CursorId id); - - /** - * @return number timed out - */ - static std::size_t timeoutCursorsGlobal(OperationContext* txn, int millisSinceLastCall); - - private: - CursorId _allocateCursorId_inlock(); - void _deregisterCursor_inlock( ClientCursor* cc ); - - NamespaceString _nss; - unsigned _collectionCacheRuntimeId; - std::unique_ptr<PseudoRandom> _random; - - mutable SimpleMutex _mutex; - - typedef unordered_set<PlanExecutor*> ExecSet; - ExecSet _nonCachedExecutors; - - typedef std::map<CursorId,ClientCursor*> CursorMap; - CursorMap _cursors; - }; +class OperationContext; +class PseudoRandom; +class PlanExecutor; + +class CursorManager { +public: + CursorManager(StringData ns); + + /** + * will kill() all PlanExecutor instances it has + */ + ~CursorManager(); + + // ----------------- + + /** + * @param collectionGoingAway Pass as true if the Collection instance is going away. + * This could be because the db is being closed, or the + * collection/db is being dropped. + * @param reason The motivation for invalidating all cursors. Will be used + * for error reporting and logging when an operation finds that + * the cursor it was operating on has been killed. + */ + void invalidateAll(bool collectionGoingAway, const std::string& reason); + + /** + * Broadcast a document invalidation to all relevant PlanExecutor(s). invalidateDocument + * must called *before* the provided RecordId is about to be deleted or mutated. + */ + void invalidateDocument(OperationContext* txn, const RecordId& dl, InvalidationType type); + + /* + * timesout cursors that have been idle for too long + * note: must have a readlock on the collection + * @return number timed out + */ + std::size_t timeoutCursors(int millisSinceLastCall); + + // ----------------- + + /** + * Register an executor so that it can be notified of deletion/invalidation during yields. + * Must be called before an executor yields. If an executor is cached (inside a + * ClientCursor) it MUST NOT be registered; the two are mutually exclusive. + */ + void registerExecutor(PlanExecutor* exec); + + /** + * Remove an executor from the registry. + */ + void deregisterExecutor(PlanExecutor* exec); + + // ----------------- + + CursorId registerCursor(ClientCursor* cc); + void deregisterCursor(ClientCursor* cc); + + bool eraseCursor(OperationContext* txn, CursorId id, bool checkAuth); + + /** + * Returns true if the space of cursor ids that cursor manager is responsible for includes + * the given cursor id. Otherwise, returns false. + * + * The return value of this method does not indicate any information about whether or not a + * cursor actually exists with the given cursor id. Use the find() method for that purpose. + */ + bool ownsCursorId(CursorId cursorId) const; + + void getCursorIds(std::set<CursorId>* openCursors) const; + std::size_t numCursors() const; + + /** + * @param pin - if true, will try to pin cursor + * if pinned already, will assert + * otherwise will pin + */ + ClientCursor* find(CursorId id, bool pin); + + void unpin(ClientCursor* cursor); + + // ---------------------- + + static CursorManager* getGlobalCursorManager(); + + static int eraseCursorGlobalIfAuthorized(OperationContext* txn, int n, const char* ids); + static bool eraseCursorGlobalIfAuthorized(OperationContext* txn, CursorId id); + + static bool eraseCursorGlobal(OperationContext* txn, CursorId id); + + /** + * @return number timed out + */ + static std::size_t timeoutCursorsGlobal(OperationContext* txn, int millisSinceLastCall); + +private: + CursorId _allocateCursorId_inlock(); + void _deregisterCursor_inlock(ClientCursor* cc); + + NamespaceString _nss; + unsigned _collectionCacheRuntimeId; + std::unique_ptr<PseudoRandom> _random; + + mutable SimpleMutex _mutex; + typedef unordered_set<PlanExecutor*> ExecSet; + ExecSet _nonCachedExecutors; + + typedef std::map<CursorId, ClientCursor*> CursorMap; + CursorMap _cursors; +}; } |