LegacyReplyBuilder& LegacyReplyBuilder::setCommandReply(Status nonOKStatus, BSONObj extraErrorInfo) { invariant(!_haveCommandReply); if (nonOKStatus == ErrorCodes::StaleConfig) { _staleConfigError = true; // Need to use the special $err format for StaleConfig errors to be backwards // compatible. BSONObjBuilder err; // $err must be the first field in object. err.append("$err", nonOKStatus.reason()); err.append("code", nonOKStatus.code()); auto const scex = nonOKStatus.extraInfo<StaleConfigInfo>(); scex->serialize(&err); err.appendElements(extraErrorInfo); setRawCommandReply(err.done()); } else { // All other errors proceed through the normal path, which also handles state transitions. ReplyBuilderInterface::setCommandReply(std::move(nonOKStatus), std::move(extraErrorInfo)); } return *this; }
ReplyBuilderInterface& ReplyBuilderInterface::setCommandReply(Status nonOKStatus, const BSONObj& extraErrorInfo) { invariant(!nonOKStatus.isOK()); return setRawCommandReply(augmentReplyWithStatus(nonOKStatus, extraErrorInfo)); }
ReplyBuilderInterface& ReplyBuilderInterface::setCommandReply(StatusWith<BSONObj> commandReply) { auto reply = commandReply.isOK() ? std::move(commandReply.getValue()) : BSONObj(); return setRawCommandReply(augmentReplyWithStatus(commandReply.getStatus(), reply)); }