From 950d8deb486b4608828e0c4f7e9caa3e7d84fed8 Mon Sep 17 00:00:00 2001 From: Jason Rassi Date: Fri, 26 Jul 2013 15:37:21 -0400 Subject: 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". --- src/mongo/db/curop_test.cpp | 80 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/mongo/db/curop_test.cpp (limited to 'src/mongo/db/curop_test.cpp') 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 . + */ + +#include + +#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 -- cgit v1.2.1