Status CatalogManager::createDatabase(const std::string& dbName) { invariant(nsIsDbOnly(dbName)); // The admin and config databases should never be explicitly created. They "just exist", // i.e. getDatabase will always return an entry for them. invariant(dbName != "admin"); invariant(dbName != "config"); // Lock the database globally to prevent conflicts with simultaneous database creation. auto scopedDistLock = getDistLockManager()->lock(dbName, "createDatabase", Seconds{5000}, Milliseconds{500}); if (!scopedDistLock.isOK()) { return scopedDistLock.getStatus(); } // check for case sensitivity violations Status status = _checkDbDoesNotExist(dbName); if (!status.isOK()) { return status; } // Database does not exist, pick a shard and create a new entry auto newShardIdStatus = selectShardForNewDatabase(grid.shardRegistry()); if (!newShardIdStatus.isOK()) { return newShardIdStatus.getStatus(); } const ShardId& newShardId = newShardIdStatus.getValue(); log() << "Placing [" << dbName << "] on: " << newShardId; DatabaseType db; db.setName(dbName); db.setPrimary(newShardId); db.setSharded(false); BatchedCommandResponse response; status = insert(DatabaseType::ConfigNS, db.toBSON(), &response); if (status.code() == ErrorCodes::DuplicateKey) { return Status(ErrorCodes::NamespaceExists, "database " + dbName + " already exists"); } return status; }
Status CatalogManager::updateDatabase(const std::string& dbName, const DatabaseType& db) { fassert(28616, db.validate()); BatchedCommandResponse response; Status status = update(DatabaseType::ConfigNS, BSON(DatabaseType::name(dbName)), db.toBSON(), true, // upsert false, // multi &response); if (!status.isOK()) { return Status(status.code(), str::stream() << "database metadata write failed: " << response.toBSON() << "; status: " << status.toString()); } return Status::OK(); }