diff options
author | Adam Midvidy <amidvidy@gmail.com> | 2015-10-22 10:34:51 -0400 |
---|---|---|
committer | Adam Midvidy <amidvidy@gmail.com> | 2015-10-30 15:47:26 -0400 |
commit | 791c412874ce87d9cc1eac75edce8116a9d40640 (patch) | |
tree | cdaaeaefd1d093d88ff9a5332a68a8e440b124fa /src/mongo/rpc | |
parent | e62e2e71eff397caf22a0da13ac4669a8546b298 (diff) | |
download | mongo-791c412874ce87d9cc1eac75edce8116a9d40640.tar.gz |
SERVER-20609 do not heap allocate Message
Diffstat (limited to 'src/mongo/rpc')
-rw-r--r-- | src/mongo/rpc/command_reply_builder.cpp | 13 | ||||
-rw-r--r-- | src/mongo/rpc/command_reply_builder.h | 6 | ||||
-rw-r--r-- | src/mongo/rpc/command_reply_test.cpp | 10 | ||||
-rw-r--r-- | src/mongo/rpc/command_request_builder.cpp | 12 | ||||
-rw-r--r-- | src/mongo/rpc/command_request_builder.h | 6 | ||||
-rw-r--r-- | src/mongo/rpc/command_request_builder_test.cpp | 2 | ||||
-rw-r--r-- | src/mongo/rpc/command_request_test.cpp | 2 | ||||
-rw-r--r-- | src/mongo/rpc/legacy_reply_builder.cpp | 10 | ||||
-rw-r--r-- | src/mongo/rpc/legacy_reply_builder.h | 7 | ||||
-rw-r--r-- | src/mongo/rpc/legacy_request_builder.cpp | 11 | ||||
-rw-r--r-- | src/mongo/rpc/legacy_request_builder.h | 6 | ||||
-rw-r--r-- | src/mongo/rpc/legacy_request_test.cpp | 2 | ||||
-rw-r--r-- | src/mongo/rpc/reply_builder_interface.h | 2 | ||||
-rw-r--r-- | src/mongo/rpc/reply_builder_test.cpp | 16 | ||||
-rw-r--r-- | src/mongo/rpc/request_builder_interface.h | 2 | ||||
-rw-r--r-- | src/mongo/rpc/unique_message.h | 8 |
16 files changed, 55 insertions, 60 deletions
diff --git a/src/mongo/rpc/command_reply_builder.cpp b/src/mongo/rpc/command_reply_builder.cpp index 8bc50590333..65744efa49f 100644 --- a/src/mongo/rpc/command_reply_builder.cpp +++ b/src/mongo/rpc/command_reply_builder.cpp @@ -40,10 +40,9 @@ namespace mongo { namespace rpc { -CommandReplyBuilder::CommandReplyBuilder() : CommandReplyBuilder(stdx::make_unique<Message>()) {} +CommandReplyBuilder::CommandReplyBuilder() : CommandReplyBuilder(Message{}) {} -CommandReplyBuilder::CommandReplyBuilder(std::unique_ptr<Message> message) - : _message{std::move(message)} { +CommandReplyBuilder::CommandReplyBuilder(Message&& message) : _message{std::move(message)} { _builder.skip(mongo::MsgData::MsgDataHeaderSize); } @@ -105,17 +104,17 @@ void CommandReplyBuilder::reset() { } _builder.reset(); _builder.skip(mongo::MsgData::MsgDataHeaderSize); - _message = stdx::make_unique<Message>(); + _message.reset(); _state = State::kMetadata; } -std::unique_ptr<Message> CommandReplyBuilder::done() { +Message CommandReplyBuilder::done() { invariant(_state == State::kOutputDocs); MsgData::View msg = _builder.buf(); msg.setLen(_builder.len()); msg.setOperation(dbCommandReply); - _builder.decouple(); // release ownership from BufBuilder - _message->setData(msg.view2ptr(), true); // transfer ownership to Message + _builder.decouple(); // release ownership from BufBuilder + _message.setData(msg.view2ptr(), true); // transfer ownership to Message _state = State::kDone; return std::move(_message); } diff --git a/src/mongo/rpc/command_reply_builder.h b/src/mongo/rpc/command_reply_builder.h index 92c567f64a6..b91b335fcdc 100644 --- a/src/mongo/rpc/command_reply_builder.h +++ b/src/mongo/rpc/command_reply_builder.h @@ -54,7 +54,7 @@ public: * Constructs an OP_COMMANDREPLY in an existing buffer. Ownership of the buffer * will be transfered to the CommandReplyBuilder. */ - CommandReplyBuilder(std::unique_ptr<Message> message); + CommandReplyBuilder(Message&& message); CommandReplyBuilder& setMetadata(const BSONObj& metadata) final; CommandReplyBuilder& setRawCommandReply(const BSONObj& commandReply) final; @@ -73,7 +73,7 @@ public: * The behavior of calling any methods on the object is subsequently * undefined. */ - std::unique_ptr<Message> done() final; + Message done() final; std::size_t availableBytes() const final; @@ -86,7 +86,7 @@ private: // Default values are all empty. BufBuilder _builder{}; - std::unique_ptr<Message> _message; + Message _message; State _state{State::kMetadata}; }; diff --git a/src/mongo/rpc/command_reply_test.cpp b/src/mongo/rpc/command_reply_test.cpp index 4ace31f46d5..b5d372b42be 100644 --- a/src/mongo/rpc/command_reply_test.cpp +++ b/src/mongo/rpc/command_reply_test.cpp @@ -51,12 +51,10 @@ using std::end; class ReplyTest : public mongo::unittest::Test { protected: std::vector<char> _cmdData{}; - // using unique ptr so we can destroy and replace easily - // since message does not have operator= or swap defined... - std::unique_ptr<Message> _message{}; + Message _message{}; virtual void setUp() override { - _message = stdx::make_unique<Message>(); + _message.reset(); } virtual void tearDown() override { @@ -73,8 +71,8 @@ protected: const Message* buildMessage() { _cmdData.shrink_to_fit(); - _message->setData(dbCommandReply, _cmdData.data(), _cmdData.size()); - return _message.get(); + _message.setData(dbCommandReply, _cmdData.data(), _cmdData.size()); + return &_message; } }; diff --git a/src/mongo/rpc/command_request_builder.cpp b/src/mongo/rpc/command_request_builder.cpp index 25f67c11e7f..60a013d218f 100644 --- a/src/mongo/rpc/command_request_builder.cpp +++ b/src/mongo/rpc/command_request_builder.cpp @@ -39,13 +39,11 @@ namespace mongo { namespace rpc { -CommandRequestBuilder::CommandRequestBuilder() - : CommandRequestBuilder(stdx::make_unique<Message>()) {} +CommandRequestBuilder::CommandRequestBuilder() : CommandRequestBuilder(Message()) {} CommandRequestBuilder::~CommandRequestBuilder() {} -CommandRequestBuilder::CommandRequestBuilder(std::unique_ptr<Message> message) - : _message{std::move(message)} { +CommandRequestBuilder::CommandRequestBuilder(Message&& message) : _message{std::move(message)} { _builder.skip(mongo::MsgData::MsgDataHeaderSize); // Leave room for message header. } @@ -98,13 +96,13 @@ Protocol CommandRequestBuilder::getProtocol() const { return rpc::Protocol::kOpCommandV1; } -std::unique_ptr<Message> CommandRequestBuilder::done() { +Message CommandRequestBuilder::done() { invariant(_state == State::kInputDocs); MsgData::View msg = _builder.buf(); msg.setLen(_builder.len()); msg.setOperation(dbCommand); - _builder.decouple(); // release ownership from BufBuilder. - _message->setData(msg.view2ptr(), true); // transfer ownership to Message. + _builder.decouple(); // release ownership from BufBuilder. + _message.setData(msg.view2ptr(), true); // transfer ownership to Message. _state = State::kDone; return std::move(_message); } diff --git a/src/mongo/rpc/command_request_builder.h b/src/mongo/rpc/command_request_builder.h index cf00e3f9652..50b3f69fab2 100644 --- a/src/mongo/rpc/command_request_builder.h +++ b/src/mongo/rpc/command_request_builder.h @@ -56,7 +56,7 @@ public: * Construct an OP_COMMAND in an existing buffer. Ownership of the buffer will be * transfered to the CommandRequestBuilder. */ - CommandRequestBuilder(std::unique_ptr<Message> message); + CommandRequestBuilder(Message&& message); CommandRequestBuilder& setDatabase(StringData database) final; @@ -79,11 +79,11 @@ public: * The behavior of calling any methods on the object is subsequently * undefined. */ - std::unique_ptr<Message> done() final; + Message done() final; private: BufBuilder _builder{}; - std::unique_ptr<Message> _message; + Message _message; State _state{State::kDatabase}; }; diff --git a/src/mongo/rpc/command_request_builder_test.cpp b/src/mongo/rpc/command_request_builder_test.cpp index cdfbc9d01a9..5972a41752f 100644 --- a/src/mongo/rpc/command_request_builder_test.cpp +++ b/src/mongo/rpc/command_request_builder_test.cpp @@ -78,7 +78,7 @@ TEST(RequestBuilder, RoundTrip) { .addInputDocs(inputDocRange) .done(); - rpc::CommandRequest parsed(msg.get()); + rpc::CommandRequest parsed(&msg); ASSERT_EQUALS(parsed.getDatabase(), databaseName); ASSERT_EQUALS(parsed.getCommandName(), commandName); diff --git a/src/mongo/rpc/command_request_test.cpp b/src/mongo/rpc/command_request_test.cpp index 8f681655b56..18dbc2edc66 100644 --- a/src/mongo/rpc/command_request_test.cpp +++ b/src/mongo/rpc/command_request_test.cpp @@ -115,7 +115,7 @@ TEST(CommandRequest, InvalidNSThrows) { crb.setMetadata(BSONObj()); crb.setCommandArgs(BSON("ping" << 1)); auto msg = crb.done(); - ASSERT_THROWS(rpc::CommandRequest{msg.get()}, AssertionException); + ASSERT_THROWS(rpc::CommandRequest{&msg}, AssertionException); } } // namespace diff --git a/src/mongo/rpc/legacy_reply_builder.cpp b/src/mongo/rpc/legacy_reply_builder.cpp index 592e3588b43..e4830c10f2a 100644 --- a/src/mongo/rpc/legacy_reply_builder.cpp +++ b/src/mongo/rpc/legacy_reply_builder.cpp @@ -65,9 +65,9 @@ bool isEmptyCommandReply(const BSONObj& bson) { const char LegacyReplyBuilder::kCursorTag[] = "cursor"; const char LegacyReplyBuilder::kFirstBatchTag[] = "firstBatch"; -LegacyReplyBuilder::LegacyReplyBuilder() : LegacyReplyBuilder(stdx::make_unique<Message>()) {} +LegacyReplyBuilder::LegacyReplyBuilder() : LegacyReplyBuilder(Message()) {} -LegacyReplyBuilder::LegacyReplyBuilder(std::unique_ptr<Message> message) +LegacyReplyBuilder::LegacyReplyBuilder(Message&& message) : _currentLength{kReservedSize}, _message{std::move(message)} {} LegacyReplyBuilder::~LegacyReplyBuilder() {} @@ -164,14 +164,14 @@ void LegacyReplyBuilder::reset() { if (_state == State::kMetadata) { return; } - _message = stdx::make_unique<Message>(); + _message.reset(); _currentLength = kReservedSize; _currentIndex = 0U; _state = State::kMetadata; } -std::unique_ptr<Message> LegacyReplyBuilder::done() { +Message LegacyReplyBuilder::done() { invariant(_state == State::kOutputDocs); BSONObj reply = uassertStatusOK(rpc::downconvertReplyMetadata(_commandReply, _metadata)); @@ -221,7 +221,7 @@ std::unique_ptr<Message> LegacyReplyBuilder::done() { qr.setStartingFrom(0); qr.setNReturned(1); - _message->setData(qr.view2ptr(), true); + _message.setData(qr.view2ptr(), true); bufBuilder.decouple(); _state = State::kDone; diff --git a/src/mongo/rpc/legacy_reply_builder.h b/src/mongo/rpc/legacy_reply_builder.h index 957265f0611..814fb9096e1 100644 --- a/src/mongo/rpc/legacy_reply_builder.h +++ b/src/mongo/rpc/legacy_reply_builder.h @@ -35,6 +35,7 @@ #include "mongo/rpc/document_range.h" #include "mongo/rpc/protocol.h" #include "mongo/rpc/reply_builder_interface.h" +#include "mongo/util/net/message.h" namespace mongo { namespace rpc { @@ -45,7 +46,7 @@ public: static const char kFirstBatchTag[]; LegacyReplyBuilder(); - LegacyReplyBuilder(std::unique_ptr<Message>); + LegacyReplyBuilder(Message&&); ~LegacyReplyBuilder() final; LegacyReplyBuilder& setMetadata(const BSONObj& metadata) final; @@ -58,7 +59,7 @@ public: void reset() final; - std::unique_ptr<Message> done() final; + Message done() final; Protocol getProtocol() const final; @@ -78,7 +79,7 @@ private: BSONObj _commandReply{}; std::size_t _currentLength; std::size_t _currentIndex = 0U; - std::unique_ptr<Message> _message; + Message _message; BSONObj _metadata{}; std::vector<BSONObj> _outputDocs{}; State _state{State::kMetadata}; diff --git a/src/mongo/rpc/legacy_request_builder.cpp b/src/mongo/rpc/legacy_request_builder.cpp index db333dc4c6a..33f66a4811f 100644 --- a/src/mongo/rpc/legacy_request_builder.cpp +++ b/src/mongo/rpc/legacy_request_builder.cpp @@ -42,12 +42,11 @@ namespace mongo { namespace rpc { -LegacyRequestBuilder::LegacyRequestBuilder() : LegacyRequestBuilder(stdx::make_unique<Message>()) {} +LegacyRequestBuilder::LegacyRequestBuilder() : LegacyRequestBuilder(Message()) {} LegacyRequestBuilder::~LegacyRequestBuilder() {} -LegacyRequestBuilder::LegacyRequestBuilder(std::unique_ptr<Message> message) - : _message{std::move(message)} { +LegacyRequestBuilder::LegacyRequestBuilder(Message&& message) : _message{std::move(message)} { _builder.skip(mongo::MsgData::MsgDataHeaderSize); } @@ -111,13 +110,13 @@ Protocol LegacyRequestBuilder::getProtocol() const { return rpc::Protocol::kOpQuery; } -std::unique_ptr<Message> LegacyRequestBuilder::done() { +Message LegacyRequestBuilder::done() { invariant(_state == State::kInputDocs); 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 + _builder.decouple(); // release ownership from BufBuilder + _message.setData(msg.view2ptr(), true); // transfer ownership to Message _state = State::kDone; return std::move(_message); } diff --git a/src/mongo/rpc/legacy_request_builder.h b/src/mongo/rpc/legacy_request_builder.h index 0d44c47a513..d20011cc443 100644 --- a/src/mongo/rpc/legacy_request_builder.h +++ b/src/mongo/rpc/legacy_request_builder.h @@ -44,7 +44,7 @@ public: LegacyRequestBuilder(); ~LegacyRequestBuilder() final; - LegacyRequestBuilder(std::unique_ptr<Message>); + LegacyRequestBuilder(Message&&); LegacyRequestBuilder& setDatabase(StringData database) final; LegacyRequestBuilder& setCommandName(StringData commandName) final; @@ -58,10 +58,10 @@ public: Protocol getProtocol() const final; - std::unique_ptr<Message> done() final; + Message done() final; private: - std::unique_ptr<Message> _message; + Message _message; BufBuilder _builder{}; // we need to stash this as we need commandArgs to diff --git a/src/mongo/rpc/legacy_request_test.cpp b/src/mongo/rpc/legacy_request_test.cpp index caadc74e3e8..1413a139d71 100644 --- a/src/mongo/rpc/legacy_request_test.cpp +++ b/src/mongo/rpc/legacy_request_test.cpp @@ -46,7 +46,7 @@ TEST(LegacyRequest, InvalidNSThrows) { crb.setMetadata(BSONObj()); crb.setCommandArgs(BSON("ping" << 1)); auto msg = crb.done(); - ASSERT_THROWS(rpc::LegacyRequest{msg.get()}, AssertionException); + ASSERT_THROWS(rpc::LegacyRequest{&msg}, AssertionException); } } // namespace diff --git a/src/mongo/rpc/reply_builder_interface.h b/src/mongo/rpc/reply_builder_interface.h index c02511be567..5f3f2621746 100644 --- a/src/mongo/rpc/reply_builder_interface.h +++ b/src/mongo/rpc/reply_builder_interface.h @@ -131,7 +131,7 @@ public: * Writes data then transfers ownership of the message to the caller. The behavior of * calling any methods on the builder is subsequently undefined. */ - virtual std::unique_ptr<Message> done() = 0; + virtual Message done() = 0; protected: ReplyBuilderInterface() = default; diff --git a/src/mongo/rpc/reply_builder_test.cpp b/src/mongo/rpc/reply_builder_test.cpp index ad50b810989..9ae3544aba5 100644 --- a/src/mongo/rpc/reply_builder_test.cpp +++ b/src/mongo/rpc/reply_builder_test.cpp @@ -96,7 +96,7 @@ TEST(CommandReplyBuilder, MemAccess) { replyBuilder.setCommandReply(commandReply); auto msg = replyBuilder.done(); - rpc::CommandReply parsed(msg.get()); + rpc::CommandReply parsed(&msg); ASSERT_EQUALS(parsed.getMetadata(), metadata); ASSERT_EQUALS(parsed.getCommandReply(), commandReply); @@ -110,7 +110,7 @@ TEST(LegacyReplyBuilder, MemAccess) { replyBuilder.setCommandReply(commandReply); auto msg = replyBuilder.done(); - rpc::LegacyReply parsed(msg.get()); + rpc::LegacyReply parsed(&msg); ASSERT_EQUALS(parsed.getMetadata(), metadata); ASSERT_EQUALS(parsed.getCommandReply(), commandReply); @@ -164,7 +164,7 @@ void testRoundTrip(rpc::ReplyBuilderInterface& replyBuilder) { auto msg = replyBuilder.done(); - T parsed(msg.get()); + T parsed(&msg); ASSERT_EQUALS(parsed.getMetadata(), metadata); ASSERT_TRUE(parsed.getOutputDocs() == outputDocRange); @@ -207,10 +207,10 @@ TEST(LegacyReplyBuilderSpaceTest, DocSize) { replyBuilder0.setCommandReply(commandReply); auto msg0 = replyBuilder0.done(); - QueryResult::View qr0 = msg0->singleData().view2ptr(); + QueryResult::View qr0 = msg0.singleData().view2ptr(); auto dataLen0 = static_cast<std::size_t>(qr0.msgdata().dataLen()); - QueryResult::View qr = msg->singleData().view2ptr(); + QueryResult::View qr = msg.singleData().view2ptr(); auto dataLen = static_cast<std::size_t>(qr.msgdata().dataLen()); // below tests the array space estimates @@ -276,7 +276,7 @@ TEST_F(CommandReplyBuilderSpaceTest, MaxDocSize1) { availSpace = replyBuilder.availableBytes(); } auto msg = replyBuilder.done(); - auto sizeUInt = static_cast<std::size_t>(msg->size()); + auto sizeUInt = static_cast<std::size_t>(msg.size()); ASSERT_EQUALS(sizeUInt, mongo::MaxMessageSizeBytes); } @@ -304,7 +304,7 @@ TEST_F(CommandReplyBuilderSpaceTest, MaxDocSize2) { availSpace = replyBuilder.availableBytes(); } auto msg = replyBuilder.done(); - auto sizeUInt = static_cast<std::size_t>(msg->size()); + auto sizeUInt = static_cast<std::size_t>(msg.size()); ASSERT_EQUALS(sizeUInt, mongo::MaxMessageSizeBytes); } @@ -338,7 +338,7 @@ TEST_F(CommandReplyBuilderSpaceTest, MaxDocSize3) { auto msg = replyBuilder.done(); - auto sizeUInt = static_cast<std::size_t>(msg->size()); + auto sizeUInt = static_cast<std::size_t>(msg.size()); ASSERT_EQUALS(sizeUInt, mongo::MaxMessageSizeBytes); } diff --git a/src/mongo/rpc/request_builder_interface.h b/src/mongo/rpc/request_builder_interface.h index f27c7e3e10d..2325863dd0f 100644 --- a/src/mongo/rpc/request_builder_interface.h +++ b/src/mongo/rpc/request_builder_interface.h @@ -108,7 +108,7 @@ public: * The behavior of calling any methods on the object is subsequently * undefined. */ - virtual std::unique_ptr<Message> done() = 0; + virtual Message done() = 0; protected: RequestBuilderInterface() = default; diff --git a/src/mongo/rpc/unique_message.h b/src/mongo/rpc/unique_message.h index a763a82ec25..6b470b3f9dd 100644 --- a/src/mongo/rpc/unique_message.h +++ b/src/mongo/rpc/unique_message.h @@ -34,9 +34,9 @@ #include "mongo/base/disallow_copying.h" #include "mongo/rpc/reply_interface.h" #include "mongo/rpc/request_interface.h" +#include "mongo/util/net/message.h" namespace mongo { -class Message; namespace rpc { /** @@ -48,7 +48,7 @@ class UniqueMessage { MONGO_DISALLOW_COPYING(UniqueMessage); public: - UniqueMessage(std::unique_ptr<Message> message, std::unique_ptr<MessageViewType> view) + UniqueMessage(Message&& message, std::unique_ptr<MessageViewType> view) : _message{std::move(message)}, _view{std::move(view)} {} #if defined(_MSC_VER) && _MSC_VER < 1900 @@ -77,13 +77,13 @@ public: * Releases ownership of the underlying message. The result of calling any other methods * on the object afterward is undefined. */ - std::unique_ptr<Message> releaseMessage() { + Message releaseMessage() { _view.reset(); return std::move(_message); } private: - std::unique_ptr<Message> _message; + Message _message; std::unique_ptr<MessageViewType> _view; }; |