| builder.h | | builder.h | |
| | | | |
| skipping to change at line 249 | | skipping to change at line 249 | |
| While designed to be a variable on the stack, if you were to dynami
cally allocate one, | | While designed to be a variable on the stack, if you were to dynami
cally allocate one, | |
| nothing bad would happen. In fact in some circumstances this mig
ht make sense, say, | | nothing bad would happen. In fact in some circumstances this mig
ht make sense, say, | |
| embedded in some other object. | | embedded in some other object. | |
| */ | | */ | |
| class StackBufBuilder : public _BufBuilder<StackAllocator> { | | class StackBufBuilder : public _BufBuilder<StackAllocator> { | |
| public: | | public: | |
| StackBufBuilder() : _BufBuilder<StackAllocator>(StackAllocator::SZ)
{ } | | StackBufBuilder() : _BufBuilder<StackAllocator>(StackAllocator::SZ)
{ } | |
| void decouple(); // not allowed. not implemented. | | void decouple(); // not allowed. not implemented. | |
| }; | | }; | |
| | | | |
|
| namespace { | | | |
| #if defined(_WIN32) | | #if defined(_WIN32) | |
|
| int (*mongo_snprintf)(char *str, size_t size, const char *format, . | | #pragma push_macro("snprintf") | |
| ..) = &sprintf_s; | | #define snprintf _snprintf | |
| #else | | | |
| int (*mongo_snprintf)(char *str, size_t size, const char *format, . | | | |
| ..) = &snprintf; | | | |
| #endif | | #endif | |
|
| } | | | |
| | | | |
| /** stringstream deals with locale so this is a lot faster than std::st
ringstream for UTF8 */ | | /** stringstream deals with locale so this is a lot faster than std::st
ringstream for UTF8 */ | |
| template <typename Allocator> | | template <typename Allocator> | |
| class StringBuilderImpl { | | class StringBuilderImpl { | |
| public: | | public: | |
| static const size_t MONGO_DBL_SIZE = 3 + DBL_MANT_DIG - DBL_MIN_EXP
; | | static const size_t MONGO_DBL_SIZE = 3 + DBL_MANT_DIG - DBL_MIN_EXP
; | |
| static const size_t MONGO_S32_SIZE = 12; | | static const size_t MONGO_S32_SIZE = 12; | |
| static const size_t MONGO_U32_SIZE = 11; | | static const size_t MONGO_U32_SIZE = 11; | |
| static const size_t MONGO_S64_SIZE = 23; | | static const size_t MONGO_S64_SIZE = 23; | |
| static const size_t MONGO_U64_SIZE = 22; | | static const size_t MONGO_U64_SIZE = 22; | |
| | | | |
| skipping to change at line 303 | | skipping to change at line 300 | |
| } | | } | |
| StringBuilderImpl& operator<<( char c ) { | | StringBuilderImpl& operator<<( char c ) { | |
| _buf.grow( 1 )[0] = c; | | _buf.grow( 1 )[0] = c; | |
| return *this; | | return *this; | |
| } | | } | |
| | | | |
| void appendDoubleNice( double x ) { | | void appendDoubleNice( double x ) { | |
| const int prev = _buf.l; | | const int prev = _buf.l; | |
| const int maxSize = 32; | | const int maxSize = 32; | |
| char * start = _buf.grow( maxSize ); | | char * start = _buf.grow( maxSize ); | |
|
| int z = mongo_snprintf( start , maxSize , "%.16g" , x ); | | int z = snprintf( start , maxSize , "%.16g" , x ); | |
| verify( z >= 0 ); | | verify( z >= 0 ); | |
| verify( z < maxSize ); | | verify( z < maxSize ); | |
| _buf.l = prev + z; | | _buf.l = prev + z; | |
| if( strchr(start, '.') == 0 && strchr(start, 'E') == 0 && strch
r(start, 'N') == 0 ) { | | if( strchr(start, '.') == 0 && strchr(start, 'E') == 0 && strch
r(start, 'N') == 0 ) { | |
| write( ".0" , 2 ); | | write( ".0" , 2 ); | |
| } | | } | |
| } | | } | |
| | | | |
| void write( const char* buf, int len) { memcpy( _buf.grow( len ) ,
buf , len ); } | | void write( const char* buf, int len) { memcpy( _buf.grow( len ) ,
buf , len ); } | |
| | | | |
| | | | |
| skipping to change at line 337 | | skipping to change at line 334 | |
| private: | | private: | |
| _BufBuilder<Allocator> _buf; | | _BufBuilder<Allocator> _buf; | |
| | | | |
| // non-copyable, non-assignable | | // non-copyable, non-assignable | |
| StringBuilderImpl( const StringBuilderImpl& ); | | StringBuilderImpl( const StringBuilderImpl& ); | |
| StringBuilderImpl& operator=( const StringBuilderImpl& ); | | StringBuilderImpl& operator=( const StringBuilderImpl& ); | |
| | | | |
| template <typename T> | | template <typename T> | |
| StringBuilderImpl& SBNUM(T val,int maxSize,const char *macro) { | | StringBuilderImpl& SBNUM(T val,int maxSize,const char *macro) { | |
| int prev = _buf.l; | | int prev = _buf.l; | |
|
| int z = mongo_snprintf( _buf.grow(maxSize) , maxSize , macro ,
(val) ); | | int z = snprintf( _buf.grow(maxSize) , maxSize , macro , (val)
); | |
| verify( z >= 0 ); | | verify( z >= 0 ); | |
| verify( z < maxSize ); | | verify( z < maxSize ); | |
| _buf.l = prev + z; | | _buf.l = prev + z; | |
| return *this; | | return *this; | |
| } | | } | |
| }; | | }; | |
| | | | |
| typedef StringBuilderImpl<TrivialAllocator> StringBuilder; | | typedef StringBuilderImpl<TrivialAllocator> StringBuilder; | |
| typedef StringBuilderImpl<StackAllocator> StackStringBuilder; | | typedef StringBuilderImpl<StackAllocator> StackStringBuilder; | |
| | | | |
|
| | | #if defined(_WIN32) | |
| | | #undef snprintf | |
| | | #pragma pop_macro("snprintf") | |
| | | #endif | |
| } // namespace mongo | | } // namespace mongo | |
| | | | |
End of changes. 6 change blocks. |
| 9 lines changed or deleted | | 8 lines changed or added | |
|
| dbclient_rs.h | | dbclient_rs.h | |
| | | | |
| skipping to change at line 150 | | skipping to change at line 150 | |
| * @param preference the read mode to use | | * @param preference the read mode to use | |
| * @param tags the tags used for filtering nodes | | * @param tags the tags used for filtering nodes | |
| * @param localThresholdMillis the exclusive upper bound of ping ti
me to be | | * @param localThresholdMillis the exclusive upper bound of ping ti
me to be | |
| * considered as a local node. Local nodes are favored over non
-local | | * considered as a local node. Local nodes are favored over non
-local | |
| * nodes if multiple nodes matches the other criteria. | | * nodes if multiple nodes matches the other criteria. | |
| * @param lastHost the host used in the last successful request. Th
is is used for | | * @param lastHost the host used in the last successful request. Th
is is used for | |
| * selecting a different node as much as possible, by doing a s
imple round | | * selecting a different node as much as possible, by doing a s
imple round | |
| * robin, starting from the node next to this lastHost. This wi
ll be overwritten | | * robin, starting from the node next to this lastHost. This wi
ll be overwritten | |
| * with the newly chosen host if not empty, not primary and whe
n preference | | * with the newly chosen host if not empty, not primary and whe
n preference | |
| * is not Nearest. | | * is not Nearest. | |
|
| | | * @param isPrimarySelected out parameter that is set to true if th | |
| | | e returned host | |
| | | * is a primary. Cannot be NULL and valid only if returned host | |
| | | is not empty. | |
| * | | * | |
| * @return the host object of the node selected. If none of the nod
es are | | * @return the host object of the node selected. If none of the nod
es are | |
| * eligible, returns an empty host. | | * eligible, returns an empty host. | |
| */ | | */ | |
| static HostAndPort selectNode(const std::vector<Node>& nodes, | | static HostAndPort selectNode(const std::vector<Node>& nodes, | |
| ReadPreference preference, | | ReadPreference preference, | |
| TagSet* tags, | | TagSet* tags, | |
| int localThresholdMillis, | | int localThresholdMillis, | |
|
| HostAndPort* lastHost); | | HostAndPort* lastHost, | |
| | | bool* isPrimarySelected); | |
| | | | |
| /** | | /** | |
| * Selects the right node given the nodes to pick from and the pref
erence. This | | * Selects the right node given the nodes to pick from and the pref
erence. This | |
| * will also attempt to refresh the local view of the replica set c
onfiguration | | * will also attempt to refresh the local view of the replica set c
onfiguration | |
| * if the primary node needs to be returned but is not currently av
ailable (except | | * if the primary node needs to be returned but is not currently av
ailable (except | |
| * for ReadPrefrence_Nearest). | | * for ReadPrefrence_Nearest). | |
| * | | * | |
|
| * @param preference the read mode to use | | * @param preference the read mode to use. | |
| * @param tags the tags used for filtering nodes | | * @param tags the tags used for filtering nodes. | |
| | | * @param isPrimarySelected out parameter that is set to true if th | |
| | | e returned host | |
| | | * is a primary. Cannot be NULL and valid only if returned host | |
| | | is not empty. | |
| * | | * | |
| * @return the host object of the node selected. If none of the nod
es are | | * @return the host object of the node selected. If none of the nod
es are | |
| * eligible, returns an empty host. | | * eligible, returns an empty host. | |
| */ | | */ | |
| HostAndPort selectAndCheckNode(ReadPreference preference, | | HostAndPort selectAndCheckNode(ReadPreference preference, | |
|
| TagSet* tags); | | TagSet* tags, | |
| | | bool* isPrimarySelected); | |
| | | | |
| /** | | /** | |
| * Creates a new ReplicaSetMonitor, if it doesn't already exist. | | * Creates a new ReplicaSetMonitor, if it doesn't already exist. | |
| */ | | */ | |
| static void createIfNeeded( const string& name , const vector<HostA
ndPort>& servers ); | | static void createIfNeeded( const string& name , const vector<HostA
ndPort>& servers ); | |
| | | | |
| /** | | /** | |
| * gets a cached Monitor per name. If the monitor is not found and
createFromSeed is false, | | * gets a cached Monitor per name. If the monitor is not found and
createFromSeed is false, | |
| * it will return none. If createFromSeed is true, it will try to l
ook up the last known | | * it will return none. If createFromSeed is true, it will try to l
ook up the last known | |
| * servers list for this set and will create a new monitor using th
at as the seed list. | | * servers list for this set and will create a new monitor using th
at as the seed list. | |
| | | | |
| skipping to change at line 264 | | skipping to change at line 270 | |
| * NOTE: This function acquires the _lock mutex. | | * NOTE: This function acquires the _lock mutex. | |
| **/ | | **/ | |
| void setLocalThresholdMillis( const int millis ); | | void setLocalThresholdMillis( const int millis ); | |
| | | | |
| /** | | /** | |
| * @return true if the host is compatible with the given readPrefer
ence and tag set. | | * @return true if the host is compatible with the given readPrefer
ence and tag set. | |
| */ | | */ | |
| bool isHostCompatible(const HostAndPort& host, ReadPreference readP
reference, | | bool isHostCompatible(const HostAndPort& host, ReadPreference readP
reference, | |
| const TagSet* tagSet) const; | | const TagSet* tagSet) const; | |
| | | | |
|
| | | /** | |
| | | * Performs a quick check if at least one node is up based on the c | |
| | | ached | |
| | | * view of the set. | |
| | | * | |
| | | * @return true if any node is ok | |
| | | */ | |
| | | bool isAnyNodeOk() const; | |
| | | | |
| private: | | private: | |
| /** | | /** | |
| * This populates a list of hosts from the list of seeds (discardin
g the | | * This populates a list of hosts from the list of seeds (discardin
g the | |
| * seed list). Should only be called from within _setsLock. | | * seed list). Should only be called from within _setsLock. | |
| * @param name set name | | * @param name set name | |
| * @param servers seeds | | * @param servers seeds | |
| */ | | */ | |
| ReplicaSetMonitor( const string& name , const vector<HostAndPort>&
servers ); | | ReplicaSetMonitor( const string& name , const vector<HostAndPort>&
servers ); | |
| | | | |
| static void _remove_inlock( const string& name, bool clearSeedCache
= false ); | | static void _remove_inlock( const string& name, bool clearSeedCache
= false ); | |
| | | | |
| skipping to change at line 407 | | skipping to change at line 421 | |
| class DBClientReplicaSet : public DBClientBase { | | class DBClientReplicaSet : public DBClientBase { | |
| public: | | public: | |
| using DBClientBase::query; | | using DBClientBase::query; | |
| using DBClientBase::update; | | using DBClientBase::update; | |
| using DBClientBase::remove; | | using DBClientBase::remove; | |
| | | | |
| /** Call connect() after constructing. autoReconnect is always on f
or DBClientReplicaSet connections. */ | | /** Call connect() after constructing. autoReconnect is always on f
or DBClientReplicaSet connections. */ | |
| DBClientReplicaSet( const string& name , const vector<HostAndPort>&
servers, double so_timeout=0 ); | | DBClientReplicaSet( const string& name , const vector<HostAndPort>&
servers, double so_timeout=0 ); | |
| virtual ~DBClientReplicaSet(); | | virtual ~DBClientReplicaSet(); | |
| | | | |
|
| /** Returns false if nomember of the set were reachable, or neither | | /** | |
| is | | * Returns false if no member of the set were reachable. This objec | |
| * master, although, | | t | |
| * when false returned, you can still try to use this connection ob | | * can still be used even when false was returned as it will try to | |
| ject, it will | | * reconnect when you use it later. | |
| * try reconnects. | | | |
| */ | | */ | |
| bool connect(); | | bool connect(); | |
| | | | |
| /** Authorize. Authorizes all nodes as needed | | /** Authorize. Authorizes all nodes as needed | |
| */ | | */ | |
| virtual bool auth(const string &dbname, const string &username, con
st string &pwd, string& errmsg, bool digestPassword = true, Auth::Level * l
evel = NULL); | | virtual bool auth(const string &dbname, const string &username, con
st string &pwd, string& errmsg, bool digestPassword = true, Auth::Level * l
evel = NULL); | |
| | | | |
| /** | | /** | |
| * Logs out the connection for the given database. | | * Logs out the connection for the given database. | |
| * | | * | |
| | | | |
| skipping to change at line 549 | | skipping to change at line 563 | |
| * operation. | | * operation. | |
| */ | | */ | |
| static const size_t MAX_RETRY; | | static const size_t MAX_RETRY; | |
| | | | |
| // Throws a DBException if the monitor doesn't exist and there isn'
t a cached seed to use. | | // Throws a DBException if the monitor doesn't exist and there isn'
t a cached seed to use. | |
| ReplicaSetMonitorPtr _getMonitor() const; | | ReplicaSetMonitorPtr _getMonitor() const; | |
| | | | |
| string _setName; | | string _setName; | |
| | | | |
| HostAndPort _masterHost; | | HostAndPort _masterHost; | |
|
| scoped_ptr<DBClientConnection> _master; | | // Note: reason why this is a shared_ptr is because we want _lastSl | |
| | | aveOkConn to | |
| | | // keep a reference of the _master connection when it selected a pr | |
| | | imary node. | |
| | | // This is because the primary connection is special in mongos - it | |
| | | is the only | |
| | | // connection that is versioned. | |
| | | // WARNING: do not assign this variable (which will increment the i | |
| | | nternal ref | |
| | | // counter) to any other variable other than _lastSlaveOkConn. | |
| | | boost::shared_ptr<DBClientConnection> _master; | |
| | | | |
| // Last used host in a slaveOk query (can be a primary) | | // Last used host in a slaveOk query (can be a primary) | |
| HostAndPort _lastSlaveOkHost; | | HostAndPort _lastSlaveOkHost; | |
| // Last used connection in a slaveOk query (can be a primary) | | // Last used connection in a slaveOk query (can be a primary) | |
|
| scoped_ptr<DBClientConnection> _lastSlaveOkConn; | | boost::shared_ptr<DBClientConnection> _lastSlaveOkConn; | |
| | | | |
| double _so_timeout; | | double _so_timeout; | |
| | | | |
| /** | | /** | |
| * for storing authentication info | | * for storing authentication info | |
| * fields are exactly for DBClientConnection::auth | | * fields are exactly for DBClientConnection::auth | |
| */ | | */ | |
| struct AuthInfo { | | struct AuthInfo { | |
| // Default constructor provided only to make it compatible with
std::map::operator[] | | // Default constructor provided only to make it compatible with
std::map::operator[] | |
| AuthInfo(): digestPassword(false) { } | | AuthInfo(): digestPassword(false) { } | |
| | | | |
End of changes. 8 change blocks. |
| 12 lines changed or deleted | | 40 lines changed or added | |
|
| dbclientinterface.h | | dbclientinterface.h | |
| | | | |
| skipping to change at line 28 | | skipping to change at line 28 | |
| * limitations under the License. | | * limitations under the License. | |
| */ | | */ | |
| | | | |
| #pragma once | | #pragma once | |
| | | | |
| #include "mongo/pch.h" | | #include "mongo/pch.h" | |
| | | | |
| #include "mongo/client/authlevel.h" | | #include "mongo/client/authlevel.h" | |
| #include "mongo/client/authentication_table.h" | | #include "mongo/client/authentication_table.h" | |
| #include "mongo/db/jsobj.h" | | #include "mongo/db/jsobj.h" | |
|
| | | #include "mongo/platform/atomic_word.h" | |
| #include "mongo/util/net/message.h" | | #include "mongo/util/net/message.h" | |
| #include "mongo/util/net/message_port.h" | | #include "mongo/util/net/message_port.h" | |
| | | | |
| namespace mongo { | | namespace mongo { | |
| | | | |
| /** the query field 'options' can have these bits set: */ | | /** the query field 'options' can have these bits set: */ | |
| enum QueryOptions { | | enum QueryOptions { | |
| /** Tailable means cursor is not closed when the last data is retri
eved. rather, the cursor marks | | /** Tailable means cursor is not closed when the last data is retri
eved. rather, the cursor marks | |
| the final object's position. you can resume using the cursor la
ter, from where it was located, | | the final object's position. you can resume using the cursor la
ter, from where it was located, | |
| if more data were received. Set on dbQuery and dbGetMore. | | if more data were received. Set on dbQuery and dbGetMore. | |
| | | | |
| skipping to change at line 921 | | skipping to change at line 922 | |
| bool _haveCachedAvailableOptions; | | bool _haveCachedAvailableOptions; | |
| AuthenticationTable _authTable; | | AuthenticationTable _authTable; | |
| bool _hasAuthentication; | | bool _hasAuthentication; | |
| }; | | }; | |
| | | | |
| /** | | /** | |
| abstract class that implements the core db operations | | abstract class that implements the core db operations | |
| */ | | */ | |
| class DBClientBase : public DBClientWithCommands, public DBConnector { | | class DBClientBase : public DBClientWithCommands, public DBConnector { | |
| protected: | | protected: | |
|
| | | static AtomicInt64 ConnectionIdSequence; | |
| | | long long _connectionId; // unique connection id for this connectio | |
| | | n | |
| WriteConcern _writeConcern; | | WriteConcern _writeConcern; | |
|
| | | | |
| public: | | public: | |
| DBClientBase() { | | DBClientBase() { | |
| _writeConcern = W_NORMAL; | | _writeConcern = W_NORMAL; | |
|
| | | _connectionId = ConnectionIdSequence.fetchAndAdd(1); | |
| } | | } | |
| | | | |
|
| | | long long getConnectionId() const { return _connectionId; } | |
| | | | |
| WriteConcern getWriteConcern() const { return _writeConcern; } | | WriteConcern getWriteConcern() const { return _writeConcern; } | |
| void setWriteConcern( WriteConcern w ) { _writeConcern = w; } | | void setWriteConcern( WriteConcern w ) { _writeConcern = w; } | |
| | | | |
| /** send a query to the database. | | /** send a query to the database. | |
| @param ns namespace to query, format is <dbname>.<collectname>[.<c
ollectname>]* | | @param ns namespace to query, format is <dbname>.<collectname>[.<c
ollectname>]* | |
| @param query query to perform on the collection. this is a BSONOb
j (binary JSON) | | @param query query to perform on the collection. this is a BSONOb
j (binary JSON) | |
| You may format as | | You may format as | |
| { query: { ... }, orderby: { ... } } | | { query: { ... }, orderby: { ... } } | |
| to specify a sort order. | | to specify a sort order. | |
| @param nToReturn n to return (i.e., limit). 0 = unlimited | | @param nToReturn n to return (i.e., limit). 0 = unlimited | |
| | | | |
End of changes. 5 change blocks. |
| 1 lines changed or deleted | | 7 lines changed or added | |
|
| document_source.h | | document_source.h | |
| | | | |
| skipping to change at line 955 | | skipping to change at line 955 | |
| }; | | }; | |
| | | | |
| typedef vector<intrusive_ptr<Document> > VectorType; | | typedef vector<intrusive_ptr<Document> > VectorType; | |
| VectorType documents; | | VectorType documents; | |
| | | | |
| VectorType::iterator docIterator; | | VectorType::iterator docIterator; | |
| intrusive_ptr<Document> pCurrent; | | intrusive_ptr<Document> pCurrent; | |
| }; | | }; | |
| | | | |
| class DocumentSourceLimit : | | class DocumentSourceLimit : | |
|
| public DocumentSource { | | public SplittableDocumentSource { | |
| public: | | public: | |
| // virtuals from DocumentSource | | // virtuals from DocumentSource | |
| virtual ~DocumentSourceLimit(); | | virtual ~DocumentSourceLimit(); | |
| virtual bool eof(); | | virtual bool eof(); | |
| virtual bool advance(); | | virtual bool advance(); | |
| virtual intrusive_ptr<Document> getCurrent(); | | virtual intrusive_ptr<Document> getCurrent(); | |
| virtual const char *getSourceName() const; | | virtual const char *getSourceName() const; | |
| virtual bool coalesce(const intrusive_ptr<DocumentSource> &pNextSou
rce); | | virtual bool coalesce(const intrusive_ptr<DocumentSource> &pNextSou
rce); | |
| | | | |
| virtual GetDepsReturn getDependencies(set<string>& deps) const { | | virtual GetDepsReturn getDependencies(set<string>& deps) const { | |
| | | | |
| skipping to change at line 978 | | skipping to change at line 978 | |
| | | | |
| /** | | /** | |
| Create a new limiting DocumentSource. | | Create a new limiting DocumentSource. | |
| | | | |
| @param pExpCtx the expression context for the pipeline | | @param pExpCtx the expression context for the pipeline | |
| @returns the DocumentSource | | @returns the DocumentSource | |
| */ | | */ | |
| static intrusive_ptr<DocumentSourceLimit> create( | | static intrusive_ptr<DocumentSourceLimit> create( | |
| const intrusive_ptr<ExpressionContext> &pExpCtx); | | const intrusive_ptr<ExpressionContext> &pExpCtx); | |
| | | | |
|
| | | // Virtuals for SplittableDocumentSource | |
| | | // Need to run on rounter. Running on shard as well is an optimizat | |
| | | ion. | |
| | | virtual intrusive_ptr<DocumentSource> getShardSource() { return thi | |
| | | s; } | |
| | | virtual intrusive_ptr<DocumentSource> getRouterSource() { return th | |
| | | is; } | |
| | | | |
| | | long long getLimit() const { return limit; } | |
| | | void setLimit(long long newLimit) { limit = newLimit; } | |
| | | | |
| /** | | /** | |
| Create a limiting DocumentSource from BSON. | | Create a limiting DocumentSource from BSON. | |
| | | | |
| This is a convenience method that uses the above, and operates on | | This is a convenience method that uses the above, and operates on | |
| a BSONElement that has been deteremined to be an Object with an | | a BSONElement that has been deteremined to be an Object with an | |
| element named $limit. | | element named $limit. | |
| | | | |
| @param pBsonElement the BSONELement that defines the limit | | @param pBsonElement the BSONELement that defines the limit | |
| @param pExpCtx the expression context | | @param pExpCtx the expression context | |
| @returns the grouping DocumentSource | | @returns the grouping DocumentSource | |
| | | | |
| skipping to change at line 1009 | | skipping to change at line 1017 | |
| private: | | private: | |
| DocumentSourceLimit( | | DocumentSourceLimit( | |
| const intrusive_ptr<ExpressionContext> &pExpCtx); | | const intrusive_ptr<ExpressionContext> &pExpCtx); | |
| | | | |
| long long limit; | | long long limit; | |
| long long count; | | long long count; | |
| intrusive_ptr<Document> pCurrent; | | intrusive_ptr<Document> pCurrent; | |
| }; | | }; | |
| | | | |
| class DocumentSourceSkip : | | class DocumentSourceSkip : | |
|
| public DocumentSource { | | public SplittableDocumentSource { | |
| public: | | public: | |
| // virtuals from DocumentSource | | // virtuals from DocumentSource | |
| virtual ~DocumentSourceSkip(); | | virtual ~DocumentSourceSkip(); | |
| virtual bool eof(); | | virtual bool eof(); | |
| virtual bool advance(); | | virtual bool advance(); | |
| virtual intrusive_ptr<Document> getCurrent(); | | virtual intrusive_ptr<Document> getCurrent(); | |
| virtual const char *getSourceName() const; | | virtual const char *getSourceName() const; | |
| virtual bool coalesce(const intrusive_ptr<DocumentSource> &pNextSou
rce); | | virtual bool coalesce(const intrusive_ptr<DocumentSource> &pNextSou
rce); | |
| | | | |
| virtual GetDepsReturn getDependencies(set<string>& deps) const { | | virtual GetDepsReturn getDependencies(set<string>& deps) const { | |
| | | | |
| skipping to change at line 1032 | | skipping to change at line 1040 | |
| | | | |
| /** | | /** | |
| Create a new skipping DocumentSource. | | Create a new skipping DocumentSource. | |
| | | | |
| @param pExpCtx the expression context | | @param pExpCtx the expression context | |
| @returns the DocumentSource | | @returns the DocumentSource | |
| */ | | */ | |
| static intrusive_ptr<DocumentSourceSkip> create( | | static intrusive_ptr<DocumentSourceSkip> create( | |
| const intrusive_ptr<ExpressionContext> &pExpCtx); | | const intrusive_ptr<ExpressionContext> &pExpCtx); | |
| | | | |
|
| | | // Virtuals for SplittableDocumentSource | |
| | | // Need to run on rounter. Can't run on shards. | |
| | | virtual intrusive_ptr<DocumentSource> getShardSource() { return NUL | |
| | | L; } | |
| | | virtual intrusive_ptr<DocumentSource> getRouterSource() { return th | |
| | | is; } | |
| | | | |
| | | long long getSkip() const { return skip; } | |
| | | void setSkip(long long newSkip) { skip = newSkip; } | |
| | | | |
| /** | | /** | |
| Create a skipping DocumentSource from BSON. | | Create a skipping DocumentSource from BSON. | |
| | | | |
| This is a convenience method that uses the above, and operates on | | This is a convenience method that uses the above, and operates on | |
| a BSONElement that has been deteremined to be an Object with an | | a BSONElement that has been deteremined to be an Object with an | |
| element named $skip. | | element named $skip. | |
| | | | |
| @param pBsonElement the BSONELement that defines the skip | | @param pBsonElement the BSONELement that defines the skip | |
| @param pExpCtx the expression context | | @param pExpCtx the expression context | |
| @returns the grouping DocumentSource | | @returns the grouping DocumentSource | |
| | | | |
End of changes. 4 change blocks. |
| 2 lines changed or deleted | | 23 lines changed or added | |
|
| pdfile.h | | pdfile.h | |
| | | | |
| skipping to change at line 317 | | skipping to change at line 317 | |
| }; | | }; | |
| | | | |
| /* extents are datafile regions where all the records within the region | | /* extents are datafile regions where all the records within the region | |
| belong to the same namespace. | | belong to the same namespace. | |
| | | | |
| (11:12:35 AM) dm10gen: when the extent is allocated, all its empty spac
e is stuck into one big DeletedRecord | | (11:12:35 AM) dm10gen: when the extent is allocated, all its empty spac
e is stuck into one big DeletedRecord | |
| (11:12:55 AM) dm10gen: and that is placed on the free list | | (11:12:55 AM) dm10gen: and that is placed on the free list | |
| */ | | */ | |
| class Extent { | | class Extent { | |
| public: | | public: | |
|
| | | enum { extentSignature = 0x41424344 }; | |
| unsigned magic; | | unsigned magic; | |
| DiskLoc myLoc; | | DiskLoc myLoc; | |
| DiskLoc xnext, xprev; /* next/prev extent for this namespace */ | | DiskLoc xnext, xprev; /* next/prev extent for this namespace */ | |
| | | | |
| /* which namespace this extent is for. this is just for troublesho
oting really | | /* which namespace this extent is for. this is just for troublesho
oting really | |
| and won't even be correct if the collection were renamed! | | and won't even be correct if the collection were renamed! | |
| */ | | */ | |
| Namespace nsDiagnostic; | | Namespace nsDiagnostic; | |
| | | | |
| int length; /* size of the extent, including these fields */ | | int length; /* size of the extent, including these fields */ | |
| DiskLoc firstRecord; | | DiskLoc firstRecord; | |
| DiskLoc lastRecord; | | DiskLoc lastRecord; | |
| char _extentData[4]; | | char _extentData[4]; | |
| | | | |
| static int HeaderSize() { return sizeof(Extent)-4; } | | static int HeaderSize() { return sizeof(Extent)-4; } | |
| | | | |
|
| bool validates() { | | bool validates(const DiskLoc diskLoc, BSONArrayBuilder* errors = NU | |
| return !(firstRecord.isNull() ^ lastRecord.isNull()) && | | LL); | |
| length >= 0 && !myLoc.isNull(); | | | |
| } | | | |
| | | | |
| BSONObj dump() { | | BSONObj dump() { | |
| return BSON( "loc" << myLoc.toString() << "xnext" << xnext.toSt
ring() << "xprev" << xprev.toString() | | return BSON( "loc" << myLoc.toString() << "xnext" << xnext.toSt
ring() << "xprev" << xprev.toString() | |
| << "nsdiag" << nsDiagnostic.toString() | | << "nsdiag" << nsDiagnostic.toString() | |
| << "size" << length << "firstRecord" << firstRecord.t
oString() << "lastRecord" << lastRecord.toString()); | | << "size" << length << "firstRecord" << firstRecord.t
oString() << "lastRecord" << lastRecord.toString()); | |
| } | | } | |
| | | | |
| void dump(iostream& s) { | | void dump(iostream& s) { | |
| s << " loc:" << myLoc.toString() << " xnext:" << xnext.toStr
ing() << " xprev:" << xprev.toString() << '\n'; | | s << " loc:" << myLoc.toString() << " xnext:" << xnext.toStr
ing() << " xprev:" << xprev.toString() << '\n'; | |
| s << " nsdiag:" << nsDiagnostic.toString() << '\n'; | | s << " nsdiag:" << nsDiagnostic.toString() << '\n'; | |
| | | | |
| skipping to change at line 359 | | skipping to change at line 357 | |
| | | | |
| /* assumes already zeroed -- insufficient for block 'reuse' perhaps | | /* assumes already zeroed -- insufficient for block 'reuse' perhaps | |
| Returns a DeletedRecord location which is the data in the extent re
ady for us. | | Returns a DeletedRecord location which is the data in the extent re
ady for us. | |
| Caller will need to add that to the freelist structure in namespace
detail. | | Caller will need to add that to the freelist structure in namespace
detail. | |
| */ | | */ | |
| DiskLoc init(const char *nsname, int _length, int _fileNo, int _off
set, bool capped); | | DiskLoc init(const char *nsname, int _length, int _fileNo, int _off
set, bool capped); | |
| | | | |
| /* like init(), but for a reuse case */ | | /* like init(), but for a reuse case */ | |
| DiskLoc reuse(const char *nsname, bool newUseIsAsCapped); | | DiskLoc reuse(const char *nsname, bool newUseIsAsCapped); | |
| | | | |
|
| bool isOk() const { return magic == 0x41424344; } | | bool isOk() const { return magic == extentSignature; } | |
| void assertOk() const { verify(isOk()); } | | void assertOk() const { verify(isOk()); } | |
| | | | |
| Record* newRecord(int len); | | Record* newRecord(int len); | |
| | | | |
| Record* getRecord(DiskLoc dl) { | | Record* getRecord(DiskLoc dl) { | |
| verify( !dl.isNull() ); | | verify( !dl.isNull() ); | |
| verify( dl.sameFile(myLoc) ); | | verify( dl.sameFile(myLoc) ); | |
| int x = dl.getOfs() - myLoc.getOfs(); | | int x = dl.getOfs() - myLoc.getOfs(); | |
| verify( x > 0 ); | | verify( x > 0 ); | |
| return (Record *) (((char *) this) + x); | | return (Record *) (((char *) this) + x); | |
| | | | |
End of changes. 3 change blocks. |
| 5 lines changed or deleted | | 4 lines changed or added | |
|
| rs_config.h | | rs_config.h | |
| | | | |
| skipping to change at line 39 | | skipping to change at line 39 | |
| class Member; | | class Member; | |
| const string rsConfigNs = "local.system.replset"; | | const string rsConfigNs = "local.system.replset"; | |
| | | | |
| class ReplSetConfig { | | class ReplSetConfig { | |
| enum { EMPTYCONFIG = -2 }; | | enum { EMPTYCONFIG = -2 }; | |
| struct TagSubgroup; | | struct TagSubgroup; | |
| | | | |
| // Protects _groups. | | // Protects _groups. | |
| static mongo::mutex groupMx; | | static mongo::mutex groupMx; | |
| public: | | public: | |
|
| | | ReplSetConfig(); | |
| /** | | /** | |
| * This contacts the given host and tries to get a config from them
. | | * This contacts the given host and tries to get a config from them
. | |
| * | | * | |
| * This sends a test heartbeat to the host and, if all goes well an
d the | | * This sends a test heartbeat to the host and, if all goes well an
d the | |
| * host has a more recent config, fetches the config and loads it (
see | | * host has a more recent config, fetches the config and loads it (
see | |
| * from(). | | * from(). | |
| * | | * | |
| * If it's contacting itself, it skips the heartbeat (for obvious | | * If it's contacting itself, it skips the heartbeat (for obvious | |
| * reasons.) If something is misconfigured, throws an exception. If
the | | * reasons.) If something is misconfigured, throws an exception. If
the | |
| * host couldn't be queried or is just blank, ok() will be false. | | * host couldn't be queried or is just blank, ok() will be false. | |
| | | | |
| skipping to change at line 156 | | skipping to change at line 157 | |
| * members.size()/2+1, but can be the number of non-arbiter members
if | | * members.size()/2+1, but can be the number of non-arbiter members
if | |
| * there are more arbiters than non-arbiters (writing to 3 out of 7 | | * there are more arbiters than non-arbiters (writing to 3 out of 7 | |
| * servers is safe if 4 of the servers are arbiters). | | * servers is safe if 4 of the servers are arbiters). | |
| */ | | */ | |
| private: | | private: | |
| void setMajority(); | | void setMajority(); | |
| public: | | public: | |
| int getMajority() const; | | int getMajority() const; | |
| | | | |
| bool _constructed; | | bool _constructed; | |
|
| | | | |
| | | /** | |
| | | * Returns if replication chaining is allowed. | |
| | | */ | |
| | | bool chainingAllowed() const; | |
| | | | |
| private: | | private: | |
| bool _ok; | | bool _ok; | |
|
| | | | |
| | | /** | |
| | | * If replication can be chained. If chaining is disallowed, it can | |
| | | still be explicitly | |
| | | * enabled via the replSetSyncFrom command, but it will not happen | |
| | | automatically. | |
| | | */ | |
| | | bool _chainingAllowed; | |
| int _majority; | | int _majority; | |
| | | | |
| void from(BSONObj); | | void from(BSONObj); | |
| void clear(); | | void clear(); | |
| | | | |
| struct TagClause; | | struct TagClause; | |
| | | | |
| /** | | /** | |
| * This is a logical grouping of servers. It is pointed to by a se
t of | | * This is a logical grouping of servers. It is pointed to by a se
t of | |
| * servers with a certain tag. | | * servers with a certain tag. | |
| | | | |
End of changes. 3 change blocks. |
| 0 lines changed or deleted | | 15 lines changed or added | |
|