summaryrefslogtreecommitdiff
path: root/src/mongo/rpc/legacy_request_builder.cpp
diff options
context:
space:
mode:
authorAdam Midvidy <amidvidy@gmail.com>2015-09-18 15:50:57 -0400
committerAdam Midvidy <amidvidy@gmail.com>2015-09-19 12:14:11 -0400
commit700d6428cd9a5f83fba3a36acb262641e9d4ae03 (patch)
tree90e5eaee13f070723ba3f16b6816959a1d78e81e /src/mongo/rpc/legacy_request_builder.cpp
parent37b328aeda5696ff21c86b1258708fe5bede3a16 (diff)
downloadmongo-700d6428cd9a5f83fba3a36acb262641e9d4ae03.tar.gz
SERVER-19057 avoid extra buffer copy when creating message in rpc builders
Diffstat (limited to 'src/mongo/rpc/legacy_request_builder.cpp')
-rw-r--r--src/mongo/rpc/legacy_request_builder.cpp13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/mongo/rpc/legacy_request_builder.cpp b/src/mongo/rpc/legacy_request_builder.cpp
index 05f1fe79ce3..db333dc4c6a 100644
--- a/src/mongo/rpc/legacy_request_builder.cpp
+++ b/src/mongo/rpc/legacy_request_builder.cpp
@@ -37,16 +37,19 @@
#include "mongo/rpc/metadata.h"
#include "mongo/stdx/memory.h"
#include "mongo/util/assert_util.h"
+#include "mongo/util/net/message.h"
namespace mongo {
namespace rpc {
-LegacyRequestBuilder::LegacyRequestBuilder() : _message{stdx::make_unique<Message>()} {}
+LegacyRequestBuilder::LegacyRequestBuilder() : LegacyRequestBuilder(stdx::make_unique<Message>()) {}
LegacyRequestBuilder::~LegacyRequestBuilder() {}
LegacyRequestBuilder::LegacyRequestBuilder(std::unique_ptr<Message> message)
- : _message{std::move(message)} {}
+ : _message{std::move(message)} {
+ _builder.skip(mongo::MsgData::MsgDataHeaderSize);
+}
LegacyRequestBuilder& LegacyRequestBuilder::setDatabase(StringData database) {
invariant(_state == State::kDatabase);
@@ -110,7 +113,11 @@ Protocol LegacyRequestBuilder::getProtocol() const {
std::unique_ptr<Message> LegacyRequestBuilder::done() {
invariant(_state == State::kInputDocs);
- _message->setData(dbQuery, _builder.buf(), _builder.len());
+ MsgData::View msg = _builder.buf();
+ msg.setLen(_builder.len());
+ msg.setOperation(dbQuery);
+ _builder.decouple(); // release ownership from BufBuilder
+ _message->setData(msg.view2ptr(), true); // transfer ownership to Message
_state = State::kDone;
return std::move(_message);
}