summaryrefslogtreecommitdiff
path: root/src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp')
-rw-r--r--src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp67
1 files changed, 35 insertions, 32 deletions
diff --git a/src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp b/src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp
index 6e53cd31590..674064e21f1 100644
--- a/src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp
+++ b/src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp
@@ -821,8 +821,8 @@ bool CatalogManagerReplicaSet::runUserManagementWriteCommand(OperationContext* t
cmdToRun = modifiedCmd.obj();
}
- auto response =
- grid.shardRegistry()->runCommandOnConfigWithNotMasterRetries(txn, dbname, cmdToRun);
+ auto response = grid.shardRegistry()->runCommandOnConfigWithRetries(
+ txn, dbname, cmdToRun, ShardRegistry::kNotMasterErrors);
if (!response.isOK()) {
return Command::appendCommandStatus(*result, response.getStatus());
@@ -865,15 +865,9 @@ bool CatalogManagerReplicaSet::runUserManagementReadCommand(OperationContext* tx
Status CatalogManagerReplicaSet::applyChunkOpsDeprecated(OperationContext* txn,
const BSONArray& updateOps,
const BSONArray& preCondition) {
- ShardRegistry::ErrorCodesSet networkOrNotMasterErrors{ErrorCodes::NotMaster,
- ErrorCodes::NotMasterNoSlaveOk,
- ErrorCodes::HostUnreachable,
- ErrorCodes::HostNotFound,
- ErrorCodes::NetworkTimeout};
-
BSONObj cmd = BSON("applyOps" << updateOps << "preCondition" << preCondition);
auto response = grid.shardRegistry()->runCommandOnConfigWithRetries(
- txn, "config", cmd, networkOrNotMasterErrors);
+ txn, "config", cmd, ShardRegistry::kNetworkOrNotMasterErrors);
if (!response.isOK()) {
return response.getStatus();
@@ -897,12 +891,21 @@ DistLockManager* CatalogManagerReplicaSet::getDistLockManager() {
void CatalogManagerReplicaSet::writeConfigServerDirect(OperationContext* txn,
const BatchedCommandRequest& batchRequest,
BatchedCommandResponse* batchResponse) {
- std::string dbname = batchRequest.getNS().db().toString();
+ _runBatchWriteCommand(txn, batchRequest, batchResponse, ShardRegistry::kNotMasterErrors);
+}
+
+void CatalogManagerReplicaSet::_runBatchWriteCommand(
+ OperationContext* txn,
+ const BatchedCommandRequest& batchRequest,
+ BatchedCommandResponse* batchResponse,
+ const ShardRegistry::ErrorCodesSet& errorsToCheck) {
+ const std::string dbname = batchRequest.getNS().db().toString();
invariant(dbname == "config" || dbname == "admin");
+
const BSONObj cmdObj = batchRequest.toBSON();
auto response =
- grid.shardRegistry()->runCommandOnConfigWithNotMasterRetries(txn, dbname, cmdObj);
+ grid.shardRegistry()->runCommandOnConfigWithRetries(txn, dbname, cmdObj, errorsToCheck);
if (!response.isOK()) {
_toBatchError(response.getStatus(), batchResponse);
return;
@@ -934,7 +937,7 @@ Status CatalogManagerReplicaSet::insertConfigDocument(OperationContext* txn,
for (int retry = 1; retry <= kMaxWriteRetry; retry++) {
BatchedCommandResponse response;
- writeConfigServerDirect(txn, request, &response);
+ _runBatchWriteCommand(txn, request, &response, ShardRegistry::kNotMasterErrors);
Status status = response.toStatus();
@@ -958,16 +961,25 @@ Status CatalogManagerReplicaSet::insertConfigDocument(OperationContext* txn,
}
auto existingDocs = fetchDuplicate.getValue().value;
+ if (existingDocs.empty()) {
+ return Status(ErrorCodes::DuplicateKey,
+ stream() << "DuplicateKey error" << causedBy(status)
+ << " was returned after a retry attempt, but no documents "
+ "were found. This means a concurrent change occurred "
+ "together with the retries.");
+ }
+
invariant(existingDocs.size() == 1);
BSONObj existing = std::move(existingDocs.front());
if (existing.woCompare(doc) == 0) {
// Documents match, so treat the operation as success
- status = Status::OK();
+ return Status::OK();
}
}
- if (ErrorCodes::isNetworkError(status.code()) && (retry < kMaxWriteRetry)) {
+ if (ShardRegistry::kNetworkOrNotMasterErrors.count(status.code()) &&
+ (retry < kMaxWriteRetry)) {
continue;
}
@@ -1031,20 +1043,10 @@ Status CatalogManagerReplicaSet::removeConfigDocuments(OperationContext* txn,
request.setNS(nss);
request.setWriteConcern(WriteConcernOptions::Majority);
- for (int retry = 1; retry <= kMaxWriteRetry; retry++) {
- BatchedCommandResponse response;
- writeConfigServerDirect(txn, request, &response);
-
- Status status = response.toStatus();
-
- if (ErrorCodes::isNetworkError(status.code()) && (retry < kMaxWriteRetry)) {
- continue;
- }
-
- return status;
- }
+ BatchedCommandResponse response;
+ _runBatchWriteCommand(txn, request, &response, ShardRegistry::kNetworkOrNotMasterErrors);
- MONGO_UNREACHABLE;
+ return response.toStatus();
}
Status CatalogManagerReplicaSet::_checkDbDoesNotExist(OperationContext* txn,
@@ -1132,8 +1134,8 @@ Status CatalogManagerReplicaSet::_createCappedConfigCollection(OperationContext*
StringData collName,
int cappedSize) {
BSONObj createCmd = BSON("create" << collName << "capped" << true << "size" << cappedSize);
- auto result =
- grid.shardRegistry()->runCommandOnConfigWithNotMasterRetries(txn, "config", createCmd);
+ auto result = grid.shardRegistry()->runCommandOnConfigWithRetries(
+ txn, "config", createCmd, ShardRegistry::kNetworkOrNotMasterErrors);
if (!result.isOK()) {
return result.getStatus();
}
@@ -1305,14 +1307,15 @@ StatusWith<BSONObj> CatalogManagerReplicaSet::_runReadCommand(
OperationContext* txn,
const std::string& dbname,
const BSONObj& cmdObj,
- const ReadPreferenceSetting& settings) {
+ const ReadPreferenceSetting& readPref) {
for (int retry = 1; retry <= kMaxReadRetry; ++retry) {
- auto response = grid.shardRegistry()->runCommandOnConfig(txn, settings, dbname, cmdObj);
+ auto response = grid.shardRegistry()->runCommandOnConfig(txn, readPref, dbname, cmdObj);
if (response.isOK()) {
return response;
}
- if (ErrorCodes::isNetworkError(response.getStatus().code()) && retry < kMaxReadRetry) {
+ if (ShardRegistry::kNetworkOrNotMasterErrors.count(response.getStatus().code()) &&
+ retry < kMaxReadRetry) {
continue;
}