本文整理汇总了C++中VersionType类的典型用法代码示例。如果您正苦于以下问题:C++ VersionType类的具体用法?C++ VersionType怎么用?C++ VersionType使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了VersionType类的18个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: preUpgradeCheck
Status preUpgradeCheck(const ConnectionString& configServer,
const VersionType& lastVersionInfo,
string minMongosVersion) {
if (lastVersionInfo.isUpgradeIdSet() && lastVersionInfo.getUpgradeId().isSet()) {
//
// Another upgrade failed, so cleanup may be necessary
//
BSONObj lastUpgradeState = lastVersionInfo.getUpgradeState();
bool inCriticalSection;
string errMsg;
if (!FieldParser::extract(lastUpgradeState,
inCriticalSectionField,
&inCriticalSection,
&errMsg)) {
return Status(ErrorCodes::FailedToParse, causedBy(errMsg));
}
if (inCriticalSection) {
// Note: custom message must be supplied by caller
return Status(ErrorCodes::ManualInterventionRequired, "");
}
}
//
// Check the versions of other mongo processes in the cluster before upgrade.
// We can't upgrade if there are active pre-v2.4 processes in the cluster
//
return checkClusterMongoVersions(configServer, string(minMongosVersion));
}
开发者ID:ChrisBg,项目名称:mongo,代码行数:31,代码来源:config_upgrade_helpers.cpp
示例2: doUpgradeV4ToV5
/**
* Upgrades v4 to v5.
*/
bool doUpgradeV4ToV5(const ConnectionString& configLoc,
const VersionType& lastVersionInfo,
string* errMsg)
{
string dummy;
if (!errMsg) errMsg = &dummy;
verify(lastVersionInfo.getCurrentVersion() == UpgradeHistory_MandatoryEpochVersion);
Status result = preUpgradeCheck(configLoc, lastVersionInfo, minMongoProcessVersion);
if (!result.isOK()) {
if (result.code() == ErrorCodes::ManualInterventionRequired) {
*errMsg = cannotCleanupMessage;
}
else {
*errMsg = result.toString();
}
return false;
}
// This is not needed because we are not actually going to make any modifications
// on the other collections in the config server for this particular upgrade.
// startConfigUpgrade(configLoc.toString(),
// lastVersionInfo.getCurrentVersion(),
// OID::gen());
// If we actually need to modify something in the config servers these need to follow
// after calling startConfigUpgrade(...):
//
// 1. Acquire necessary locks.
// 2. Make a backup of the collections we are about to modify.
// 3. Perform the upgrade process on the backup collection.
// 4. Verify that no changes were made to the collections since the backup was performed.
// 5. Call enterConfigUpgradeCriticalSection(configLoc.toString(),
// lastVersionInfo.getCurrentVersion()).
// 6. Rename the backup collection to the name of the original collection with
// dropTarget set to true.
// We're only after the version bump in commitConfigUpgrade here since we never
// get into the critical section.
Status commitStatus = commitConfigUpgrade(configLoc.toString(),
lastVersionInfo.getCurrentVersion(),
MIN_COMPATIBLE_CONFIG_VERSION,
CURRENT_CONFIG_VERSION);
if (!commitStatus.isOK()) {
*errMsg = commitStatus.toString();
return false;
}
return true;
}
开发者ID:504com,项目名称:mongo,代码行数:56,代码来源:config_upgrade_v4_to_v5.cpp
示例3: TEST_F
TEST_F(ConfigUpgradeTests, EmptyVersion) {
//
// Tests detection of empty config version
//
// Zero version (no version doc)
VersionType oldVersion;
Status status = getConfigVersion(grid.catalogManager(), &oldVersion);
ASSERT(status.isOK());
ASSERT_EQUALS(oldVersion.getMinCompatibleVersion(), 0);
ASSERT_EQUALS(oldVersion.getCurrentVersion(), 0);
}
开发者ID:Amosvista,项目名称:mongo,代码行数:14,代码来源:config_upgrade_tests.cpp
示例4: _getConfigVersion
Status CatalogManagerReplicaSet::checkAndUpgrade(bool checkOnly) {
auto versionStatus = _getConfigVersion();
if (!versionStatus.isOK()) {
return versionStatus.getStatus();
}
auto versionInfo = versionStatus.getValue();
if (versionInfo.getMinCompatibleVersion() > CURRENT_CONFIG_VERSION) {
return {ErrorCodes::IncompatibleShardingConfigVersion,
str::stream() << "current version v" << CURRENT_CONFIG_VERSION
<< " is older than the cluster min compatible v"
<< versionInfo.getMinCompatibleVersion()};
}
if (versionInfo.getCurrentVersion() == UpgradeHistory_EmptyVersion) {
VersionType newVersion;
newVersion.setClusterId(OID::gen());
// For v3.2, only v3.2 binaries can talk to RS Config servers.
newVersion.setMinCompatibleVersion(CURRENT_CONFIG_VERSION);
newVersion.setCurrentVersion(CURRENT_CONFIG_VERSION);
BSONObj versionObj(newVersion.toBSON());
return update(VersionType::ConfigNS,
versionObj,
versionObj,
true /* upsert*/,
false /* multi */,
nullptr);
}
if (versionInfo.getCurrentVersion() == UpgradeHistory_UnreportedVersion) {
return {ErrorCodes::IncompatibleShardingConfigVersion,
"Assuming config data is old since the version document cannot be found in the"
"config server and it contains databases aside 'local' and 'admin'. "
"Please upgrade if this is the case. Otherwise, make sure that the config "
"server is clean."};
}
if (versionInfo.getCurrentVersion() < CURRENT_CONFIG_VERSION) {
return {ErrorCodes::IncompatibleShardingConfigVersion,
str::stream() << "need to upgrade current cluster version to v"
<< CURRENT_CONFIG_VERSION << "; currently at v"
<< versionInfo.getCurrentVersion()};
}
return Status::OK();
}
开发者ID:kritani,项目名称:mongo,代码行数:49,代码来源:catalog_manager_replica_set.cpp
示例5: versionObj
Status ShardingCatalogManager::_initConfigVersion(OperationContext* opCtx) {
const auto catalogClient = Grid::get(opCtx)->catalogClient();
auto versionStatus =
catalogClient->getConfigVersion(opCtx, repl::ReadConcernLevel::kLocalReadConcern);
if (!versionStatus.isOK()) {
return versionStatus.getStatus();
}
const auto& versionInfo = versionStatus.getValue();
if (versionInfo.getMinCompatibleVersion() > CURRENT_CONFIG_VERSION) {
return {ErrorCodes::IncompatibleShardingConfigVersion,
str::stream() << "current version v" << CURRENT_CONFIG_VERSION
<< " is older than the cluster min compatible v"
<< versionInfo.getMinCompatibleVersion()};
}
if (versionInfo.getCurrentVersion() == UpgradeHistory_EmptyVersion) {
VersionType newVersion;
newVersion.setClusterId(OID::gen());
newVersion.setMinCompatibleVersion(MIN_COMPATIBLE_CONFIG_VERSION);
newVersion.setCurrentVersion(CURRENT_CONFIG_VERSION);
BSONObj versionObj(newVersion.toBSON());
auto insertStatus = catalogClient->insertConfigDocument(
opCtx, VersionType::ConfigNS, versionObj, kNoWaitWriteConcern);
return insertStatus;
}
if (versionInfo.getCurrentVersion() == UpgradeHistory_UnreportedVersion) {
return {ErrorCodes::IncompatibleShardingConfigVersion,
"Assuming config data is old since the version document cannot be found in the "
"config server and it contains databases besides 'local' and 'admin'. "
"Please upgrade if this is the case. Otherwise, make sure that the config "
"server is clean."};
}
if (versionInfo.getCurrentVersion() < CURRENT_CONFIG_VERSION) {
return {ErrorCodes::IncompatibleShardingConfigVersion,
str::stream() << "need to upgrade current cluster version to v"
<< CURRENT_CONFIG_VERSION
<< "; currently at v"
<< versionInfo.getCurrentVersion()};
}
return Status::OK();
}
开发者ID:i80and,项目名称:mongo,代码行数:48,代码来源:sharding_catalog_manager.cpp
示例6: storeConfigVersion
/**
* Stores a newer { version, minVersion, currentVersion, clusterId } config server entry.
*
* @return clusterId
*/
OID storeConfigVersion(int configVersion) {
if (configVersion < CURRENT_CONFIG_VERSION) {
storeLegacyConfigVersion(configVersion);
return OID();
}
VersionType version;
version.setMinCompatibleVersion(configVersion);
version.setCurrentVersion(configVersion);
OID clusterId = OID::gen();
version.setClusterId(clusterId);
storeConfigVersion(version);
return clusterId;
}
开发者ID:Amosvista,项目名称:mongo,代码行数:23,代码来源:config_upgrade_tests.cpp
示例7: BSONObj
StatusWith<VersionType> ShardingCatalogClientImpl::getConfigVersion(
OperationContext* opCtx, repl::ReadConcernLevel readConcern) {
auto findStatus = Grid::get(opCtx)->shardRegistry()->getConfigShard()->exhaustiveFindOnConfig(
opCtx,
kConfigReadSelector,
readConcern,
VersionType::ConfigNS,
BSONObj(),
BSONObj(),
boost::none /* no limit */);
if (!findStatus.isOK()) {
return findStatus.getStatus();
}
auto queryResults = findStatus.getValue().docs;
if (queryResults.size() > 1) {
return {ErrorCodes::TooManyMatchingDocuments,
str::stream() << "should only have 1 document in " << VersionType::ConfigNS.ns()};
}
if (queryResults.empty()) {
VersionType versionInfo;
versionInfo.setMinCompatibleVersion(UpgradeHistory_EmptyVersion);
versionInfo.setCurrentVersion(UpgradeHistory_EmptyVersion);
versionInfo.setClusterId(OID{});
return versionInfo;
}
BSONObj versionDoc = queryResults.front();
auto versionTypeResult = VersionType::fromBSON(versionDoc);
if (!versionTypeResult.isOK()) {
return versionTypeResult.getStatus().withContext(
str::stream() << "Unable to parse config.version document " << versionDoc);
}
auto validationStatus = versionTypeResult.getValue().validate();
if (!validationStatus.isOK()) {
return Status(validationStatus.withContext(
str::stream() << "Unable to validate config.version document " << versionDoc));
}
return versionTypeResult.getValue();
}
开发者ID:ShaneHarvey,项目名称:mongo,代码行数:44,代码来源:sharding_catalog_client_impl.cpp
示例8: _nextUpgrade
// Dispatches upgrades based on version to the upgrades registered in the upgrade registry
bool _nextUpgrade(const ConnectionString& configLoc,
const ConfigUpgradeRegistry& registry,
const VersionType& lastVersionInfo,
VersionType* upgradedVersionInfo,
string* errMsg) {
int fromVersion = lastVersionInfo.getCurrentVersion();
ConfigUpgradeRegistry::const_iterator foundIt = registry.find(fromVersion);
if (foundIt == registry.end()) {
*errMsg = stream() << "newer version " << CURRENT_CONFIG_VERSION
<< " of mongo config metadata is required, " << "current version is "
<< fromVersion << ", "
<< "don't know how to upgrade from this version";
return false;
}
const Upgrade& upgrade = foundIt->second;
int toVersion = upgrade.toVersionRange.currentVersion;
log() << "starting next upgrade step from v" << fromVersion << " to v" << toVersion << endl;
// Log begin to config.changelog
grid.catalogManager()->logChange(NULL,
"starting upgrade of config database",
VersionType::ConfigNS,
BSON("from" << fromVersion << "to" << toVersion));
if (!upgrade.upgradeCallback(configLoc, lastVersionInfo, errMsg)) {
*errMsg = stream() << "error upgrading config database from v" << fromVersion << " to v"
<< toVersion << causedBy(errMsg);
return false;
}
// Get the config version we've upgraded to and make sure it's sane
Status verifyConfigStatus = getConfigVersion(configLoc, upgradedVersionInfo);
if (!verifyConfigStatus.isOK()) {
*errMsg = stream() << "failed to validate v" << fromVersion << " config version upgrade"
<< causedBy(verifyConfigStatus);
return false;
}
grid.catalogManager()->logChange(NULL,
"finished upgrade of config database",
VersionType::ConfigNS,
BSON("from" << fromVersion << "to" << toVersion));
return true;
}
开发者ID:Alessandra92,项目名称:mongo,代码行数:56,代码来源:config_upgrade.cpp
示例9: _exhaustiveFindOnConfig
StatusWith<VersionType> CatalogManagerReplicaSet::_getConfigVersion(OperationContext* txn) {
const auto configShard = grid.shardRegistry()->getShard(txn, "config");
const auto readHostStatus = configShard->getTargeter()->findHost(kConfigReadSelector);
if (!readHostStatus.isOK()) {
return readHostStatus.getStatus();
}
auto readHost = readHostStatus.getValue();
auto findStatus = _exhaustiveFindOnConfig(readHost,
NamespaceString(VersionType::ConfigNS),
BSONObj(),
BSONObj(),
boost::none /* no limit */);
if (!findStatus.isOK()) {
return findStatus.getStatus();
}
auto queryResults = findStatus.getValue().value;
if (queryResults.size() > 1) {
return {ErrorCodes::RemoteValidationError,
str::stream() << "should only have 1 document in " << VersionType::ConfigNS};
}
if (queryResults.empty()) {
auto countStatus =
_runCountCommandOnConfig(readHost, NamespaceString(ShardType::ConfigNS), BSONObj());
if (!countStatus.isOK()) {
return countStatus.getStatus();
}
const auto& shardCount = countStatus.getValue();
if (shardCount > 0) {
// Version document doesn't exist, but config.shards is not empty. Assuming that
// the current config metadata is pre v2.4.
VersionType versionInfo;
versionInfo.setMinCompatibleVersion(UpgradeHistory_UnreportedVersion);
versionInfo.setCurrentVersion(UpgradeHistory_UnreportedVersion);
return versionInfo;
}
VersionType versionInfo;
versionInfo.setMinCompatibleVersion(UpgradeHistory_EmptyVersion);
versionInfo.setCurrentVersion(UpgradeHistory_EmptyVersion);
return versionInfo;
}
BSONObj versionDoc = queryResults.front();
auto versionTypeResult = VersionType::fromBSON(versionDoc);
if (!versionTypeResult.isOK()) {
return Status(ErrorCodes::UnsupportedFormat,
str::stream() << "invalid config version document: " << versionDoc
<< versionTypeResult.getStatus().toString());
}
return versionTypeResult.getValue();
}
开发者ID:pgmarchenko,项目名称:mongo,代码行数:58,代码来源:catalog_manager_replica_set.cpp
示例10: isConfigVersionCompatible
// Checks version compatibility with our version
VersionStatus isConfigVersionCompatible(const VersionType& versionInfo, string* whyNot) {
string dummy;
if (!whyNot) whyNot = &dummy;
// Check if we're empty
if (versionInfo.getCurrentVersion() == UpgradeHistory_EmptyVersion) {
return VersionStatus_NeedUpgrade;
}
// Check that we aren't too old
if (CURRENT_CONFIG_VERSION < versionInfo.getMinCompatibleVersion()) {
*whyNot = stream() << "the config version " << CURRENT_CONFIG_VERSION
<< " of our process is too old "
<< "for the detected config version "
<< versionInfo.getMinCompatibleVersion();
return VersionStatus_Incompatible;
}
// Check that the mongo version of this process hasn't been excluded from the cluster
vector<MongoVersionRange> excludedRanges;
if (versionInfo.isExcludingMongoVersionsSet() &&
!MongoVersionRange::parseBSONArray(versionInfo.getExcludingMongoVersions(),
&excludedRanges,
whyNot))
{
*whyNot = stream() << "could not understand excluded version ranges"
<< causedBy(whyNot);
return VersionStatus_Incompatible;
}
// versionString is the global version of this process
if (isInMongoVersionRanges(versionString, excludedRanges)) {
// Cast needed here for MSVC compiler issue
*whyNot = stream() << "not compatible with current config version, version "
<< reinterpret_cast<const char*>(versionString)
<< "has been excluded.";
return VersionStatus_Incompatible;
}
// Check if we need to upgrade
if (versionInfo.getCurrentVersion() >= CURRENT_CONFIG_VERSION) {
return VersionStatus_Compatible;
}
return VersionStatus_NeedUpgrade;
}
开发者ID:andredefrere,项目名称:mongo,代码行数:54,代码来源:config_upgrade.cpp
示例11: doUpgradeV0ToV7
/**
* Upgrade v0 to v7 described here
*
* This upgrade takes the config server from empty to an initial version.
*/
bool doUpgradeV0ToV7(const ConnectionString& configLoc,
const VersionType& lastVersionInfo,
string* errMsg) {
string dummy;
if (!errMsg) errMsg = &dummy;
verify(lastVersionInfo.getCurrentVersion() == UpgradeHistory_EmptyVersion);
//
// Even though the initial config write is a single-document update, that single document
// is on multiple config servers and requests can interleave. The upgrade lock prevents
// this.
//
log() << "writing initial config version at v" << CURRENT_CONFIG_VERSION;
OID newClusterId = OID::gen();
VersionType versionInfo;
// Upgrade to new version
versionInfo.setMinCompatibleVersion(MIN_COMPATIBLE_CONFIG_VERSION);
versionInfo.setCurrentVersion(CURRENT_CONFIG_VERSION);
versionInfo.setClusterId(newClusterId);
verify(versionInfo.isValid(NULL));
// If the cluster has not previously been initialized, we need to set the version before
// using so subsequent mongoses use the config data the same way. This requires all three
// config servers online initially.
Status result = grid.catalogManager()->update(
VersionType::ConfigNS,
BSON("_id" << 1),
versionInfo.toBSON(),
true, // upsert
false, // multi
NULL);
if (!result.isOK()) {
*errMsg = stream() << "error writing initial config version: "
<< result.reason();
return false;
}
return true;
}
开发者ID:7segments,项目名称:mongo-1,代码行数:52,代码来源:config_upgrade_v0_to_v7.cpp
示例12: doUpgradeV0ToV5
/**
* Upgrade v0 to v5 described here
*
* This upgrade takes the config server from empty to an initial version.
*/
bool doUpgradeV0ToV5(const ConnectionString& configLoc,
const VersionType& lastVersionInfo,
string* errMsg)
{
string dummy;
if (!errMsg) errMsg = &dummy;
verify(lastVersionInfo.getCurrentVersion() == UpgradeHistory_EmptyVersion);
//
// Even though the initial config write is a single-document update, that single document
// is on multiple config servers and requests can interleave. The upgrade lock prevents
// this.
//
log() << "writing initial config version at v" << CURRENT_CONFIG_VERSION << endl;
OID newClusterId = OID::gen();
VersionType versionInfo;
// Upgrade to new version
versionInfo.setMinCompatibleVersion(MIN_COMPATIBLE_CONFIG_VERSION);
versionInfo.setCurrentVersion(CURRENT_CONFIG_VERSION);
versionInfo.setClusterId(newClusterId);
verify(versionInfo.isValid(NULL));
// If the cluster has not previously been initialized, we need to set the version before
// using so subsequent mongoses use the config data the same way. This requires all three
// config servers online initially.
try {
ScopedDbConnection conn(configLoc, 30);
conn->update(VersionType::ConfigNS, BSON("_id" << 1), versionInfo.toBSON(), true);
_checkGLE(conn);
conn.done();
}
catch (const DBException& e) {
*errMsg = stream() << "error writing initial config version" << causedBy(e);
return false;
}
return true;
}
开发者ID:Cassie90,项目名称:mongo,代码行数:51,代码来源:config_upgrade_v0_to_v5.cpp
示例13: checkAndInitConfigVersion
Status checkAndInitConfigVersion(OperationContext* txn,
CatalogManager* catalogManager,
DistLockManager* distLockManager) {
VersionType versionInfo;
Status status = getConfigVersion(catalogManager, &versionInfo);
if (!status.isOK()) {
return status;
}
string errMsg;
VersionStatus comp = isConfigVersionCompatible(versionInfo, &errMsg);
if (comp == VersionStatus_Incompatible)
return {ErrorCodes::IncompatibleShardingMetadata, errMsg};
if (comp == VersionStatus_Compatible)
return Status::OK();
invariant(comp == VersionStatus_NeedUpgrade);
if (versionInfo.getCurrentVersion() != UpgradeHistory_EmptyVersion) {
return {ErrorCodes::IncompatibleShardingMetadata,
stream() << "newer version " << CURRENT_CONFIG_VERSION
<< " of mongo config metadata is required, "
<< "current version is " << versionInfo.getCurrentVersion()};
}
// Contact the config servers to make sure all are online - otherwise we wait a long time
// for locks.
status = _checkConfigServersAlive(grid.shardRegistry()->getConfigServerConnectionString());
if (!status.isOK()) {
return status;
}
//
// Acquire a lock for the upgrade process.
//
// We want to ensure that only a single mongo process is upgrading the config server at a
// time.
//
string whyMessage(stream() << "initializing config database to new format v"
<< CURRENT_CONFIG_VERSION);
auto lockTimeout = stdx::chrono::minutes(20);
auto scopedDistLock = distLockManager->lock(txn, "configUpgrade", whyMessage, lockTimeout);
if (!scopedDistLock.isOK()) {
return scopedDistLock.getStatus();
}
//
// Double-check compatibility inside the upgrade lock
// Another process may have won the lock earlier and done the upgrade for us, check
// if this is the case.
//
status = getConfigVersion(catalogManager, &versionInfo);
if (!status.isOK()) {
return status;
}
comp = isConfigVersionCompatible(versionInfo, &errMsg);
if (comp == VersionStatus_Incompatible) {
return {ErrorCodes::IncompatibleShardingMetadata, errMsg};
}
if (comp == VersionStatus_Compatible)
return Status::OK();
invariant(comp == VersionStatus_NeedUpgrade);
//
// Run through the upgrade steps necessary to bring our config version to the current
// version
//
log() << "initializing config server version to " << CURRENT_CONFIG_VERSION;
status = makeConfigVersionDocument(txn, catalogManager);
if (!status.isOK())
return status;
log() << "initialization of config server to v" << CURRENT_CONFIG_VERSION << " successful";
return Status::OK();
}
开发者ID:Jonekee,项目名称:mongo,代码行数:84,代码来源:config_upgrade.cpp
示例14: doUpgradeV3ToV4
/**
* Upgrade v3 to v4 described here.
*
* This upgrade takes a config server without collection epochs (potentially) and adds
* epochs to all mongo processes.
*
*/
bool doUpgradeV3ToV4(const ConnectionString& configLoc,
const VersionType& lastVersionInfo,
string* errMsg)
{
string dummy;
if (!errMsg) errMsg = &dummy;
verify(lastVersionInfo.getCurrentVersion() == UpgradeHistory_NoEpochVersion);
if (lastVersionInfo.isUpgradeIdSet() && lastVersionInfo.getUpgradeId().isSet()) {
//
// Another upgrade failed, so cleanup may be necessary
//
BSONObj lastUpgradeState = lastVersionInfo.getUpgradeState();
bool inCriticalSection;
if (!FieldParser::extract(lastUpgradeState,
inCriticalSectionField,
&inCriticalSection,
errMsg))
{
*errMsg = stream() << "problem reading previous upgrade state" << causedBy(errMsg);
return false;
}
if (inCriticalSection) {
// Manual intervention is needed here. Somehow our upgrade didn't get applied
// consistently across config servers.
*errMsg = cannotCleanupMessage;
return false;
}
if (!_cleanupUpgradeState(configLoc, lastVersionInfo.getUpgradeId(), errMsg)) {
// If we can't cleanup the old upgrade state, the user might have done it for us,
// not a fatal problem (we'll just end up with extra collections).
warning() << "could not cleanup previous upgrade state" << causedBy(errMsg) << endl;
*errMsg = "";
}
}
//
// Check the versions of other mongo processes in the cluster before upgrade.
// We can't upgrade if there are active pre-v2.2 processes in the cluster
//
Status mongoVersionStatus = checkClusterMongoVersions(configLoc,
string(minMongoProcessVersion));
if (!mongoVersionStatus.isOK()) {
*errMsg = stream() << "cannot upgrade with pre-v" << minMongoProcessVersion
<< " mongo processes active in the cluster"
<< causedBy(mongoVersionStatus);
return false;
}
VersionType newVersionInfo;
lastVersionInfo.cloneTo(&newVersionInfo);
// Set our upgrade id and state
OID upgradeId = OID::gen();
newVersionInfo.setUpgradeId(upgradeId);
newVersionInfo.setUpgradeState(BSONObj());
// Write our upgrade id and state
{
scoped_ptr<ScopedDbConnection> connPtr;
try {
connPtr.reset(ScopedDbConnection::getInternalScopedDbConnection(configLoc, 30));
ScopedDbConnection& conn = *connPtr;
verify(newVersionInfo.isValid(NULL));
conn->update(VersionType::ConfigNS,
BSON("_id" << 1 << VersionType::version_DEPRECATED(3)),
newVersionInfo.toBSON());
_checkGLE(conn);
}
catch (const DBException& e) {
*errMsg = stream() << "could not initialize version info for upgrade"
<< causedBy(e);
//.........这里部分代码省略.........
开发者ID:xiaohangyu,项目名称:mongo,代码行数:101,代码来源:config_upgrade_v3_to_v4.cpp
示例15: storeConfigVersion
/**
* Stores a newer { version, minVersion, currentVersion, clusterId } config server entry
*/
void storeConfigVersion(const VersionType& versionInfo) {
client().insert(VersionType::ConfigNS, versionInfo.toBSON());
}
开发者ID:ANTco,项目名称:mongo,代码行数:6,代码来源:config_upgrade_tests.cpp
示例16: doUpgradeV5ToV6
/**
* Upgrades v5 to v6.
*/
bool doUpgradeV5ToV6(const ConnectionString& configLoc,
const VersionType& lastVersionInfo,
string* errMsg) {
string dummy;
if (!errMsg)
errMsg = &dummy;
verify(lastVersionInfo.getCurrentVersion() == UpgradeHistory_DummyBumpPre2_6);
Status result = preUpgradeCheck(configLoc, lastVersionInfo, minMongoProcessVersion);
if (!result.isOK()) {
if (result.code() == ErrorCodes::ManualInterventionRequired) {
*errMsg = cannotCleanupMessage;
} else {
*errMsg = result.toString();
}
return false;
}
// This is not needed because we are not actually going to make any modifications
// on the other collections in the config server for this particular upgrade.
// startConfigUpgrade(configLoc.toString(),
// lastVersionInfo.getCurrentVersion(),
// OID::gen());
// If we actually need to modify something in the config servers these need to follow
// after calling startConfigUpgrade(...):
//
// 1. Acquire necessary locks.
// 2. Make a backup of the collections we are about to modify.
// 3. Perform the upgrade process on the backup collection.
// 4. Verify that no changes were made to the collections since the backup was performed.
// 5. Call enterConfigUpgradeCriticalSection(configLoc.toString(),
// lastVersionInfo.getCurrentVersion()).
// 6. Rename the backup collection to the name of the original collection with
// dropTarget set to true.
// Make sure the { ts: 1 } index is not unique by dropping the existing one
// and rebuilding the index with the right specification.
const BSONObj lockIdxKey = BSON(LocksType::lockID() << 1);
const NamespaceString indexNS(LocksType::ConfigNS);
bool dropOk = false;
try {
ScopedDbConnection conn(configLoc);
BSONObj dropResponse;
dropOk = conn->runCommand(indexNS.db().toString(),
BSON("dropIndexes" << indexNS.coll() << "index" << lockIdxKey),
dropResponse);
conn.done();
} catch (const DBException& ex) {
if (ex.getCode() == 13105) {
// 13105 is the exception code from SyncClusterConnection::findOne that gets
// thrown when one of the command responses has an "ok" field that is not true.
dropOk = false;
} else {
*errMsg = str::stream() << "Failed to drop { ts: 1 } index" << causedBy(ex);
return false;
}
}
if (!dropOk && hasBadIndex(configLoc, errMsg)) {
// Fail only if the index still exists.
return false;
}
result = clusterCreateIndex(LocksType::ConfigNS,
BSON(LocksType::lockID() << 1),
false, // unique
WriteConcernOptions::AllConfigs,
NULL);
if (!result.isOK()) {
*errMsg = str::stream() << "error while creating { ts: 1 } index on config db"
<< causedBy(result);
return false;
}
LOG(1) << "Checking to make sure that the right { ts: 1 } index is created...";
if (hasBadIndex(configLoc, errMsg)) {
return false;
}
// We're only after the version bump in commitConfigUpgrade here since we never
// get into the critical section.
Status commitStatus = commitConfigUpgrade(configLoc.toString(),
lastVersionInfo.getCurrentVersion(),
MIN_COMPATIBLE_CONFIG_VERSION,
CURRENT_CONFIG_VERSION);
if (!commitStatus.isOK()) {
*errMsg = commitStatus.toString();
return false;
}
//.........这里部分代码省略.........
开发者ID:DavidAlphaFox,项目名称:mongodb,代码行数:101,代码来源:config_upgrade_v5_to_v6.cpp
示例17: _getConfigVersion
Status CatalogManagerReplicaSet::initConfigVersion(OperationContext* txn) {
for (int x = 0; x < kMaxConfigVersionInitRetry; x++) {
auto versionStatus = _getConfigVersion(txn);
if (!versionStatus.isOK()) {
return versionStatus.getStatus();
}
auto versionInfo = versionStatus.getValue();
if (versionInfo.getMinCompatibleVersion() > CURRENT_CONFIG_VERSION) {
return {ErrorCodes::IncompatibleShardingConfigVersion,
str::stream() << "current version v" << CURRENT_CONFIG_VERSION
<< " is older than the cluster min compatible v"
<< versionInfo.getMinCompatibleVersion()};
}
if (versionInfo.getCurrentVersion() == UpgradeHistory_EmptyVersion) {
VersionType newVersion;
newVersion.setClusterId(OID::gen());
newVersion.setMinCompatibleVersion(MIN_COMPATIBLE_CONFIG_VERSION);
newVersion.setCurrentVersion(CURRENT_CONFIG_VERSION);
BSONObj versionObj(newVersion.toBSON());
BatchedCommandResponse response;
auto upsertStatus = update(txn,
VersionType::ConfigNS,
versionObj,
versionObj,
true /* upsert*/,
false /* multi */,
&response);
if ((upsertStatus.isOK() && response.getN() < 1) ||
upsertStatus == ErrorCodes::DuplicateKey) {
// Do the check again as someone inserted a new config version document
// and the upsert neither inserted nor updated a config version document.
// Note: you can get duplicate key errors on upsert because of SERVER-14322.
continue;
}
return upsertStatus;
}
if (versionInfo.getCurrentVersion() == UpgradeHistory_UnreportedVersion) {
return {ErrorCodes::IncompatibleShardingConfigVersion,
"Assuming config data is old since the version document cannot be found in the "
"config server and it contains databases aside 'local' and 'admin'. "
"Please upgrade if this is the case. Otherwise, make sure that the config "
"server is clean."};
}
if (versionInfo.getCurrentVersion() < CURRENT_CONFIG_VERSION) {
return {ErrorCodes::IncompatibleShardingConfigVersion,
str::stream() << "need to upgrade current cluster version to v"
<< CURRENT_CONFIG_VERSION << "; currently at v"
<< versionInfo.getCurrentVersion()};
}
return Status::OK();
}
return {ErrorCodes::IncompatibleShardingConfigVersion,
str::stream() << "unable to create new config version document after "
<< kMaxConfigVersionInitRetry << " retries"};
}
开发者ID:himanshugpt,项目名称:mongo,代码行数:64,代码来源:catalog_manager_replica_set.cpp
示例18: NamespaceString
StatusWith<VersionType> CatalogManagerReplicaSet::_getConfigVersion() {
const auto configShard = grid.shardRegistry()->getShard("config");
const auto readHostStatus = configShard->getTargeter()->findHost(kConfigReadSelector);
if (!readHostStatus.isOK()) {
return readHostStatus.getStatus();
}
auto readHost = readHostStatus.getValue();
auto findStatus = grid.shardRegistry()->exhaustiveFind(readHost,
NamespaceString(VersionType::ConfigNS),
BSONObj(),
BSONObj(),
boost::none /* no limit */);
if (!findStatus.isOK()) {
return findStatus.getStatus();
}
auto queryResults = findStatus.getValue();
if (queryResults.size() > 1) {
return {ErrorCodes::RemoteValidationError,
str::stream() << "should only have 1 document in " << VersionType::ConfigNS};
}
if (queryResults.empty()) {
auto cmdStatus =
grid.shardRegistry()->runCommand(readHost, "admin", BSON("listDatabases" << 1));
if (!cmdStatus.isOK()) {
return cmdStatus.getStatus();
}
const BSONObj& cmdResult = cmdStatus.getValue();
Status cmdResultStatus = getStatusFromCommandResult(cmdResult);
if (!cmdResultStatus.isOK()) {
return cmdResultStatus;
}
for (const auto& dbEntry : cmdResult["databases"].Obj()) {
const string& dbName = dbEntry["name"].String();
if (dbName != "local" && dbName != "admin") {
VersionType versionInfo;
versionInfo.setMinCompatibleVersion(UpgradeHistory_UnreportedVersion);
versionInfo.setCurrentVersion(UpgradeHistory_UnreportedVersion);
return versionInfo;
}
}
VersionType versionInfo;
versionInfo.setMinCompatibleVersion(
|
请发表评论