summaryrefslogtreecommitdiff
path: root/src/mongo/db/s/operation_sharding_state.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/s/operation_sharding_state.cpp')
-rw-r--r--src/mongo/db/s/operation_sharding_state.cpp79
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,