summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyle Suarez <ksuarz@gmail.com>2016-03-10 14:46:39 -0500
committerKyle Suarez <ksuarz@gmail.com>2016-03-10 16:41:14 -0500
commit7676d097f1dde12c0a7ca9faa9f3e2f8e11a4b76 (patch)
tree10ca7d9d91c1f84f6b6461a88293415855e4a1f4
parent1d7516e470bc5194bff6b772663a818d067de046 (diff)
downloadmongo-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.cpp16
-rw-r--r--src/mongo/db/index/index_access_method.cpp4
-rw-r--r--src/mongo/db/index/index_access_method.h6
-rw-r--r--src/mongo/db/storage/sorted_data_interface.h8
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp11
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_index.h2
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;
}