summaryrefslogtreecommitdiff
path: root/src/mongo/db
diff options
context:
space:
mode:
authorGeert Bosch <geert@mongodb.com>2016-06-08 19:52:33 -0400
committerGeert Bosch <geert@mongodb.com>2016-06-15 15:01:11 -0400
commit23f0bf30a707dabff02e63d854843b102bd1904d (patch)
treef85c2e1b1e2b063ff5b53debae6489af3da63cfe /src/mongo/db
parentf23455dfa501cfc7cbac5cb6b15456029fe4b9b2 (diff)
downloadmongo-23f0bf30a707dabff02e63d854843b102bd1904d.tar.gz
SERVER-24481 Fix KeyString version selection on WT
Diffstat (limited to 'src/mongo/db')
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp12
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_index.h3
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp3
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_util.cpp10
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_util.h10
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_util_test.cpp11
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());
}