diff options
Diffstat (limited to 'src/mongo/db/s/operation_sharding_state.cpp')
| -rw-r--r-- | src/mongo/db/s/operation_sharding_state.cpp | 79 |
1 files changed, 21 insertions, 58 deletions
diff --git a/src/mongo/db/s/operation_sharding_state.cpp b/src/mongo/db/s/operation_sharding_state.cpp index 6cb56a03795..0419fb1e895 100644 --- a/src/mongo/db/s/operation_sharding_state.cpp +++ b/src/mongo/db/s/operation_sharding_state.cpp @@ -60,64 +60,29 @@ void OperationShardingState::setShardRole(OperationContext* opCtx, const boost::optional<DatabaseVersion>& databaseVersion) { auto& oss = OperationShardingState::get(opCtx); - bool shardVersionInserted = false; - bool databaseVersionInserted = false; - try { - boost::optional<OperationShardingState::ShardVersionTracker&> shardVersionTracker; - if (shardVersion) { - auto emplaceResult = oss._shardVersions.try_emplace(nss.ns(), *shardVersion); - shardVersionInserted = emplaceResult.second; - shardVersionTracker = emplaceResult.first->second; - if (!shardVersionInserted) { - uassert(640570, - str::stream() - << "Illegal attempt to change the expected shard version for " << nss - << " from " << shardVersionTracker->v << " to " << *shardVersion - << " at recursion level " << shardVersionTracker->recursion, - shardVersionTracker->v == *shardVersion); - invariant(shardVersionTracker->recursion > 0); - } else { - invariant(shardVersionTracker->recursion == 0); - } - } - - boost::optional<OperationShardingState::DatabaseVersionTracker&> dbVersionTracker; - if (databaseVersion) { - auto emplaceResult = oss._databaseVersions.try_emplace(nss.db(), *databaseVersion); - databaseVersionInserted = emplaceResult.second; - dbVersionTracker = emplaceResult.first->second; - if (!databaseVersionInserted) { - uassert(640571, - str::stream() - << "Illegal attempt to change the expected database version for " - << nss.db() << " from " << dbVersionTracker->v << " to " - << *databaseVersion << " at recursion level " - << dbVersionTracker->recursion, - dbVersionTracker->v == *databaseVersion); - invariant(dbVersionTracker->recursion > 0); - } else { - invariant(dbVersionTracker->recursion == 0); - } + if (shardVersion) { + auto emplaceResult = oss._shardVersions.try_emplace(nss.ns(), *shardVersion); + auto& tracker = emplaceResult.first->second; + if (!emplaceResult.second) { + uassert(640570, + str::stream() << "Illegal attempt to change the expected shard version for " + << nss << " from " << tracker.v << " to " << *shardVersion, + tracker.v == *shardVersion); } + invariant(++tracker.recursion > 0); + } - // Update the recursion at the end to preserve the strong exception guarantee. - if (shardVersionTracker) { - shardVersionTracker->recursion++; - } - if (dbVersionTracker) { - dbVersionTracker->recursion++; + if (databaseVersion) { + auto emplaceResult = oss._databaseVersions.try_emplace(nss.db(), *databaseVersion); + auto& tracker = emplaceResult.first->second; + if (!emplaceResult.second) { + uassert(640571, + str::stream() << "Illegal attempt to change the expected database version for " + << nss.db() << " from " << tracker.v << " to " + << *databaseVersion, + tracker.v == *databaseVersion); } - } catch (const DBException&) { - // Clean any oss update done within this method on failure to get a strong exception - // guarantee on ScopedSetShardRole objects. - if (shardVersionInserted) { - oss._shardVersions.erase(nss.ns()); - } - if (databaseVersionInserted) { - oss._databaseVersions.erase(nss.db()); - } - - throw; + invariant(++tracker.recursion > 0); } } @@ -191,19 +156,17 @@ using ScopedAllowImplicitCollectionCreate_UNSAFE = OperationShardingState::ScopedAllowImplicitCollectionCreate_UNSAFE; ScopedAllowImplicitCollectionCreate_UNSAFE::ScopedAllowImplicitCollectionCreate_UNSAFE( - OperationContext* opCtx, bool forceCSRAsUnknownAfterCollectionCreation) + OperationContext* opCtx) : _opCtx(opCtx) { auto& oss = get(_opCtx); invariant(!oss._allowCollectionCreation); oss._allowCollectionCreation = true; - oss._forceCSRAsUnknownAfterCollectionCreation = forceCSRAsUnknownAfterCollectionCreation; } ScopedAllowImplicitCollectionCreate_UNSAFE::~ScopedAllowImplicitCollectionCreate_UNSAFE() { auto& oss = get(_opCtx); invariant(oss._allowCollectionCreation); oss._allowCollectionCreation = false; - oss._forceCSRAsUnknownAfterCollectionCreation = false; } ScopedSetShardRole::ScopedSetShardRole(OperationContext* opCtx, |
