void WriteOp::setOpError(const WriteErrorDetail& error) { dassert(_state == WriteOpState_Ready); _error.reset(new WriteErrorDetail); error.cloneTo(_error.get()); _error->setIndex(_itemRef.getItemIndex()); _state = WriteOpState_Error; // No need to updateOpState, set directly }
void WriteOp::noteWriteError(const TargetedWrite& targetedWrite, const WriteErrorDetail& error) { const WriteOpRef& ref = targetedWrite.writeOpRef; auto& childOp = _childOps[ref.second]; childOp.pendingWrite = NULL; childOp.endpoint.reset(new ShardEndpoint(targetedWrite.endpoint)); childOp.error.reset(new WriteErrorDetail); error.cloneTo(childOp.error.get()); dassert(ref.first == _itemRef.getItemIndex()); childOp.error->setIndex(_itemRef.getItemIndex()); childOp.state = WriteOpState_Error; _updateOpState(); }
static void toWriteErrorResponse(const WriteErrorDetail& error, bool ordered, int numWrites, BatchedCommandResponse* writeErrResponse) { writeErrResponse->setOk(true); writeErrResponse->setN(0); int numErrors = ordered ? 1 : numWrites; for (int i = 0; i < numErrors; i++) { unique_ptr<WriteErrorDetail> errorClone(new WriteErrorDetail); error.cloneTo(errorClone.get()); errorClone->setIndex(i); writeErrResponse->addToErrDetails(errorClone.release()); } dassert(writeErrResponse->isValid(NULL)); }