diff options
-rw-r--r-- | etc/evergreen.yml | 4 | ||||
-rw-r--r-- | src/mongo/SConscript | 2 | ||||
-rw-r--r-- | src/mongo/db/SConscript | 1 | ||||
-rw-r--r-- | src/mongo/db/commands.cpp | 4 | ||||
-rw-r--r-- | src/mongo/db/commands/server_status.cpp | 30 | ||||
-rw-r--r-- | src/mongo/executor/remote_command_request.cpp | 4 | ||||
-rw-r--r-- | src/mongo/executor/remote_command_request.h | 4 | ||||
-rw-r--r-- | src/mongo/logger/SConscript | 9 | ||||
-rw-r--r-- | src/mongo/logger/console.cpp | 22 | ||||
-rw-r--r-- | src/mongo/logger/max_log_size.cpp | 15 | ||||
-rw-r--r-- | src/mongo/util/background.cpp | 22 | ||||
-rw-r--r-- | src/mongo/util/time_support.cpp | 4 | ||||
-rw-r--r-- | src/mongo/util/time_support.h | 12 |
13 files changed, 63 insertions, 70 deletions
diff --git a/etc/evergreen.yml b/etc/evergreen.yml index cb421d837a0..60f4bc1bb65 100644 --- a/etc/evergreen.yml +++ b/etc/evergreen.yml @@ -8428,7 +8428,7 @@ buildvariants: tooltags: "-tags 'ssl'" # We need llvm-symbolizer in the PATH for ASAN for clang-3.7 or later. variant_path_suffix: /opt/mongodbtoolchain/v2/bin - san_options: LSAN_OPTIONS="suppressions=etc/lsan.suppressions" ASAN_OPTIONS=detect_leaks=1 + san_options: LSAN_OPTIONS="suppressions=etc/lsan.suppressions" ASAN_OPTIONS=detect_leaks=1:check_initialization_order=true:strict_init_order=true compile_flags: --variables-files=etc/scons/mongodbtoolchain_clang.vars --dbg=on --opt=on --allocator=system --sanitize=address --ssl -j$(grep -c ^processor /proc/cpuinfo) --nostrip multiversion_platform_arch: "ubuntu1604" multiversion_edition: "targeted" @@ -8573,7 +8573,7 @@ buildvariants: tooltags: "-tags 'ssl'" # We need llvm-symbolizer in the PATH for ASAN for clang-3.7 or later. variant_path_suffix: /opt/mongodbtoolchain/v2/bin - san_options: LSAN_OPTIONS="suppressions=etc/lsan.suppressions" ASAN_OPTIONS=detect_leaks=1 + san_options: LSAN_OPTIONS="suppressions=etc/lsan.suppressions" ASAN_OPTIONS=detect_leaks=1:check_initialization_order=true:strict_init_order=true compile_flags: --variables-files=etc/scons/mongodbtoolchain_clang.vars --opt=on --allocator=system --sanitize=address --ssl -j$(grep -c ^processor /proc/cpuinfo) --nostrip num_jobs_available: $(($(grep -c ^processor /proc/cpuinfo) / 3)) # Avoid starting too many mongod's under ASAN build. build_mongoreplay: true diff --git a/src/mongo/SConscript b/src/mongo/SConscript index 8020440e2c5..9d983d00eda 100644 --- a/src/mongo/SConscript +++ b/src/mongo/SConscript @@ -89,6 +89,7 @@ baseSource=[ 'logger/log_severity.cpp', 'logger/logger.cpp', 'logger/logstream_builder.cpp', + 'logger/max_log_size.cpp', 'logger/message_event_utf8_encoder.cpp', 'logger/message_log_domain.cpp', 'logger/ramlog.cpp', @@ -140,7 +141,6 @@ baseLibDeps=[ '$BUILD_DIR/third_party/shim_intel_decimal128', '$BUILD_DIR/third_party/shim_pcrecpp', '$BUILD_DIR/third_party/shim_tz', - 'logger/max_log_size', 'util/debugger', 'util/quick_exit', ] diff --git a/src/mongo/db/SConscript b/src/mongo/db/SConscript index 43be6f4ed51..5c529f5a636 100644 --- a/src/mongo/db/SConscript +++ b/src/mongo/db/SConscript @@ -392,7 +392,6 @@ env.Library( LIBDEPS=[ "$BUILD_DIR/mongo/client/clientdriver", "$BUILD_DIR/mongo/db/auth/authservercommon", - "$BUILD_DIR/mongo/logger/max_log_size", "$BUILD_DIR/mongo/rpc/command_reply", "$BUILD_DIR/mongo/rpc/command_request", "$BUILD_DIR/mongo/rpc/metadata", diff --git a/src/mongo/db/commands.cpp b/src/mongo/db/commands.cpp index dad9ab5832f..f82b97562a3 100644 --- a/src/mongo/db/commands.cpp +++ b/src/mongo/db/commands.cpp @@ -61,8 +61,8 @@ using std::stringstream; using logger::LogComponent; -Command::CommandMap* Command::_commandsByBestName; -Command::CommandMap* Command::_commands; +Command::CommandMap* Command::_commandsByBestName = nullptr; +Command::CommandMap* Command::_commands = nullptr; Counter64 Command::unknownCommands; static ServerStatusMetricField<Counter64> displayUnknownCommands("commands.<UNKNOWN>", diff --git a/src/mongo/db/commands/server_status.cpp b/src/mongo/db/commands/server_status.cpp index 6fa1f9d56c7..530e6cf8618 100644 --- a/src/mongo/db/commands/server_status.cpp +++ b/src/mongo/db/commands/server_status.cpp @@ -116,7 +116,7 @@ public: // --- all sections - for (SectionMap::const_iterator i = _sections->begin(); i != _sections->end(); ++i) { + for (SectionMap::const_iterator i = _sections.begin(); i != _sections.end(); ++i) { ServerStatusSection* section = i->second; std::vector<Privilege> requiredPrivileges; @@ -175,10 +175,7 @@ public: void addSection(ServerStatusSection* section) { verify(!_runCalled); - if (_sections == 0) { - _sections = new SectionMap(); - } - (*_sections)[section->getSectionName()] = section; + _sections[section->getSectionName()] = section; } private: @@ -186,14 +183,29 @@ private: bool _runCalled; typedef map<string, ServerStatusSection*> SectionMap; - static SectionMap* _sections; -} cmdServerStatus; + SectionMap _sections; +}; + +namespace { + +// This widget ensures that the serverStatus command is registered even if no +// server status sections are registered. +const struct CmdServerStatusInstantiator { + explicit CmdServerStatusInstantiator() { + getInstance(); + } + + static CmdServerStatus& getInstance() { + static CmdServerStatus instance; + return instance; + } +} kDoNotMentionThisVariable; -CmdServerStatus::SectionMap* CmdServerStatus::_sections = 0; +} // namespace ServerStatusSection::ServerStatusSection(const string& sectionName) : _sectionName(sectionName) { - cmdServerStatus.addSection(this); + CmdServerStatusInstantiator::getInstance().addSection(this); } OpCounterServerStatusSection::OpCounterServerStatusSection(const string& sectionName, diff --git a/src/mongo/executor/remote_command_request.cpp b/src/mongo/executor/remote_command_request.cpp index e5362f17386..be22658d2e4 100644 --- a/src/mongo/executor/remote_command_request.cpp +++ b/src/mongo/executor/remote_command_request.cpp @@ -46,8 +46,8 @@ AtomicUInt64 requestIdCounter(0); } // namespace -const Milliseconds RemoteCommandRequest::kNoTimeout{-1}; -const Date_t RemoteCommandRequest::kNoExpirationDate{Date_t::max()}; +constexpr Milliseconds RemoteCommandRequest::kNoTimeout; +constexpr Date_t RemoteCommandRequest::kNoExpirationDate; RemoteCommandRequest::RemoteCommandRequest() : id(requestIdCounter.addAndFetch(1)) {} diff --git a/src/mongo/executor/remote_command_request.h b/src/mongo/executor/remote_command_request.h index e2e16b95261..c6195311b69 100644 --- a/src/mongo/executor/remote_command_request.h +++ b/src/mongo/executor/remote_command_request.h @@ -45,10 +45,10 @@ namespace executor { */ struct RemoteCommandRequest { // Indicates that there is no timeout for the request to complete - static const Milliseconds kNoTimeout; + static constexpr Milliseconds kNoTimeout{-1}; // Indicates that there is no expiration time by when the request needs to complete - static const Date_t kNoExpirationDate; + static constexpr Date_t kNoExpirationDate{Date_t::max()}; // Type to represent the internal id of this request typedef uint64_t RequestId; diff --git a/src/mongo/logger/SConscript b/src/mongo/logger/SConscript index 644fef1e105..dd69b7cce4a 100644 --- a/src/mongo/logger/SConscript +++ b/src/mongo/logger/SConscript @@ -4,15 +4,6 @@ Import("env") env = env.Clone() -env.Library( - target=[ - 'max_log_size' - ], - source=[ - 'max_log_size.cpp', - ], -) - env.Library('parse_log_component_settings', ['parse_log_component_settings.cpp'], LIBDEPS=['$BUILD_DIR/mongo/base',]) diff --git a/src/mongo/logger/console.cpp b/src/mongo/logger/console.cpp index 93c98c052a9..b16e1b6270d 100644 --- a/src/mongo/logger/console.cpp +++ b/src/mongo/logger/console.cpp @@ -40,18 +40,10 @@ namespace mongo { namespace { -/* - * Theory of operation: - * - * At process start, the loader initializes "consoleMutex" to NULL. At some point during static - * initialization, the static initialization process, running in the one and only extant thread, - * allocates a new stdx::mutex on the heap and assigns consoleMutex to point to it. While - * consoleMutex is still NULL, we know that there is only one thread extant, so it is safe to - * skip locking the consoleMutex in the Console constructor. Once the mutex is initialized, - * users of Console can start acquiring it. - */ - -stdx::mutex* consoleMutex = new stdx::mutex; +stdx::mutex& consoleMutex() { + static stdx::mutex instance; + return instance; +} #if defined(_WIN32) /** @@ -252,10 +244,8 @@ Console::Console() : _consoleLock() { // single-threaded context via a mongo initializer above. static const std::ios_base::Init initializeCout; - if (consoleMutex) { - stdx::unique_lock<stdx::mutex> lk(*consoleMutex); - lk.swap(_consoleLock); - } + stdx::unique_lock<stdx::mutex> lk(consoleMutex()); + lk.swap(_consoleLock); } std::ostream& Console::out() { diff --git a/src/mongo/logger/max_log_size.cpp b/src/mongo/logger/max_log_size.cpp index 675facfa931..1a767924020 100644 --- a/src/mongo/logger/max_log_size.cpp +++ b/src/mongo/logger/max_log_size.cpp @@ -33,17 +33,24 @@ #include "mongo/stdx/functional.h" namespace mongo { - namespace logger { -stdx::function<int()> MaxLogSizeKB::_getter = nullptr; +namespace { + +stdx::function<int()>& getGetterFunction() { + static stdx::function<int()> instance; + return instance; +} + +} // namespace int MaxLogSizeKB::get() { - return (_getter == nullptr) ? 10 : _getter(); + auto& getter = getGetterFunction(); + return !getter ? 10 : getter(); } void MaxLogSizeKB::setGetter(stdx::function<int()> getter) { - _getter = getter; + getGetterFunction() = std::move(getter); } } // namespace logger diff --git a/src/mongo/util/background.cpp b/src/mongo/util/background.cpp index 4fcd7b4ae1c..47a01afaf86 100644 --- a/src/mongo/util/background.cpp +++ b/src/mongo/util/background.cpp @@ -96,12 +96,10 @@ private: std::vector<PeriodicTask*> _tasks; }; -// We rely here on zero-initialization of 'runnerMutex' to distinguish whether we are -// running before or after static initialization for this translation unit has -// completed. In the former case, we assume no threads are present, so we do not need -// to use the mutex. When present, the mutex protects 'runner' and 'runnerDestroyed' -// below. -SimpleMutex* const runnerMutex = new SimpleMutex; +SimpleMutex* runnerMutex() { + static SimpleMutex mutex; + return &mutex; +} // A scoped lock like object that only locks/unlocks the mutex if it exists. class ConditionalScopedLock { @@ -120,10 +118,10 @@ private: }; // The unique PeriodicTaskRunner, also zero-initialized. -PeriodicTaskRunner* runner; +PeriodicTaskRunner* runner = nullptr; // The runner is never re-created once it has been destroyed. -bool runnerDestroyed; +bool runnerDestroyed = false; } // namespace @@ -228,7 +226,7 @@ bool BackgroundJob::running() const { // ------------------------- PeriodicTask::PeriodicTask() { - ConditionalScopedLock lock(runnerMutex); + ConditionalScopedLock lock(runnerMutex()); if (runnerDestroyed) return; @@ -239,7 +237,7 @@ PeriodicTask::PeriodicTask() { } PeriodicTask::~PeriodicTask() { - ConditionalScopedLock lock(runnerMutex); + ConditionalScopedLock lock(runnerMutex()); if (runnerDestroyed || !runner) return; @@ -247,7 +245,7 @@ PeriodicTask::~PeriodicTask() { } void PeriodicTask::startRunningPeriodicTasks() { - ConditionalScopedLock lock(runnerMutex); + ConditionalScopedLock lock(runnerMutex()); if (runnerDestroyed) return; @@ -258,7 +256,7 @@ void PeriodicTask::startRunningPeriodicTasks() { } Status PeriodicTask::stopRunningPeriodicTasks(int gracePeriodMillis) { - ConditionalScopedLock lock(runnerMutex); + ConditionalScopedLock lock(runnerMutex()); Status status = Status::OK(); if (runnerDestroyed || !runner) diff --git a/src/mongo/util/time_support.cpp b/src/mongo/util/time_support.cpp index 22c943b0818..7ab7a03215d 100644 --- a/src/mongo/util/time_support.cpp +++ b/src/mongo/util/time_support.cpp @@ -57,10 +57,6 @@ extern "C" time_t timegm(struct tm* const tmp); namespace mongo { -Date_t Date_t::max() { - return fromMillisSinceEpoch(std::numeric_limits<long long>::max()); -} - Date_t Date_t::now() { return fromMillisSinceEpoch(curTimeMillis64()); } diff --git a/src/mongo/util/time_support.h b/src/mongo/util/time_support.h index df07e064dce..203001e58fa 100644 --- a/src/mongo/util/time_support.h +++ b/src/mongo/util/time_support.h @@ -58,10 +58,10 @@ class Date_t { public: /** * The largest representable Date_t. - * - * TODO(schwerin): Make constexpr when supported by all compilers. */ - static Date_t max(); + static constexpr Date_t max() { + return fromMillisSinceEpoch(std::numeric_limits<long long>::max()); + } /** * Reads the system clock and returns a Date_t representing the present time. @@ -71,7 +71,7 @@ public: /** * Returns a Date_t from an integer number of milliseconds since the epoch. */ - static Date_t fromMillisSinceEpoch(long long m) { + static constexpr Date_t fromMillisSinceEpoch(long long m) { return Date_t(m); } @@ -86,7 +86,7 @@ public: /** * Constructs a Date_t representing the epoch. */ - Date_t() = default; + constexpr Date_t() = default; /** * Constructs a Date_t from a system clock time point. @@ -220,7 +220,7 @@ public: } private: - explicit Date_t(long long m) : millis(m) {} + constexpr explicit Date_t(long long m) : millis(m) {} long long millis = 0; }; |