summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Benvenuto <mark.benvenuto@mongodb.com>2014-06-17 11:07:51 -0400
committerMark Benvenuto <mark.benvenuto@mongodb.com>2014-09-15 16:39:44 -0400
commitf46ea38b7f63987e7041a4c07ce8eea3b7b46f71 (patch)
tree0435a9247737911438eaaf6a2f3adac0165e7977
parent5664ebd1766e13456bd6d333ed8f81ddae1c8161 (diff)
downloadmongo-f46ea38b7f63987e7041a4c07ce8eea3b7b46f71.tar.gz
SERVER-9032: Validate locale on startup
On some Linux machines, users may have not have a locale set which will cause boost to fail. Validate that the user has a locale set, and if not, give a useful error message, and exit. (cherry picked from commit ff70eb640552c049538a03d174edbc2c0311c8bd)
-rw-r--r--src/mongo/base/SConscript1
-rw-r--r--src/mongo/base/validate_locale.cpp54
-rw-r--r--src/mongo/logger/logger.cpp2
-rw-r--r--src/mongo/util/options_parser/startup_option_init.cpp2
4 files changed, 57 insertions, 2 deletions
diff --git a/src/mongo/base/SConscript b/src/mongo/base/SConscript
index f6c7a18b329..5b712bba073 100644
--- a/src/mongo/base/SConscript
+++ b/src/mongo/base/SConscript
@@ -12,6 +12,7 @@ env.Library('base', ['error_codes.cpp',
'initializer.cpp',
'initializer_context.cpp',
'initializer_dependency_graph.cpp',
+ 'validate_locale.cpp',
'make_string_vector.cpp',
'parse_number.cpp',
'status.cpp',
diff --git a/src/mongo/base/validate_locale.cpp b/src/mongo/base/validate_locale.cpp
new file mode 100644
index 00000000000..54d9d1a0c22
--- /dev/null
+++ b/src/mongo/base/validate_locale.cpp
@@ -0,0 +1,54 @@
+/* Copyright 2014 MongoDB, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * As a special exception, the copyright holders give permission to link the
+ * code of portions of this program with the OpenSSL library under certain
+ * conditions as described in each individual source file and distribute
+ * linked combinations including the program with the OpenSSL library. You
+ * must comply with the GNU Affero General Public License in all respects
+ * for all of the code used other than as permitted herein. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version. If you
+ * delete this exception statement from all source files in the program,
+ * then also delete it in the license file.
+ */
+
+#include <stdexcept>
+
+#include <boost/filesystem/operations.hpp>
+
+#include "mongo/base/init.h"
+
+namespace mongo {
+
+MONGO_INITIALIZER_GENERAL(ValidateLocale,
+ MONGO_NO_PREREQUISITES,
+ MONGO_DEFAULT_PREREQUISITES)
+ (InitializerContext*) {
+ try {
+ // Validate that boost can correctly load the user's locale
+ boost::filesystem::path("/").has_root_directory();
+ }
+ catch (const std::runtime_error&) {
+ return Status(ErrorCodes::BadValue, "Invalid or no user locale set."
+#ifndef _WIN32
+ " Please ensure LANG and/or LC_* environment variables are set correctly."
+#endif
+ );
+ }
+ return Status::OK();
+ }
+
+} // namespace mongo
diff --git a/src/mongo/logger/logger.cpp b/src/mongo/logger/logger.cpp
index 27d28509b56..02b8748f245 100644
--- a/src/mongo/logger/logger.cpp
+++ b/src/mongo/logger/logger.cpp
@@ -43,7 +43,7 @@ namespace logger {
* Just in case no static initializer called globalLogManager, make sure that the global log
* manager is instantiated while we're still in a single-threaded context.
*/
- MONGO_INITIALIZER_GENERAL(GlobalLogManager, MONGO_NO_PREREQUISITES, ("default"))(
+ MONGO_INITIALIZER_GENERAL(GlobalLogManager, ("ValidateLocale"), ("default"))(
InitializerContext*) {
globalLogManager();
diff --git a/src/mongo/util/options_parser/startup_option_init.cpp b/src/mongo/util/options_parser/startup_option_init.cpp
index c2641286346..81eec4537a5 100644
--- a/src/mongo/util/options_parser/startup_option_init.cpp
+++ b/src/mongo/util/options_parser/startup_option_init.cpp
@@ -22,7 +22,7 @@
/* Groups for all of option handling */
MONGO_INITIALIZER_GROUP(BeginStartupOptionHandling,
- ("GlobalLogManager"), ("EndStartupOptionHandling"))
+ ("GlobalLogManager", "ValidateLocale"), ("EndStartupOptionHandling"))
/* Groups for option registration */
MONGO_INITIALIZER_GROUP(BeginStartupOptionRegistration,