diff options
author | Adam Midvidy <amidvidy@gmail.com> | 2015-09-18 15:50:57 -0400 |
---|---|---|
committer | Adam Midvidy <amidvidy@gmail.com> | 2015-09-19 12:14:11 -0400 |
commit | 700d6428cd9a5f83fba3a36acb262641e9d4ae03 (patch) | |
tree | 90e5eaee13f070723ba3f16b6816959a1d78e81e /src/mongo/rpc/legacy_request_builder.cpp | |
parent | 37b328aeda5696ff21c86b1258708fe5bede3a16 (diff) | |
download | mongo-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.cpp | 13 |
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); } |