summaryrefslogtreecommitdiff
path: root/src/mongo/db/curop_test.cpp
diff options
context:
space:
mode:
authorJason Rassi <rassi@10gen.com>2013-07-26 15:37:21 -0400
committerJason Rassi <rassi@10gen.com>2013-07-26 16:37:53 -0400
commit950d8deb486b4608828e0c4f7e9caa3e7d84fed8 (patch)
tree69ad420cc19713899697bf1c86c020789983c696 /src/mongo/db/curop_test.cpp
parent6f8b9d5515591beaaa6f58c8fdabb9ddd2b2450f (diff)
downloadmongo-950d8deb486b4608828e0c4f7e9caa3e7d84fed8.tar.gz
SERVER-2212 Ability for CurOp objects to be "timer-interruptible"
- New public methods introduced to CurOp for requesting op interruption after a given time period. - KillCurrentOp objects now additionally tasked with interrupting CurOp objects that have exceeded their time limit, during the "interrupt check".
Diffstat (limited to 'src/mongo/db/curop_test.cpp')
-rw-r--r--src/mongo/db/curop_test.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/mongo/db/curop_test.cpp b/src/mongo/db/curop_test.cpp
new file mode 100644
index 00000000000..8435b7b88d2
--- /dev/null
+++ b/src/mongo/db/curop_test.cpp
@@ -0,0 +1,80 @@
+/**
+ * Copyright (C) 2013 10gen 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/>.
+ */
+
+#include <boost/thread/thread.hpp>
+
+#include "mongo/base/init.h"
+#include "mongo/db/curop.h"
+#include "mongo/unittest/unittest.h"
+
+namespace mongo {
+
+ CmdLine cmdLine; // needed to satisfy reference in curop.h (and elsewhere)
+
+ namespace {
+
+ const long long intervalLong = 2000 * 1000; // 2s in micros
+ const long long intervalShort = 10 * 1000; // 10ms in micros
+
+ //
+ // Before executing the TimeHasExpired suite, spawn a dummy listener thread to be the
+ // process time tracker (the tests rely on Listener::_timeTracker being available).
+ //
+
+ class TestListener : public Listener {
+ public:
+ TestListener() : Listener("test", "", 0) {} // port 0 => any available high port
+ virtual void acceptedMP(MessagingPort *mp) {}
+ };
+
+ void timeTrackerSetup() {
+ TestListener listener;
+ listener.setAsTimeTracker();
+ listener.initAndListen();
+ }
+
+ MONGO_INITIALIZER(CurOpTest)(InitializerContext* context) {
+ boost::thread t(timeTrackerSetup);
+
+ // Wait for listener thread to start tracking time.
+ while (Listener::getElapsedTimeMillis() == 0) {
+ sleepmillis(10);
+ }
+
+ return Status::OK();
+ }
+
+ // Long operation + short timeout => time should expire.
+ TEST(TimeHasExpired, PosSimple) {
+ CurOp curOp(NULL);
+ curOp.setMaxTimeMicros(intervalShort);
+ curOp.ensureStarted();
+ sleepmicros(intervalLong);
+ ASSERT_TRUE(curOp.maxTimeHasExpired());
+ }
+
+ // Short operation + long timeout => time should not expire.
+ TEST(TimeHasExpired, NegSimple) {
+ CurOp curOp(NULL);
+ curOp.setMaxTimeMicros(intervalLong);
+ curOp.ensureStarted();
+ sleepmicros(intervalShort);
+ ASSERT_FALSE(curOp.maxTimeHasExpired());
+ }
+
+ } // namespace
+
+} // namespace mongo