diff options
Diffstat (limited to 'src/mongo/s/type_locks.h')
-rw-r--r-- | src/mongo/s/type_locks.h | 431 |
1 files changed, 223 insertions, 208 deletions
diff --git a/src/mongo/s/type_locks.h b/src/mongo/s/type_locks.h index 3eb6c3f86dd..e77da7c188c 100644 --- a/src/mongo/s/type_locks.h +++ b/src/mongo/s/type_locks.h @@ -35,226 +35,241 @@ namespace mongo { - /** - * This class represents the layout and contents of documents contained in the - * config.locks collection. All manipulation of documents coming from that - * collection should be done with this class. - * - * Usage Example: - * - * // Contact the config. 'conn' has been obtained before. - * DBClientBase* conn; - * BSONObj query = QUERY(LocksType::exampleField("exampleFieldName")); - * exampleDoc = conn->findOne(LocksType::ConfigNS, query); - * - * // Process the response. - * LocksType exampleType; - * std::string errMsg; - * if (!exampleType.parseBSON(exampleDoc, &errMsg) || !exampleType.isValid(&errMsg)) { - * // Can't use 'exampleType'. Take action. - * } - * // use 'exampleType' - * - */ - class LocksType { - public: - - enum State { - UNLOCKED = 0, - LOCK_PREP, // Only for legacy 3 config servers. - LOCKED, - }; - - // - // schema declarations - // - - // Name of the locks collection in the config server. - static const std::string ConfigNS; - - // Field names and types in the locks collection type. - static const BSONField<std::string> name; - static const BSONField<int> state; - static const BSONField<std::string> process; - static const BSONField<OID> lockID; - static const BSONField<std::string> who; - static const BSONField<std::string> why; - static const BSONField<Date_t> when; - - // - // locks type methods - // - - LocksType(); - ~LocksType(); - - /** - * Returns true if all the mandatory fields are present and have valid - * representations. Otherwise returns false and fills in the optional 'errMsg' string. - */ - bool isValid(std::string* errMsg) const; - - /** - * Returns the BSON representation of the entry. - */ - BSONObj toBSON() const; - - /** - * Clears and populates the internal state using the 'source' BSON object if the - * latter contains valid values. Otherwise sets errMsg and returns false. - */ - bool parseBSON(const BSONObj& source, std::string* errMsg); - - /** - * Clears the internal state. - */ - void clear(); - - /** - * Copies all the fields present in 'this' to 'other'. - */ - void cloneTo(LocksType* other) const; - - /** - * Returns a std::string representation of the current internal state. - */ - std::string toString() const; - - // - // individual field accessors - // - - // Mandatory Fields - void setName(StringData name) { - _name = name.toString(); - _isNameSet = true; - } - - void unsetName() { _isNameSet = false; } - - bool isNameSet() const { return _isNameSet; } - - // Calling get*() methods when the member is not set results in undefined behavior - const std::string getName() const { - dassert(_isNameSet); - return _name; - } - - void setState(const int state) { - _state = state; - _isStateSet = true; - } - - void unsetState() { _isStateSet = false; } - - bool isStateSet() const { return _isStateSet; } +/** + * This class represents the layout and contents of documents contained in the + * config.locks collection. All manipulation of documents coming from that + * collection should be done with this class. + * + * Usage Example: + * + * // Contact the config. 'conn' has been obtained before. + * DBClientBase* conn; + * BSONObj query = QUERY(LocksType::exampleField("exampleFieldName")); + * exampleDoc = conn->findOne(LocksType::ConfigNS, query); + * + * // Process the response. + * LocksType exampleType; + * std::string errMsg; + * if (!exampleType.parseBSON(exampleDoc, &errMsg) || !exampleType.isValid(&errMsg)) { + * // Can't use 'exampleType'. Take action. + * } + * // use 'exampleType' + * + */ +class LocksType { +public: + enum State { + UNLOCKED = 0, + LOCK_PREP, // Only for legacy 3 config servers. + LOCKED, + }; - // Calling get*() methods when the member is not set results in undefined behavior - int getState() const { - dassert(_isStateSet); - return _state; - } + // + // schema declarations + // - // Optional Fields - void setProcess(StringData process) { - _process = process.toString(); - _isProcessSet = true; - } + // Name of the locks collection in the config server. + static const std::string ConfigNS; - void unsetProcess() { _isProcessSet = false; } + // Field names and types in the locks collection type. + static const BSONField<std::string> name; + static const BSONField<int> state; + static const BSONField<std::string> process; + static const BSONField<OID> lockID; + static const BSONField<std::string> who; + static const BSONField<std::string> why; + static const BSONField<Date_t> when; - bool isProcessSet() const { - return _isProcessSet || process.hasDefault(); - } + // + // locks type methods + // - // Calling get*() methods when the member is not set and has no default results in undefined - // behavior - std::string getProcess() const { - if (_isProcessSet) { - return _process; - } else { - dassert(process.hasDefault()); - return process.getDefault(); - } - } - void setLockID(OID lockID) { - _lockID = lockID; - _isLockIDSet = true; - } + LocksType(); + ~LocksType(); - void unsetLockID() { _isLockIDSet = false; } + /** + * Returns true if all the mandatory fields are present and have valid + * representations. Otherwise returns false and fills in the optional 'errMsg' string. + */ + bool isValid(std::string* errMsg) const; - bool isLockIDSet() const { - return _isLockIDSet || lockID.hasDefault(); - } + /** + * Returns the BSON representation of the entry. + */ + BSONObj toBSON() const; - // Calling get*() methods when the member is not set and has no default results in undefined - // behavior - OID getLockID() const { - if (_isLockIDSet) { - return _lockID; - } else { - dassert(lockID.hasDefault()); - return lockID.getDefault(); - } - } - void setWho(StringData who) { - _who = who.toString(); - _isWhoSet = true; - } + /** + * Clears and populates the internal state using the 'source' BSON object if the + * latter contains valid values. Otherwise sets errMsg and returns false. + */ + bool parseBSON(const BSONObj& source, std::string* errMsg); - void unsetWho() { _isWhoSet = false; } + /** + * Clears the internal state. + */ + void clear(); - bool isWhoSet() const { - return _isWhoSet || who.hasDefault(); - } + /** + * Copies all the fields present in 'this' to 'other'. + */ + void cloneTo(LocksType* other) const; - // Calling get*() methods when the member is not set and has no default results in undefined - // behavior - std::string getWho() const { - if (_isWhoSet) { - return _who; - } else { - dassert(who.hasDefault()); - return who.getDefault(); - } + /** + * Returns a std::string representation of the current internal state. + */ + std::string toString() const; + + // + // individual field accessors + // + + // Mandatory Fields + void setName(StringData name) { + _name = name.toString(); + _isNameSet = true; + } + + void unsetName() { + _isNameSet = false; + } + + bool isNameSet() const { + return _isNameSet; + } + + // Calling get*() methods when the member is not set results in undefined behavior + const std::string getName() const { + dassert(_isNameSet); + return _name; + } + + void setState(const int state) { + _state = state; + _isStateSet = true; + } + + void unsetState() { + _isStateSet = false; + } + + bool isStateSet() const { + return _isStateSet; + } + + // Calling get*() methods when the member is not set results in undefined behavior + int getState() const { + dassert(_isStateSet); + return _state; + } + + // Optional Fields + void setProcess(StringData process) { + _process = process.toString(); + _isProcessSet = true; + } + + void unsetProcess() { + _isProcessSet = false; + } + + bool isProcessSet() const { + return _isProcessSet || process.hasDefault(); + } + + // Calling get*() methods when the member is not set and has no default results in undefined + // behavior + std::string getProcess() const { + if (_isProcessSet) { + return _process; + } else { + dassert(process.hasDefault()); + return process.getDefault(); } - void setWhy(StringData why) { - _why = why.toString(); - _isWhySet = true; + } + void setLockID(OID lockID) { + _lockID = lockID; + _isLockIDSet = true; + } + + void unsetLockID() { + _isLockIDSet = false; + } + + bool isLockIDSet() const { + return _isLockIDSet || lockID.hasDefault(); + } + + // Calling get*() methods when the member is not set and has no default results in undefined + // behavior + OID getLockID() const { + if (_isLockIDSet) { + return _lockID; + } else { + dassert(lockID.hasDefault()); + return lockID.getDefault(); } - - void unsetWhy() { _isWhySet = false; } - - bool isWhySet() const { - return _isWhySet || why.hasDefault(); + } + void setWho(StringData who) { + _who = who.toString(); + _isWhoSet = true; + } + + void unsetWho() { + _isWhoSet = false; + } + + bool isWhoSet() const { + return _isWhoSet || who.hasDefault(); + } + + // Calling get*() methods when the member is not set and has no default results in undefined + // behavior + std::string getWho() const { + if (_isWhoSet) { + return _who; + } else { + dassert(who.hasDefault()); + return who.getDefault(); } - - // Calling get*() methods when the member is not set and has no default results in undefined - // behavior - std::string getWhy() const { - if (_isWhySet) { - return _why; - } else { - dassert(why.hasDefault()); - return why.getDefault(); - } + } + void setWhy(StringData why) { + _why = why.toString(); + _isWhySet = true; + } + + void unsetWhy() { + _isWhySet = false; + } + + bool isWhySet() const { + return _isWhySet || why.hasDefault(); + } + + // Calling get*() methods when the member is not set and has no default results in undefined + // behavior + std::string getWhy() const { + if (_isWhySet) { + return _why; + } else { + dassert(why.hasDefault()); + return why.getDefault(); } - - private: - // Convention: (M)andatory, (O)ptional, (S)pecial rule. - std::string _name; // (M) name of the lock - bool _isNameSet; - int _state; // (M) 0: Unlocked | 1: Locks in contention | 2: Lock held - bool _isStateSet; - std::string _process; // (O) optional if unlocked. contains the (unique) identifier - bool _isProcessSet; - OID _lockID; // (O) optional if unlocked. a unique identifier for the instance - bool _isLockIDSet; - std::string _who; // (O) optional if unlocked. a note about why the lock is held, - bool _isWhoSet; - std::string _why; // (O) optional if unlocked. a human readable description of the - bool _isWhySet; - }; - -} // namespace mongo + } + +private: + // Convention: (M)andatory, (O)ptional, (S)pecial rule. + std::string _name; // (M) name of the lock + bool _isNameSet; + int _state; // (M) 0: Unlocked | 1: Locks in contention | 2: Lock held + bool _isStateSet; + std::string _process; // (O) optional if unlocked. contains the (unique) identifier + bool _isProcessSet; + OID _lockID; // (O) optional if unlocked. a unique identifier for the instance + bool _isLockIDSet; + std::string _who; // (O) optional if unlocked. a note about why the lock is held, + bool _isWhoSet; + std::string _why; // (O) optional if unlocked. a human readable description of the + bool _isWhySet; +}; + +} // namespace mongo |