summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShaileja Jain <shaileja.jain@gmail.com>2019-06-13 11:51:39 -0400
committerShaileja Jain <shaileja.jain@gmail.com>2019-06-13 11:54:51 -0400
commita0afdde6331d5b2a6ed901f865d95011d5fffb1f (patch)
tree7b042488f53eda1327fc3d323fd2999791dcb5f8 /src
parent2263b578a724e4dea834d648bdb2288edc372e7b (diff)
downloadmongo-a0afdde6331d5b2a6ed901f865d95011d5fffb1f.tar.gz
SERVER-41360 Created DiagnosticInfo class
Diffstat (limited to 'src')
-rw-r--r--src/mongo/util/SConscript22
-rw-r--r--src/mongo/util/diagnostic_info.cpp41
-rw-r--r--src/mongo/util/diagnostic_info.h75
-rw-r--r--src/mongo/util/diagnostic_info_test.cpp62
4 files changed, 200 insertions, 0 deletions
diff --git a/src/mongo/util/SConscript b/src/mongo/util/SConscript
index 59007e2c9f4..30089944be2 100644
--- a/src/mongo/util/SConscript
+++ b/src/mongo/util/SConscript
@@ -468,6 +468,28 @@ env.CppUnitTest(
],
)
+env.Library(
+ target='diagnostic_info',
+ source= [
+ 'diagnostic_info.cpp',
+ ],
+ LIBDEPS=[
+ '$BUILD_DIR/mongo/base',
+ "$BUILD_DIR/mongo/db/service_context",
+ ],
+)
+
+env.CppUnitTest(
+ target='diagnostic_info_test',
+ source=[
+ 'diagnostic_info_test.cpp'
+ ],
+ LIBDEPS=[
+ 'diagnostic_info',
+ 'clock_source_mock',
+ ]
+)
+
env.Benchmark(
target='clock_source_bm',
source=[
diff --git a/src/mongo/util/diagnostic_info.cpp b/src/mongo/util/diagnostic_info.cpp
new file mode 100644
index 00000000000..e74b0968233
--- /dev/null
+++ b/src/mongo/util/diagnostic_info.cpp
@@ -0,0 +1,41 @@
+/**
+ * Copyright (C) 2018-present MongoDB, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the Server Side Public License, version 1,
+ * as published by MongoDB, Inc.
+ *
+ * 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
+ * Server Side Public License for more details.
+ *
+ * You should have received a copy of the Server Side Public License
+ * along with this program. If not, see
+ * <http://www.mongodb.com/licensing/server-side-public-license>.
+ *
+ * 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 Server Side 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 "mongo/platform/basic.h"
+
+#include "mongo/util/diagnostic_info.h"
+
+#include "mongo/util/clock_source.h"
+
+namespace mongo {
+
+DiagnosticInfo takeDiagnosticInfo(const StringData& captureName) {
+ return DiagnosticInfo(getGlobalServiceContext()->getFastClockSource()->now(), captureName);
+}
+} // namespace mongo
diff --git a/src/mongo/util/diagnostic_info.h b/src/mongo/util/diagnostic_info.h
new file mode 100644
index 00000000000..9685135b0d2
--- /dev/null
+++ b/src/mongo/util/diagnostic_info.h
@@ -0,0 +1,75 @@
+/**
+ * Copyright (C) 2018-present MongoDB, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the Server Side Public License, version 1,
+ * as published by MongoDB, Inc.
+ *
+ * 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
+ * Server Side Public License for more details.
+ *
+ * You should have received a copy of the Server Side Public License
+ * along with this program. If not, see
+ * <http://www.mongodb.com/licensing/server-side-public-license>.
+ *
+ * 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 Server Side 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.
+ */
+
+#pragma once
+
+#include "mongo/base/string_data.h"
+#include "mongo/db/service_context.h"
+#include "mongo/util/time_support.h"
+
+namespace mongo {
+
+/**
+ * DiagnosticInfo keeps track of diagnostic information such as a developer provided
+ * name, the time when a lock was first acquired, and a partial caller call stack.
+ */
+class DiagnosticInfo {
+public:
+ virtual ~DiagnosticInfo() = default;
+ DiagnosticInfo(const DiagnosticInfo&) = delete;
+ DiagnosticInfo& operator=(const DiagnosticInfo&) = delete;
+ DiagnosticInfo(DiagnosticInfo&&) = default;
+ DiagnosticInfo& operator=(DiagnosticInfo&&) = default;
+
+ Date_t getTimestamp() {
+ return _timestamp;
+ }
+
+ StringData getCaptureName() {
+ return _captureName;
+ }
+
+ friend DiagnosticInfo takeDiagnosticInfo(const StringData& captureName);
+
+private:
+ Date_t _timestamp;
+ StringData _captureName;
+
+
+ DiagnosticInfo(const Date_t& timestamp, const StringData& captureName)
+ : _timestamp(timestamp), _captureName(captureName) {}
+};
+
+/**
+ * Captures the diagnostic information based on the caller's context.
+ */
+DiagnosticInfo takeDiagnosticInfo(const StringData& captureName);
+
+
+} // namespace monogo
diff --git a/src/mongo/util/diagnostic_info_test.cpp b/src/mongo/util/diagnostic_info_test.cpp
new file mode 100644
index 00000000000..c12155b98d2
--- /dev/null
+++ b/src/mongo/util/diagnostic_info_test.cpp
@@ -0,0 +1,62 @@
+/**
+ * Copyright (C) 2018-present MongoDB, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the Server Side Public License, version 1,
+ * as published by MongoDB, Inc.
+ *
+ * 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
+ * Server Side Public License for more details.
+ *
+ * You should have received a copy of the Server Side Public License
+ * along with this program. If not, see
+ * <http://www.mongodb.com/licensing/server-side-public-license>.
+ *
+ * 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 Server Side 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 <string>
+
+#include "mongo/unittest/unittest.h"
+#include "mongo/util/clock_source_mock.h"
+#include "mongo/util/diagnostic_info.h"
+
+namespace mongo {
+TEST(DiagnosticInfo, BasicSingleThread) {
+ // set up serviceContext and clock source
+ auto serviceContext = ServiceContext::make();
+ auto clockSource = std::make_unique<ClockSourceMock>();
+ auto clockSourcePointer = clockSource.get();
+ serviceContext->setFastClockSource(std::move(clockSource));
+ setGlobalServiceContext(std::move(serviceContext));
+
+ // take the initial diagnostic info
+ DiagnosticInfo capture1 = takeDiagnosticInfo("capture1"_sd);
+ ASSERT_EQ(capture1.getCaptureName(), "capture1");
+
+ // mock time advancing and check that the current time is greater than capture1's timestamp
+ clockSourcePointer->advance(Seconds(1));
+ ASSERT_LT(capture1.getTimestamp(), clockSourcePointer->now());
+
+ // take a second diagnostic capture and compare its fields to the first
+ DiagnosticInfo capture2 = takeDiagnosticInfo("capture2"_sd);
+ ASSERT_LT(capture1.getTimestamp(), capture2.getTimestamp());
+ ASSERT_EQ(capture1.getCaptureName(), "capture1");
+ ASSERT_EQ(capture2.getCaptureName(), "capture2");
+
+ clockSourcePointer->advance(Seconds(1));
+ ASSERT_LT(capture2.getTimestamp(), clockSourcePointer->now());
+}
+}