summaryrefslogtreecommitdiff
path: root/src/mongo/rpc
diff options
context:
space:
mode:
authorAdam Midvidy <amidvidy@gmail.com>2015-10-22 10:34:51 -0400
committerAdam Midvidy <amidvidy@gmail.com>2015-10-30 15:47:26 -0400
commit791c412874ce87d9cc1eac75edce8116a9d40640 (patch)
treecdaaeaefd1d093d88ff9a5332a68a8e440b124fa /src/mongo/rpc
parente62e2e71eff397caf22a0da13ac4669a8546b298 (diff)
downloadmongo-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.cpp13
-rw-r--r--src/mongo/rpc/command_reply_builder.h6
-rw-r--r--src/mongo/rpc/command_reply_test.cpp10
-rw-r--r--src/mongo/rpc/command_request_builder.cpp12
-rw-r--r--src/mongo/rpc/command_request_builder.h6
-rw-r--r--src/mongo/rpc/command_request_builder_test.cpp2
-rw-r--r--src/mongo/rpc/command_request_test.cpp2
-rw-r--r--src/mongo/rpc/legacy_reply_builder.cpp10
-rw-r--r--src/mongo/rpc/legacy_reply_builder.h7
-rw-r--r--src/mongo/rpc/legacy_request_builder.cpp11
-rw-r--r--src/mongo/rpc/legacy_request_builder.h6
-rw-r--r--src/mongo/rpc/legacy_request_test.cpp2
-rw-r--r--src/mongo/rpc/reply_builder_interface.h2
-rw-r--r--src/mongo/rpc/reply_builder_test.cpp16
-rw-r--r--src/mongo/rpc/request_builder_interface.h2
-rw-r--r--src/mongo/rpc/unique_message.h8
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;
};