![]() |
Storage Engine API
|
Provides an interface for asynchronously adding to a collection. More...
#include <deferred_writer.h>
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 |
|
private |
Time we last logged that we can't write to the underlying collection.
Ensures we don't flood the log with such entries.
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.
opts | The options to use when creating the backing collection if it doesn't exist. |
maxSize | the maximum number of bytes to store in the buffer. |
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.
|
private |
Ensure that the backing collection exists, and pass back a lock and handle to it.
|
private |
Log number of entries dropped because of a full buffer.
Rate limited and each successful log resets the counter.
Log failure, but only if a certain interval has passed since the last log.
|
private |
Create the backing collection if it doesn't exist.
Return whether creation succeeded.
|
private |
The method that the worker thread will run.
int64_t mongo::DeferredWriter::getDroppedEntries | ( | ) |
Get the number of dropped writes due to a full buffer since the last log.
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.
|
private |
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.
void mongo::DeferredWriter::startup | ( | std::string | workerName | ) |
Start the background worker thread writing to the given collection.
workerName | The name of the client associated with the worker thread. |
|
private |
The options for the collection, in case we need to create it.
|
private |
The number of deffered entries that have been dropped.
Resets when the rate-limited system log is written out.
|
private |
|
private |
|
private |
The size limit of the in-memory buffer.
|
private |
Guards all non-const, non-thread-safe members.
|
private |
The name of the backing collection.
|
private |
The number of bytes currently in the in-memory buffer.
|
private |