Storage Engine API
mongo::DeferredWriter Class Reference

Provides an interface for asynchronously adding to a collection. More...

#include <deferred_writer.h>

Detailed Description

Provides an interface for asynchronously adding to a collection.

Allows writes to a collection in a context without appropriate locks by buffering them in memory and asynchronously writing them to the backing collection. Useful when an operation with e.g. a global MODE_S lock needs to write, but doesn't care that the write shows up immediately. Motivated by the local health log. For obvious reasons, cannot provide strong durability guarantees, and cannot report whether the insert succeeded–in other words, this class provides eventual "best effort" inserts.

Because this class is motivated by the health log and errors cannot be cleanly reported to the caller, it cannot report most errors to the client; it instead periodically logs any errors to the system log.

Instances of this class are unconditionally thread-safe, and cannot cause deadlock barring improper use of the ctor, flush and shutdown methods below.

Public Member Functions

 DeferredWriter (NamespaceString nss, CollectionOptions opts, int64_t maxSize)
 Create a new DeferredWriter for writing to a given collection. More...
 
void startup (std::string workerName)
 Start the background worker thread writing to the given collection. More...
 
void shutdown (void)
 Flush the buffer and join the worker thread. More...
 
 ~DeferredWriter ()
 Cleans up the writer. More...
 
bool insertDocument (BSONObj obj)
 Deferred-insert the given object. More...
 
int64_t getDroppedEntries ()
 Get the number of dropped writes due to a full buffer since the last log. More...
 

Private Types

using TimePoint = stdx::chrono::time_point< stdx::chrono::system_clock >
 Time we last logged that we can't write to the underlying collection. More...
 

Private Member Functions

 MONGO_DISALLOW_COPYING (DeferredWriter)
 
void _logFailure (const Status &status)
 Log failure, but only if a certain interval has passed since the last log. More...
 
void _logDroppedEntry ()
 Log number of entries dropped because of a full buffer. More...
 
Status _makeCollection (OperationContext *opCtx)
 Create the backing collection if it doesn't exist. More...
 
StatusWith< std::unique_ptr< AutoGetCollection > > _getCollection (OperationContext *opCtx)
 Ensure that the backing collection exists, and pass back a lock and handle to it. More...
 
void _worker (InsertStatement stmt)
 The method that the worker thread will run. More...
 

Private Attributes

const CollectionOptions _collectionOptions
 The options for the collection, in case we need to create it. More...
 
const int64_t _maxNumBytes
 The size limit of the in-memory buffer. More...
 
const NamespaceString _nss
 The name of the backing collection. More...
 
std::unique_ptr< ThreadPool > _pool
 
stdx::mutex _mutex
 Guards all non-const, non-thread-safe members. More...
 
int64_t _numBytes
 The number of bytes currently in the in-memory buffer. More...
 
int64_t _droppedEntries
 The number of deffered entries that have been dropped. More...
 
TimePoint _lastLogged
 
TimePoint _lastLoggedDrop
 

Member Typedef Documentation

◆ TimePoint

using mongo::DeferredWriter::TimePoint = stdx::chrono::time_point<stdx::chrono::system_clock>
private

Time we last logged that we can't write to the underlying collection.

Ensures we don't flood the log with such entries.

Constructor & Destructor Documentation

◆ DeferredWriter()

mongo::DeferredWriter::DeferredWriter ( NamespaceString  nss,
CollectionOptions  opts,
int64_t  maxSize 
)

Create a new DeferredWriter for writing to a given collection.

Will not begin writing to the backing collection until startup is called.

Parameters
optsThe options to use when creating the backing collection if it doesn't exist.
maxSizethe maximum number of bytes to store in the buffer.

◆ ~DeferredWriter()

mongo::DeferredWriter::~DeferredWriter ( )

Cleans up the writer.

Does not clean up the worker thread; call shutdown for that. Instead, if the worker thread is still running calls std::terminate, which crashes the server.

Member Function Documentation

◆ _getCollection()

StatusWith< std::unique_ptr< AutoGetCollection > > mongo::DeferredWriter::_getCollection ( OperationContext *  opCtx)
private

Ensure that the backing collection exists, and pass back a lock and handle to it.

◆ _logDroppedEntry()

void mongo::DeferredWriter::_logDroppedEntry ( )
private

Log number of entries dropped because of a full buffer.

Rate limited and each successful log resets the counter.

◆ _logFailure()

void mongo::DeferredWriter::_logFailure ( const Status status)
private

Log failure, but only if a certain interval has passed since the last log.

◆ _makeCollection()

Status mongo::DeferredWriter::_makeCollection ( OperationContext *  opCtx)
private

Create the backing collection if it doesn't exist.

Return whether creation succeeded.

◆ _worker()

void mongo::DeferredWriter::_worker ( InsertStatement  stmt)
private

The method that the worker thread will run.

◆ getDroppedEntries()

int64_t mongo::DeferredWriter::getDroppedEntries ( )

Get the number of dropped writes due to a full buffer since the last log.

◆ insertDocument()

bool mongo::DeferredWriter::insertDocument ( BSONObj  obj)

Deferred-insert the given object.

Returns whether the object was successfully pushed onto the in-memory buffer (not whether it was successfully added to the underlying collection). Creates the backing collection if it doesn't exist.

◆ MONGO_DISALLOW_COPYING()

mongo::DeferredWriter::MONGO_DISALLOW_COPYING ( DeferredWriter  )
private

◆ shutdown()

void mongo::DeferredWriter::shutdown ( void  )

Flush the buffer and join the worker thread.

IMPORTANT: Must be called before destruction if startup has been called.

Blocks until buffered writes complete. Must not be called repeatedly.

◆ startup()

void mongo::DeferredWriter::startup ( std::string  workerName)

Start the background worker thread writing to the given collection.

Parameters
workerNameThe name of the client associated with the worker thread.

Member Data Documentation

◆ _collectionOptions

const CollectionOptions mongo::DeferredWriter::_collectionOptions
private

The options for the collection, in case we need to create it.

◆ _droppedEntries

int64_t mongo::DeferredWriter::_droppedEntries
private

The number of deffered entries that have been dropped.

Resets when the rate-limited system log is written out.

◆ _lastLogged

TimePoint mongo::DeferredWriter::_lastLogged
private

◆ _lastLoggedDrop

TimePoint mongo::DeferredWriter::_lastLoggedDrop
private

◆ _maxNumBytes

const int64_t mongo::DeferredWriter::_maxNumBytes
private

The size limit of the in-memory buffer.

◆ _mutex

stdx::mutex mongo::DeferredWriter::_mutex
private

Guards all non-const, non-thread-safe members.

◆ _nss

const NamespaceString mongo::DeferredWriter::_nss
private

The name of the backing collection.

◆ _numBytes

int64_t mongo::DeferredWriter::_numBytes
private

The number of bytes currently in the in-memory buffer.

◆ _pool

std::unique_ptr<ThreadPool> mongo::DeferredWriter::_pool
private

The documentation for this class was generated from the following files: