summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--etc/evergreen.yml4
-rw-r--r--src/mongo/SConscript2
-rw-r--r--src/mongo/db/SConscript1
-rw-r--r--src/mongo/db/commands.cpp4
-rw-r--r--src/mongo/db/commands/server_status.cpp30
-rw-r--r--src/mongo/executor/remote_command_request.cpp4
-rw-r--r--src/mongo/executor/remote_command_request.h4
-rw-r--r--src/mongo/logger/SConscript9
-rw-r--r--src/mongo/logger/console.cpp22
-rw-r--r--src/mongo/logger/max_log_size.cpp15
-rw-r--r--src/mongo/util/background.cpp22
-rw-r--r--src/mongo/util/time_support.cpp4
-rw-r--r--src/mongo/util/time_support.h12
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;
};