Status getWriteConcernStatusFromCommandResult(const BSONObj& obj) { BSONElement wcErrorElem; Status status = bsonExtractTypedField(obj, kCmdResponseWriteConcernField, Object, &wcErrorElem); if (!status.isOK()) { if (status == ErrorCodes::NoSuchKey) { return Status::OK(); } else { return status; } } BSONObj wcErrObj(wcErrorElem.Obj()); WriteConcernErrorDetail wcError; std::string wcErrorParseMsg; if (!wcError.parseBSON(wcErrObj, &wcErrorParseMsg)) { return Status(ErrorCodes::UnsupportedFormat, str::stream() << "Failed to parse write concern section due to " << wcErrorParseMsg); } std::string wcErrorInvalidMsg; if (!wcError.isValid(&wcErrorInvalidMsg)) { return Status(ErrorCodes::UnsupportedFormat, str::stream() << "Failed to parse write concern section due to " << wcErrorInvalidMsg); } return wcError.toStatus(); }
void CommandHelpers::appendCommandWCStatus(BSONObjBuilder& result, const Status& awaitReplicationStatus, const WriteConcernResult& wcResult) { if (!awaitReplicationStatus.isOK() && !result.hasField("writeConcernError")) { WriteConcernErrorDetail wcError; wcError.setStatus(awaitReplicationStatus); if (wcResult.wTimedOut) { wcError.setErrInfo(BSON("wtimeout" << true)); } result.append("writeConcernError", wcError.toBSON()); } }
void appendWriteConcernErrorToCmdResponse(const std::string& shardID, const BSONElement& wcErrorElem, BSONObjBuilder& responseBuilder) { WriteConcernErrorDetail wcError; std::string errMsg; auto wcErrorObj = wcErrorElem.Obj(); if (!wcError.parseBSON(wcErrorObj, &errMsg)) { wcError.setErrMessage("Failed to parse writeConcernError: " + wcErrorObj.toString() + ", Received error: " + errMsg); } wcError.setErrMessage(wcError.getErrMessage() + " at " + shardID); responseBuilder.append("writeConcernError", wcError.toBSON()); }
void appendWriteConcernErrorToCmdResponse(const ShardId& shardId, const BSONElement& wcErrorElem, BSONObjBuilder& responseBuilder) { WriteConcernErrorDetail wcError; std::string errMsg; auto wcErrorObj = wcErrorElem.Obj(); if (!wcError.parseBSON(wcErrorObj, &errMsg)) { wcError.clear(); wcError.setStatus({ErrorCodes::FailedToParse, "Failed to parse writeConcernError: " + wcErrorObj.toString() + ", Received error: " + errMsg}); } auto status = wcError.toStatus(); wcError.setStatus( status.withReason(str::stream() << status.reason() << " at " << shardId.toString())); responseBuilder.append("writeConcernError", wcError.toBSON()); }