Skip to content

Commit f934c24

Browse files
committed
SERVER-42754 Make RSMChangeListeners for shard configs exception-safe
1 parent 2b2b266 commit f934c24

File tree

2 files changed

+31
-21
lines changed

2 files changed

+31
-21
lines changed

src/mongo/db/s/sharding_initialization_mongod.cpp

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -105,27 +105,33 @@ class ShardingReplicaSetChangeListener final : public ReplicaSetChangeNotifier::
105105
LOG(2) << "Unable to schedule confirmed set update due to " << status;
106106
return;
107107
}
108-
uassertStatusOK(status);
108+
invariant(status);
109109

110-
LOG(0) << "Updating config server with confirmed set " << connStr;
111-
Grid::get(serviceContext)->shardRegistry()->updateReplSetHosts(connStr);
110+
try {
111+
LOG(0) << "Updating config server with confirmed set " << connStr;
112+
Grid::get(serviceContext)->shardRegistry()->updateReplSetHosts(connStr);
112113

113-
if (MONGO_FAIL_POINT(failUpdateShardIdentityConfigString)) {
114-
return;
115-
}
114+
if (MONGO_FAIL_POINT(failUpdateShardIdentityConfigString)) {
115+
return;
116+
}
116117

117-
auto configsvrConnStr =
118-
Grid::get(serviceContext)->shardRegistry()->getConfigServerConnectionString();
118+
auto configsvrConnStr = Grid::get(serviceContext)
119+
->shardRegistry()
120+
->getConfigServerConnectionString();
119121

120-
// Only proceed if the notification is for the configsvr
121-
if (configsvrConnStr.getSetName() != connStr.getSetName()) {
122-
return;
123-
}
122+
// Only proceed if the notification is for the configsvr
123+
if (configsvrConnStr.getSetName() != connStr.getSetName()) {
124+
return;
125+
}
124126

125-
ThreadClient tc("updateShardIdentityConfigString", serviceContext);
126-
auto opCtx = tc->makeOperationContext();
127+
ThreadClient tc("updateShardIdentityConfigString", serviceContext);
128+
auto opCtx = tc->makeOperationContext();
127129

128-
ShardingInitializationMongoD::updateShardIdentityConfigString(opCtx.get(), connStr);
130+
ShardingInitializationMongoD::updateShardIdentityConfigString(opCtx.get(),
131+
connStr);
132+
} catch (const ExceptionForCat<ErrorCategory::ShutdownError>& e) {
133+
LOG(0) << "Unable to update config server due to " << e;
134+
}
129135
});
130136
}
131137
void onPossibleSet(const State& state) final {

src/mongo/s/server.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -432,16 +432,20 @@ class ShardingReplicaSetChangeListener final : public ReplicaSetChangeNotifier::
432432
if (ErrorCodes::isCancelationError(args.status.code())) {
433433
return;
434434
}
435-
uassertStatusOK(args.status);
435+
invariant(args.status);
436436

437-
LOG(0) << "Updating sharding state with confirmed set " << connStr;
437+
try {
438+
LOG(0) << "Updating sharding state with confirmed set " << connStr;
438439

439-
Grid::get(serviceContext)->shardRegistry()->updateReplSetHosts(connStr);
440+
Grid::get(serviceContext)->shardRegistry()->updateReplSetHosts(connStr);
440441

441-
if (MONGO_FAIL_POINT(failReplicaSetChangeConfigServerUpdateHook)) {
442-
return;
442+
if (MONGO_FAIL_POINT(failReplicaSetChangeConfigServerUpdateHook)) {
443+
return;
444+
}
445+
ShardRegistry::updateReplicaSetOnConfigServer(serviceContext, connStr);
446+
} catch (const ExceptionForCat<ErrorCategory::ShutdownError>& e) {
447+
LOG(0) << "Unable to update sharding state due to " << e;
443448
}
444-
ShardRegistry::updateReplicaSetOnConfigServer(serviceContext, connStr);
445449
};
446450

447451
auto executor = Grid::get(_serviceContext)->getExecutorPool()->getFixedExecutor();

0 commit comments

Comments
 (0)