diff options
author | Martin Bligh <mbligh@mongodb.com> | 2015-09-14 18:07:41 -0400 |
---|---|---|
committer | Martin Bligh <mbligh@mongodb.com> | 2015-09-14 18:08:15 -0400 |
commit | 53559aaf23d0ae44c5ea4205b3441f5873ce6c4d (patch) | |
tree | 920e56d47891d31b528ce6303ceabdaf5ab071be | |
parent | 1cc778ff64491cf4d63a3775bfe5eaf36c3aa596 (diff) | |
download | mongo-53559aaf23d0ae44c5ea4205b3441f5873ce6c4d.tar.gz |
SERVER-19564: Vectorize index write
-rw-r--r-- | src/mongo/db/catalog/collection.cpp | 18 | ||||
-rw-r--r-- | src/mongo/db/catalog/index_catalog.cpp | 44 | ||||
-rw-r--r-- | src/mongo/db/catalog/index_catalog.h | 14 | ||||
-rw-r--r-- | src/mongo/db/storage/record_store.h | 5 |
4 files changed, 56 insertions, 25 deletions
diff --git a/src/mongo/db/catalog/collection.cpp b/src/mongo/db/catalog/collection.cpp index c754ce46254..91c364ae622 100644 --- a/src/mongo/db/catalog/collection.cpp +++ b/src/mongo/db/catalog/collection.cpp @@ -434,20 +434,21 @@ Status Collection::_insertDocuments(OperationContext* txn, // under the RecordStore, this feels broken since that should be a // collection access method probably - // These will be vectorized (insertRecords, indexRecords) in a future patch + // insertRecord(s) will be vectorized in a future patch + std::vector<BsonRecord> bsonRecords; for (vector<BSONObj>::iterator it = begin; it != end; it++) { StatusWith<RecordId> loc = _recordStore->insertRecord( txn, it->objdata(), it->objsize(), _enforceQuota(enforceQuota)); if (!loc.isOK()) return loc.getStatus(); + BsonRecord bsonRecord = {loc.getValue(), &(*it)}; + bsonRecords.push_back(bsonRecord); + invariant(RecordId::min() < loc.getValue()); invariant(loc.getValue() < RecordId::max()); - - Status status = _indexCatalog.indexRecord(txn, *it, loc.getValue()); - if (!status.isOK()) - return status; } - return Status::OK(); + + return _indexCatalog.indexRecords(txn, bsonRecords); } Status Collection::aboutToDeleteCapped(OperationContext* txn, @@ -580,7 +581,10 @@ StatusWith<RecordId> Collection::updateDocument(OperationContext* txn, debug->nmoved += 1; } - Status s = _indexCatalog.indexRecord(txn, newDoc, newLocation.getValue()); + std::vector<BsonRecord> bsonRecords; + BsonRecord bsonRecord = {newLocation.getValue(), &newDoc}; + bsonRecords.push_back(bsonRecord); + Status s = _indexCatalog.indexRecords(txn, bsonRecords); if (!s.isOK()) return StatusWith<RecordId>(s); invariant(sid == txn->recoveryUnit()->getSnapshotId()); diff --git a/src/mongo/db/catalog/index_catalog.cpp b/src/mongo/db/catalog/index_catalog.cpp index 940b2fa9810..9b713cc0a23 100644 --- a/src/mongo/db/catalog/index_catalog.cpp +++ b/src/mongo/db/catalog/index_catalog.cpp @@ -1109,21 +1109,38 @@ bool isDupsAllowed(IndexDescriptor* desc) { } } -Status IndexCatalog::_indexRecord(OperationContext* txn, - IndexCatalogEntry* index, - const BSONObj& obj, - const RecordId& loc) { - const MatchExpression* filter = index->getFilterExpression(); - if (filter && !filter->matchesBSON(obj)) { - return Status::OK(); - } - +Status IndexCatalog::_indexFilteredRecords(OperationContext* txn, + IndexCatalogEntry* index, + const std::vector<BsonRecord>& bsonRecords) { InsertDeleteOptions options; options.logIfError = false; options.dupsAllowed = isDupsAllowed(index->descriptor()); - int64_t inserted; - return index->accessMethod()->insert(txn, obj, loc, options, &inserted); + for (auto bsonRecord : bsonRecords) { + int64_t inserted; + invariant(bsonRecord.id != RecordId()); + Status status = index->accessMethod()->insert( + txn, *bsonRecord.docPtr, bsonRecord.id, options, &inserted); + if (!status.isOK()) + return status; + } + return Status::OK(); +} + +Status IndexCatalog::_indexRecords(OperationContext* txn, + IndexCatalogEntry* index, + const std::vector<BsonRecord>& bsonRecords) { + const MatchExpression* filter = index->getFilterExpression(); + if (!filter) + return _indexFilteredRecords(txn, index, bsonRecords); + + std::vector<BsonRecord> filteredBsonRecords; + for (auto bsonRecord : bsonRecords) { + if (filter->matchesBSON(*(bsonRecord.docPtr))) + filteredBsonRecords.push_back(bsonRecord); + } + + return _indexFilteredRecords(txn, index, filteredBsonRecords); } Status IndexCatalog::_unindexRecord(OperationContext* txn, @@ -1152,10 +1169,11 @@ Status IndexCatalog::_unindexRecord(OperationContext* txn, } -Status IndexCatalog::indexRecord(OperationContext* txn, const BSONObj& obj, const RecordId& loc) { +Status IndexCatalog::indexRecords(OperationContext* txn, + const std::vector<BsonRecord>& bsonRecords) { for (IndexCatalogEntryContainer::const_iterator i = _entries.begin(); i != _entries.end(); ++i) { - Status s = _indexRecord(txn, *i, obj, loc); + Status s = _indexRecords(txn, *i, bsonRecords); if (!s.isOK()) return s; } diff --git a/src/mongo/db/catalog/index_catalog.h b/src/mongo/db/catalog/index_catalog.h index 9cb9186a25e..bb3edea07b1 100644 --- a/src/mongo/db/catalog/index_catalog.h +++ b/src/mongo/db/catalog/index_catalog.h @@ -36,6 +36,7 @@ #include "mongo/db/jsobj.h" #include "mongo/db/operation_context.h" #include "mongo/db/record_id.h" +#include "mongo/db/storage/record_store.h" #include "mongo/platform/unordered_map.h" namespace mongo { @@ -263,7 +264,7 @@ public: // ----- data modifiers ------ // this throws for now - Status indexRecord(OperationContext* txn, const BSONObj& obj, const RecordId& loc); + Status indexRecords(OperationContext* txn, const std::vector<BsonRecord>& bsonRecords); void unindexRecord(OperationContext* txn, const BSONObj& obj, const RecordId& loc, bool noWarn); @@ -294,10 +295,13 @@ private: void _checkMagic() const; - Status _indexRecord(OperationContext* txn, - IndexCatalogEntry* index, - const BSONObj& obj, - const RecordId& loc); + Status _indexFilteredRecords(OperationContext* txn, + IndexCatalogEntry* index, + const std::vector<BsonRecord>& bsonRecords); + + Status _indexRecords(OperationContext* txn, + IndexCatalogEntry* index, + const std::vector<BsonRecord>& bsonRecords); Status _unindexRecord(OperationContext* txn, IndexCatalogEntry* index, diff --git a/src/mongo/db/storage/record_store.h b/src/mongo/db/storage/record_store.h index a5a6a459db3..4321c1a187c 100644 --- a/src/mongo/db/storage/record_store.h +++ b/src/mongo/db/storage/record_store.h @@ -91,6 +91,11 @@ struct Record { RecordData data; }; +struct BsonRecord { + RecordId id; + const BSONObj* docPtr; +}; + /** * Retrieves Records from a RecordStore. * |