@@ -47,20 +47,19 @@ using std::vector;
47
47
48
48
namespace mongo {
49
49
50
- MockRemoteDBServer::CircularBSONIterator::CircularBSONIterator (const vector<BSONObj>& replyVector) {
51
- for (std::vector<mongo::BSONObj>::const_iterator iter = replyVector.begin ();
52
- iter != replyVector.end ();
53
- ++iter) {
54
- _replyObjs.push_back (iter->copy ());
50
+ MockRemoteDBServer::CircularBSONIterator::CircularBSONIterator (
51
+ const vector<StatusWith<BSONObj>>& replyVector) {
52
+ for (auto iter = replyVector.begin (); iter != replyVector.end (); ++iter) {
53
+ _replyObjs.push_back (iter->isOK () ? StatusWith (iter->getValue ().copy ()) : *iter);
55
54
}
56
55
57
56
_iter = _replyObjs.begin ();
58
57
}
59
58
60
- BSONObj MockRemoteDBServer::CircularBSONIterator::next () {
59
+ StatusWith< BSONObj> MockRemoteDBServer::CircularBSONIterator::next () {
61
60
verify (_iter != _replyObjs.end ());
62
61
63
- BSONObj reply = _iter->copy ();
62
+ StatusWith< BSONObj> reply = _iter->isOK () ? StatusWith (_iter-> getValue (). copy ()) : *_iter ;
64
63
++_iter;
65
64
66
65
if (_iter == _replyObjs.end ()) {
@@ -109,14 +108,15 @@ bool MockRemoteDBServer::isRunning() const {
109
108
return _isRunning;
110
109
}
111
110
112
- void MockRemoteDBServer::setCommandReply (const string& cmdName, const mongo::BSONObj& replyObj) {
113
- vector<BSONObj> replySequence;
111
+ void MockRemoteDBServer::setCommandReply (const string& cmdName,
112
+ const StatusWith<mongo::BSONObj>& replyObj) {
113
+ vector<StatusWith<BSONObj>> replySequence;
114
114
replySequence.push_back (replyObj);
115
115
setCommandReply (cmdName, replySequence);
116
116
}
117
117
118
118
void MockRemoteDBServer::setCommandReply (const string& cmdName,
119
- const vector<BSONObj>& replySequence) {
119
+ const vector<StatusWith< BSONObj> >& replySequence) {
120
120
scoped_spinlock sLock (_lock);
121
121
_cmdMap[cmdName].reset (new CircularBSONIterator (replySequence));
122
122
}
@@ -146,16 +146,15 @@ rpc::UniqueReply MockRemoteDBServer::runCommand(InstanceID id, const OpMsgReques
146
146
checkIfUp (id);
147
147
std::string cmdName = request.getCommandName ().toString ();
148
148
149
- BSONObj reply;
150
- {
149
+ StatusWith<BSONObj> reply ([this , &cmdName] {
151
150
scoped_spinlock lk (_lock);
152
151
153
152
uassert (ErrorCodes::IllegalOperation,
154
153
str::stream () << " no reply for command: " << cmdName,
155
154
_cmdMap.count (cmdName));
156
155
157
- reply = _cmdMap[cmdName]->next ();
158
- }
156
+ return _cmdMap[cmdName]->next ();
157
+ }());
159
158
160
159
if (_delayMilliSec > 0 ) {
161
160
mongo::sleepmillis (_delayMilliSec);
0 commit comments