Skip to content

Commit

Permalink
SERVER-12868 added getMemUsage to WorkingSetMember
Browse files Browse the repository at this point in the history
  • Loading branch information
benety committed Feb 28, 2014
1 parent 5e120d3 commit 94cbec5
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 42 deletions.
24 changes: 5 additions & 19 deletions src/mongo/db/exec/and_hash.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,24 +36,10 @@

namespace {

using namespace mongo;

// Upper limit for buffered data.
// Stage execution will fail once size of all buffered data exceeds this threshold.
const size_t kDefaultMaxMemUsageBytes = 32 * 1024 * 1024;

/**
* Returns expected memory usage of working set member
*/
size_t getMemberMemUsage(WorkingSetMember* member) {
size_t memUsage = 0;
for (size_t i = 0; i < member->keyData.size(); ++i) {
const IndexKeyDatum& keyDatum = member->keyData[i];
memUsage += keyDatum.keyData.objsize();
}
return memUsage;
}

} // namespace

namespace mongo {
Expand Down Expand Up @@ -291,7 +277,7 @@ namespace mongo {
_dataMap[member->loc] = id;

// Update memory stats.
_memUsage += getMemberMemUsage(member);
_memUsage += member->getMemUsage();

++_commonStats.needTime;
return PlanStage::NEED_TIME;
Expand Down Expand Up @@ -361,12 +347,12 @@ namespace mongo {
// We have a hit. Copy data into the WSM we already have.
_seenMap.insert(member->loc);
WorkingSetMember* olderMember = _ws->get(_dataMap[member->loc]);
size_t memUsageBefore = getMemberMemUsage(olderMember);
size_t memUsageBefore = olderMember->getMemUsage();

AndCommon::mergeFrom(olderMember, *member);

// Update memory stats.
_memUsage += getMemberMemUsage(olderMember) - memUsageBefore;
_memUsage += olderMember->getMemUsage() - memUsageBefore;
}
_ws->free(id);
++_commonStats.needTime;
Expand All @@ -385,7 +371,7 @@ namespace mongo {

// Update memory stats.
WorkingSetMember* member = _ws->get(toErase->second);
_memUsage -= getMemberMemUsage(member);
_memUsage -= member->getMemUsage();

_ws->free(toErase->second);
_dataMap.erase(toErase);
Expand Down Expand Up @@ -498,7 +484,7 @@ namespace mongo {
}

// Update memory stats.
_memUsage -= getMemberMemUsage(member);
_memUsage -= member->getMemUsage();

// The loc is about to be invalidated. Fetch it and clear the loc.
WorkingSetCommon::fetchAndInvalidateLoc(member);
Expand Down
29 changes: 6 additions & 23 deletions src/mongo/db/exec/sort.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,24 +37,6 @@
#include "mongo/db/query/lite_parsed_query.h"
#include "mongo/db/query/query_planner.h"

namespace {

using mongo::DiskLoc;
using mongo::WorkingSet;
using mongo::WorkingSetID;
using mongo::WorkingSetMember;

/**
* Returns expected memory usage of working set member
*/
size_t getMemUsage(WorkingSet* ws, WorkingSetID wsid) {
WorkingSetMember* member = ws->get(wsid);
size_t memUsage = sizeof(DiskLoc) + member->obj.objsize();
return memUsage;
}

} // namespace

namespace mongo {

using std::vector;
Expand Down Expand Up @@ -476,12 +458,12 @@ namespace mongo {

if (_limit == 0) {
_data.push_back(item);
_memUsage += getMemUsage(_ws, item.wsid);
_memUsage += _ws->get(item.wsid)->getMemUsage();
}
else if (_limit == 1) {
if (_data.empty()) {
_data.push_back(item);
_memUsage = getMemUsage(_ws, item.wsid);
_memUsage = _ws->get(item.wsid)->getMemUsage();
return;
}
wsidToFree = item.wsid;
Expand All @@ -490,7 +472,7 @@ namespace mongo {
if (cmp(item, _data[0])) {
wsidToFree = _data[0].wsid;
_data[0] = item;
_memUsage = getMemUsage(_ws, item.wsid);
_memUsage = _ws->get(item.wsid)->getMemUsage();
}
}
else {
Expand All @@ -499,7 +481,7 @@ namespace mongo {
vector<SortableDataItem>::size_type limit(_limit);
if (_dataSet->size() < limit) {
_dataSet->insert(item);
_memUsage += getMemUsage(_ws, item.wsid);
_memUsage += _ws->get(item.wsid)->getMemUsage();
return;
}
// Limit will be exceeded - compare with item with lowest key
Expand All @@ -510,7 +492,8 @@ namespace mongo {
const SortableDataItem& lastItem = *lastItemIt;
const WorkingSetComparator& cmp = *_sortKeyComparator;
if (cmp(item, lastItem)) {
_memUsage += getMemUsage(_ws, item.wsid) - getMemUsage(_ws, lastItem.wsid);
_memUsage += _ws->get(item.wsid)->getMemUsage() -
_ws->get(lastItem.wsid)->getMemUsage();
wsidToFree = lastItem.wsid;
// According to std::set iterator validity rules,
// it does not matter which of erase()/insert() happens first.
Expand Down
21 changes: 21 additions & 0 deletions src/mongo/db/exec/working_set.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -159,4 +159,25 @@ namespace mongo {
return false;
}

size_t WorkingSetMember::getMemUsage() const {
size_t memUsage = 0;

if (hasLoc()) {
memUsage += sizeof(DiskLoc);
}

// XXX: Unowned objects count towards current size.
// See SERVER-12579
if (hasObj()) {
memUsage += obj.objsize();
}

for (size_t i = 0; i < keyData.size(); ++i) {
const IndexKeyDatum& keyDatum = keyData[i];
memUsage += keyDatum.keyData.objsize();
}

return memUsage;
}

} // namespace mongo
5 changes: 5 additions & 0 deletions src/mongo/db/exec/working_set.h
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,11 @@ namespace mongo {
*/
bool getFieldDotted(const string& field, BSONElement* out) const;

/**
* Returns expected memory usage of working set member.
*/
size_t getMemUsage() const;

private:
boost::scoped_ptr<WorkingSetComputedData> _computed[WSM_COMPUTED_NUM_TYPES];
};
Expand Down

0 comments on commit 94cbec5

Please sign in to comment.