diff options
author | Kyle Suarez <ksuarz@gmail.com> | 2016-03-10 14:46:39 -0500 |
---|---|---|
committer | Kyle Suarez <ksuarz@gmail.com> | 2016-03-10 16:41:14 -0500 |
commit | 7676d097f1dde12c0a7ca9faa9f3e2f8e11a4b76 (patch) | |
tree | 10ca7d9d91c1f84f6b6461a88293415855e4a1f4 | |
parent | 1d7516e470bc5194bff6b772663a818d067de046 (diff) | |
download | mongo-7676d097f1dde12c0a7ca9faa9f3e2f8e11a4b76.tar.gz |
SERVER-16856 compact method in SortedDataInterface
Add a compact() method to the SortedDataInterface to allow for compaction if the
indexed record store supports compaction-in-place.
-rw-r--r-- | src/mongo/db/catalog/collection_compact.cpp | 16 | ||||
-rw-r--r-- | src/mongo/db/index/index_access_method.cpp | 4 | ||||
-rw-r--r-- | src/mongo/db/index/index_access_method.h | 6 | ||||
-rw-r--r-- | src/mongo/db/storage/sorted_data_interface.h | 8 | ||||
-rw-r--r-- | src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp | 11 | ||||
-rw-r--r-- | src/mongo/db/storage/wiredtiger/wiredtiger_index.h | 2 |
6 files changed, 45 insertions, 2 deletions
diff --git a/src/mongo/db/catalog/collection_compact.cpp b/src/mongo/db/catalog/collection_compact.cpp index 7d0a9e266f6..b9ea06a2aef 100644 --- a/src/mongo/db/catalog/collection_compact.cpp +++ b/src/mongo/db/catalog/collection_compact.cpp @@ -111,13 +111,25 @@ StatusWith<CompactStats> Collection::compact(OperationContext* txn, << _recordStore->name()); if (_recordStore->compactsInPlace()) { - // Since we are compacting in-place, we don't need to touch the indexes. - // TODO SERVER-16856 compact indexes CompactStats stats; Status status = _recordStore->compact(txn, NULL, compactOptions, &stats); if (!status.isOK()) return StatusWith<CompactStats>(status); + // Compact all indexes (not including unfinished indexes) + IndexCatalog::IndexIterator ii(_indexCatalog.getIndexIterator(txn, false)); + while (ii.more()) { + IndexDescriptor* descriptor = ii.next(); + IndexAccessMethod* index = _indexCatalog.getIndex(descriptor); + + LOG(1) << "compacting index: " << descriptor->toString(); + Status status = index->compact(txn); + if (!status.isOK()) { + error() << "failed to compact index: " << descriptor->toString(); + return status; + } + } + return StatusWith<CompactStats>(stats); } diff --git a/src/mongo/db/index/index_access_method.cpp b/src/mongo/db/index/index_access_method.cpp index d731f9cbfed..618333b2ea4 100644 --- a/src/mongo/db/index/index_access_method.cpp +++ b/src/mongo/db/index/index_access_method.cpp @@ -323,6 +323,10 @@ Status IndexAccessMethod::update(OperationContext* txn, return Status::OK(); } +Status IndexAccessMethod::compact(OperationContext* txn) { + return this->_newInterface->compact(txn); +} + std::unique_ptr<IndexAccessMethod::BulkBuilder> IndexAccessMethod::initiateBulk() { return std::unique_ptr<BulkBuilder>(new BulkBuilder(this, _descriptor)); } diff --git a/src/mongo/db/index/index_access_method.h b/src/mongo/db/index/index_access_method.h index ea9ea90c71c..58b1ab40a51 100644 --- a/src/mongo/db/index/index_access_method.h +++ b/src/mongo/db/index/index_access_method.h @@ -185,6 +185,12 @@ public: RecordId findSingle(OperationContext* txn, const BSONObj& key) const; + /** + * Attempt compaction to regain disk space if the indexed record store supports + * compaction-in-place. + */ + Status compact(OperationContext* txn); + // // Bulk operations support // diff --git a/src/mongo/db/storage/sorted_data_interface.h b/src/mongo/db/storage/sorted_data_interface.h index 9507339995a..d99f9061f76 100644 --- a/src/mongo/db/storage/sorted_data_interface.h +++ b/src/mongo/db/storage/sorted_data_interface.h @@ -121,6 +121,14 @@ public: */ virtual Status dupKeyCheck(OperationContext* txn, const BSONObj& key, const RecordId& loc) = 0; + /** + * Attempt to reduce the storage space used by this index via compaction. Only called if the + * indexed record store supports compaction-in-place. + */ + virtual Status compact(OperationContext* txn) { + return Status::OK(); + } + // // Information about the tree // diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp index 4cebed3eb61..52fff5ffdd8 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp @@ -426,6 +426,17 @@ Status WiredTigerIndex::initAsEmpty(OperationContext* txn) { return Status::OK(); } +Status WiredTigerIndex::compact(OperationContext* txn) { + WiredTigerSessionCache* cache = WiredTigerRecoveryUnit::get(txn)->getSessionCache(); + if (!cache->isEphemeral()) { + UniqueWiredTigerSession session = cache->getSession(); + WT_SESSION* s = session->getSession(); + int ret = s->compact(s, uri().c_str(), "timeout=0"); + invariantWTOK(ret); + } + return Status::OK(); +} + /** * Base class for WiredTigerIndex bulk builders. * diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_index.h b/src/mongo/db/storage/wiredtiger/wiredtiger_index.h index 4ea5741e7a5..b54f61dc6f4 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_index.h +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_index.h @@ -108,6 +108,8 @@ public: virtual Status initAsEmpty(OperationContext* txn); + virtual Status compact(OperationContext* txn); + const std::string& uri() const { return _uri; } |