Status CatalogManagerCommon::_log(OperationContext* txn, const StringData& logCollName, const std::string& what, const std::string& operationNS, const BSONObj& detail) { Date_t now = grid.shardRegistry()->getExecutor()->now(); const std::string hostName = grid.shardRegistry()->getNetwork()->getHostName(); const string changeId = str::stream() << hostName << "-" << now.toString() << "-" << OID::gen(); ChangeLogType changeLog; changeLog.setChangeId(changeId); changeLog.setServer(hostName); changeLog.setClientAddr(txn->getClient()->clientAddress(true)); changeLog.setTime(now); changeLog.setNS(operationNS); changeLog.setWhat(what); changeLog.setDetails(detail); BSONObj changeLogBSON = changeLog.toBSON(); log() << "about to log metadata event into " << logCollName << ": " << changeLogBSON; const NamespaceString nss("config", logCollName); Status result = insertConfigDocument(txn, nss.ns(), changeLogBSON); if (!result.isOK()) { warning() << "Error encountered while logging config change with ID [" << changeId << "] into collection " << logCollName << ": " << result; } return result; }
Status CatalogManagerReplicaSet::logChange(OperationContext* txn, const string& clientAddress, const string& what, const string& ns, const BSONObj& detail) { if (_changeLogCollectionCreated.load() == 0) { BSONObj createCmd = BSON("create" << ChangeLogType::ConfigNS << "capped" << true << "size" << kChangeLogCollectionSize); auto result = grid.shardRegistry()->runCommandOnConfigWithNotMasterRetries("config", createCmd); if (!result.isOK()) { LOG(1) << "couldn't create changelog collection: " << causedBy(result.getStatus()); return result.getStatus(); } Status commandStatus = Command::getStatusFromCommandResult(result.getValue()); if (commandStatus.isOK() || commandStatus == ErrorCodes::NamespaceExists) { _changeLogCollectionCreated.store(1); } else { LOG(1) << "couldn't create changelog collection: " << causedBy(commandStatus); return commandStatus; } } Date_t now = grid.shardRegistry()->getExecutor()->now(); const std::string hostName = grid.shardRegistry()->getNetwork()->getHostName(); const string changeId = str::stream() << hostName << "-" << now.toString() << "-" << OID::gen(); ChangeLogType changeLog; changeLog.setChangeId(changeId); changeLog.setServer(hostName); changeLog.setClientAddr(clientAddress); changeLog.setTime(now); changeLog.setNS(ns); changeLog.setWhat(what); changeLog.setDetails(detail); BSONObj changeLogBSON = changeLog.toBSON(); log() << "about to log metadata event: " << changeLogBSON; Status result = insert(txn, ChangeLogType::ConfigNS, changeLogBSON, NULL); if (!result.isOK()) { warning() << "Error encountered while logging config change with ID " << changeId << ": " << result; } return result; }