diff options
Diffstat (limited to 'src/mongo/transport/service_state_machine.cpp')
-rw-r--r-- | src/mongo/transport/service_state_machine.cpp | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/mongo/transport/service_state_machine.cpp b/src/mongo/transport/service_state_machine.cpp index ebcad102106..8e751d9327c 100644 --- a/src/mongo/transport/service_state_machine.cpp +++ b/src/mongo/transport/service_state_machine.cpp @@ -140,14 +140,23 @@ Message makeExhaustMessage(Message requestMsg, DbResponse* dbresponse) { return Message(); } - // Indicate that the response is part of an exhaust stream. + const bool checksumPresent = OpMsg::isFlagSet(requestMsg, OpMsg::kChecksumPresent); + OpMsg::removeChecksum(&dbresponse->response); + // Indicate that the response is part of an exhaust stream. Re-checksum if needed. OpMsg::setFlag(&dbresponse->response, OpMsg::kMoreToCome); + if (checksumPresent) { + OpMsg::appendChecksum(&dbresponse->response); + } // Return an augmented form of the initial request, which is to be used as the next request to // be processed by the database. The id of the response is used as the request id of this - // 'synthetic' request. + // 'synthetic' request. Re-checksum if needed. + OpMsg::removeChecksum(&requestMsg); requestMsg.header().setId(dbresponse->response.header().getId()); requestMsg.header().setResponseToMsgId(dbresponse->response.header().getResponseToMsgId()); + if (checksumPresent) { + OpMsg::appendChecksum(&requestMsg); + } return requestMsg; } @@ -454,10 +463,14 @@ void ServiceStateMachine::_processMessage(ThreadGuard guard) { Message& toSink = dbresponse.response; if (!toSink.empty()) { invariant(!OpMsg::isFlagSet(_inMessage, OpMsg::kMoreToCome)); + invariant(!OpMsg::isFlagSet(toSink, OpMsg::kChecksumPresent)); // Update the header for the response message. toSink.header().setId(nextMessageId()); toSink.header().setResponseToMsgId(_inMessage.header().getId()); + if (OpMsg::isFlagSet(_inMessage, OpMsg::kChecksumPresent)) { + OpMsg::appendChecksum(&toSink); + } // If the incoming message has the exhaust flag set and is a 'getMore' command, then we // bypass the normal RPC behavior. We will sink the response to the network, but we also |