summaryrefslogtreecommitdiff
path: root/src/mongo/db/dbmessage.cpp
diff options
context:
space:
mode:
authorDavid Storch <david.storch@10gen.com>2015-11-13 13:28:36 -0500
committerDavid Storch <david.storch@10gen.com>2015-11-13 16:41:37 -0500
commit7a99fd808fc4e8960d2981799415617c495a0fda (patch)
tree89fbd9ea94559b27637e9d3d1a09827981622c19 /src/mongo/db/dbmessage.cpp
parentbddbae79b4733dbd392215c38beccab5daa0109c (diff)
downloadmongo-7a99fd808fc4e8960d2981799415617c495a0fda.tar.gz
SERVER-20853 eliminate copies in find and getMore path
Diffstat (limited to 'src/mongo/db/dbmessage.cpp')
-rw-r--r--src/mongo/db/dbmessage.cpp68
1 files changed, 39 insertions, 29 deletions
diff --git a/src/mongo/db/dbmessage.cpp b/src/mongo/db/dbmessage.cpp
index 0be54d0f818..e8529486f8a 100644
--- a/src/mongo/db/dbmessage.cpp
+++ b/src/mongo/db/dbmessage.cpp
@@ -169,6 +169,39 @@ T DbMessage::readAndAdvance() {
return t;
}
+OpQueryReplyBuilder::OpQueryReplyBuilder() : _buffer(32768) {
+ _buffer.skip(sizeof(QueryResult::Value));
+}
+
+void OpQueryReplyBuilder::send(AbstractMessagingPort* destination,
+ int queryResultFlags,
+ Message& requestMsg,
+ int nReturned,
+ int startingFrom,
+ long long cursorId) {
+ Message response;
+ putInMessage(&response, queryResultFlags, nReturned, startingFrom, cursorId);
+ destination->reply(requestMsg, response, requestMsg.header().getId());
+}
+
+void OpQueryReplyBuilder::sendCommandReply(AbstractMessagingPort* destination,
+ Message& requestMsg) {
+ send(destination, /*queryFlags*/ 0, requestMsg, /*nReturned*/ 1);
+}
+
+void OpQueryReplyBuilder::putInMessage(
+ Message* out, int queryResultFlags, int nReturned, int startingFrom, long long cursorId) {
+ QueryResult::View qr = _buffer.buf();
+ qr.setResultFlags(queryResultFlags);
+ qr.msgdata().setLen(_buffer.len());
+ qr.msgdata().setOperation(opReply);
+ qr.setCursorId(cursorId);
+ qr.setStartingFrom(startingFrom);
+ qr.setNReturned(nReturned);
+ _buffer.decouple();
+ out->setData(qr.view2ptr(), true); // transport will free
+}
+
void replyToQuery(int queryResultFlags,
AbstractMessagingPort* p,
Message& requestMsg,
@@ -177,19 +210,9 @@ void replyToQuery(int queryResultFlags,
int nReturned,
int startingFrom,
long long cursorId) {
- BufBuilder b(32768);
- b.skip(sizeof(QueryResult::Value));
- b.appendBuf(data, size);
- QueryResult::View qr = b.buf();
- qr.setResultFlags(queryResultFlags);
- qr.msgdata().setLen(b.len());
- qr.msgdata().setOperation(opReply);
- qr.setCursorId(cursorId);
- qr.setStartingFrom(startingFrom);
- qr.setNReturned(nReturned);
- b.decouple();
- Message resp(qr.view2ptr(), true);
- p->reply(requestMsg, resp, requestMsg.header().getId());
+ OpQueryReplyBuilder reply;
+ reply.bufBuilderForResults().appendBuf(data, size);
+ reply.send(p, queryResultFlags, requestMsg, nReturned, startingFrom, cursorId);
}
void replyToQuery(int queryResultFlags,
@@ -208,21 +231,8 @@ void replyToQuery(int queryResultFlags, Message& m, DbResponse& dbresponse, BSON
}
void replyToQuery(int queryResultFlags, Message& response, const BSONObj& resultObj) {
- BufBuilder bufBuilder;
- bufBuilder.skip(sizeof(QueryResult::Value));
- bufBuilder.appendBuf(reinterpret_cast<void*>(const_cast<char*>(resultObj.objdata())),
- resultObj.objsize());
-
- QueryResult::View queryResult = bufBuilder.buf();
- bufBuilder.decouple();
-
- queryResult.setResultFlags(queryResultFlags);
- queryResult.msgdata().setLen(bufBuilder.len());
- queryResult.msgdata().setOperation(opReply);
- queryResult.setCursorId(0);
- queryResult.setStartingFrom(0);
- queryResult.setNReturned(1);
-
- response.setData(queryResult.view2ptr(), true); // transport will free
+ OpQueryReplyBuilder reply;
+ resultObj.appendSelfToBufBuilder(reply.bufBuilderForResults());
+ reply.putInMessage(&response, queryResultFlags, /*nReturned*/ 1);
}
}