diff options
author | Geert Bosch <geert@mongodb.com> | 2016-06-08 19:52:33 -0400 |
---|---|---|
committer | Geert Bosch <geert@mongodb.com> | 2016-06-15 15:01:11 -0400 |
commit | 23f0bf30a707dabff02e63d854843b102bd1904d (patch) | |
tree | f85c2e1b1e2b063ff5b53debae6489af3da63cfe /src/mongo/db/storage | |
parent | f23455dfa501cfc7cbac5cb6b15456029fe4b9b2 (diff) | |
download | mongo-23f0bf30a707dabff02e63d854843b102bd1904d.tar.gz |
SERVER-24481 Fix KeyString version selection on WT
Diffstat (limited to 'src/mongo/db/storage')
6 files changed, 28 insertions, 21 deletions
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp index 28b7f7d28fb..aa3d6277260 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp @@ -82,8 +82,9 @@ static const int TempKeyMaxSize = 1024; // this goes away with SERVER-3372 static const WiredTigerItem emptyItem(NULL, 0); +// Keystring format 7 was used in 3.3.6 - 3.3.8 development releases. static const int kKeyStringV0Version = 6; -static const int kKeyStringV1Version = 7; +static const int kKeyStringV1Version = 8; static const int kMinimumIndexVersion = kKeyStringV0Version; static const int kMaximumIndexVersion = kKeyStringV1Version; @@ -216,16 +217,15 @@ WiredTigerIndex::WiredTigerIndex(OperationContext* ctx, const std::string& uri, const IndexDescriptor* desc) : _ordering(Ordering::make(desc->keyPattern())), - _keyStringVersion(desc->version() < kKeyStringV1Version ? KeyString::Version::V0 - : KeyString::Version::V1), _uri(uri), _tableId(WiredTigerSession::genTableId()), _collectionNamespace(desc->parentNS()), _indexName(desc->indexName()) { - Status versionStatus = WiredTigerUtil::checkApplicationMetadataFormatVersion( + auto version = WiredTigerUtil::checkApplicationMetadataFormatVersion( ctx, uri, kMinimumIndexVersion, kMaximumIndexVersion); - if (!versionStatus.isOK()) { + if (!version.isOK()) { str::stream ss; + Status versionStatus = version.getStatus(); ss << versionStatus.reason() << " Index: {name: " << desc->indexName() << ", ns: " << desc->parentNS() << "} - version too new for this mongod." << " See http://dochub.mongodb.org/core/3.4-index-downgrade for detailed" @@ -234,6 +234,8 @@ WiredTigerIndex::WiredTigerIndex(OperationContext* ctx, ErrorCodes::UnsupportedFormat, ss.ss.str(), versionStatus.location()); fassertFailedWithStatusNoTrace(28579, indexVersionStatus); } + _keyStringVersion = + version.getValue() == kKeyStringV1Version ? KeyString::Version::V1 : KeyString::Version::V0; } Status WiredTigerIndex::insert(OperationContext* txn, diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_index.h b/src/mongo/db/storage/wiredtiger/wiredtiger_index.h index ee729502550..3ff8ff5799e 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_index.h +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_index.h @@ -145,7 +145,8 @@ protected: class UniqueBulkBuilder; const Ordering _ordering; - const KeyString::Version _keyStringVersion; + // The keystring version is effectively const after the WiredTigerIndex instance is constructed. + KeyString::Version _keyStringVersion; std::string _uri; uint64_t _tableId; std::string _collectionNamespace; diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp index 1543b5706f6..4c83764fa3c 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp @@ -814,7 +814,8 @@ WiredTigerRecordStore::WiredTigerRecordStore(OperationContext* ctx, _sizeStorerCounter(0), _shuttingDown(false) { Status versionStatus = WiredTigerUtil::checkApplicationMetadataFormatVersion( - ctx, uri, kMinimumRecordStoreVersion, kMaximumRecordStoreVersion); + ctx, uri, kMinimumRecordStoreVersion, kMaximumRecordStoreVersion) + .getStatus(); if (!versionStatus.isOK()) { if (versionStatus.code() == ErrorCodes::FailedToParse) { uasserted(28548, versionStatus.reason()); diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_util.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_util.cpp index 6f4bcf0d025..91c9d06e218 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_util.cpp +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_util.cpp @@ -189,10 +189,10 @@ StatusWith<BSONObj> WiredTigerUtil::getApplicationMetadata(OperationContext* opC return StatusWith<BSONObj>(bob.obj()); } -Status WiredTigerUtil::checkApplicationMetadataFormatVersion(OperationContext* opCtx, - StringData uri, - int64_t minimumVersion, - int64_t maximumVersion) { +StatusWith<int64_t> WiredTigerUtil::checkApplicationMetadataFormatVersion(OperationContext* opCtx, + StringData uri, + int64_t minimumVersion, + int64_t maximumVersion) { StatusWith<std::string> result = getMetadata(opCtx, uri); if (result.getStatus().code() == ErrorCodes::NoSuchKey) { return result.getStatus(); @@ -241,7 +241,7 @@ Status WiredTigerUtil::checkApplicationMetadataFormatVersion(OperationContext* o << " uri: " << uri << " ok range " << minimumVersion << " -> " << maximumVersion << " current: " << version; - return Status::OK(); + return version; } // static diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_util.h b/src/mongo/db/storage/wiredtiger/wiredtiger_util.h index 6227ae7852d..33673f6e652 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_util.h +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_util.h @@ -131,12 +131,12 @@ public: /** * Validates formatVersion in application metadata for 'uri'. * Version must be numeric and be in the range [minimumVersion, maximumVersion]. - * URI is used in error messages only. + * URI is used in error messages only. Returns actual version. */ - static Status checkApplicationMetadataFormatVersion(OperationContext* opCtx, - StringData uri, - int64_t minimumVersion, - int64_t maximumVersion); + static StatusWith<int64_t> checkApplicationMetadataFormatVersion(OperationContext* opCtx, + StringData uri, + int64_t minimumVersion, + int64_t maximumVersion); /** * Validates the 'configString' specified as a collection or index creation option. diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_util_test.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_util_test.cpp index b3ffec36559..8c856bba938 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_util_test.cpp +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_util_test.cpp @@ -231,8 +231,10 @@ TEST_F(WiredTigerUtilMetadataTest, CheckApplicationMetadataFormatVersionString) TEST_F(WiredTigerUtilMetadataTest, CheckApplicationMetadataFormatVersionNumber) { createSession("app_metadata=(formatVersion=2)"); - ASSERT_OK(WiredTigerUtil::checkApplicationMetadataFormatVersion( - getOperationContext(), getURI(), 2, 3)); + ASSERT_EQUALS( + WiredTigerUtil::checkApplicationMetadataFormatVersion(getOperationContext(), getURI(), 2, 3) + .getValue(), + 2); ASSERT_NOT_OK(WiredTigerUtil::checkApplicationMetadataFormatVersion( getOperationContext(), getURI(), 1, 1)); ASSERT_NOT_OK(WiredTigerUtil::checkApplicationMetadataFormatVersion( @@ -241,8 +243,9 @@ TEST_F(WiredTigerUtilMetadataTest, CheckApplicationMetadataFormatVersionNumber) TEST_F(WiredTigerUtilMetadataTest, CheckApplicationMetadataFormatInvalidURI) { createSession("\""); - Status result = WiredTigerUtil::checkApplicationMetadataFormatVersion( - getOperationContext(), getURI(), 0, 3); + Status result = + WiredTigerUtil::checkApplicationMetadataFormatVersion(getOperationContext(), getURI(), 0, 3) + .getStatus(); ASSERT_NOT_OK(result); ASSERT_EQUALS(ErrorCodes::FailedToParse, result.code()); } |