diff options
author | Charlie Swanson <charlie.swanson@mongodb.com> | 2015-07-30 16:35:20 -0400 |
---|---|---|
committer | Charlie Swanson <charlie.swanson@mongodb.com> | 2015-07-31 16:24:11 -0400 |
commit | e0432b196f966e60ae1d35f0300167dec44c3d2a (patch) | |
tree | b21ac71435aff46aa6c257b1c749d31817279e36 /src/mongo/dbtests/perftests.cpp | |
parent | 98aeb5aeab5167ef63a72e6398c4f722f32ca5f3 (diff) | |
download | mongo-e0432b196f966e60ae1d35f0300167dec44c3d2a.tar.gz |
SERVER-18483 Remove all but mutex tests from the perf dbtest suite
Diffstat (limited to 'src/mongo/dbtests/perftests.cpp')
-rw-r--r-- | src/mongo/dbtests/perftests.cpp | 1272 |
1 files changed, 5 insertions, 1267 deletions
diff --git a/src/mongo/dbtests/perftests.cpp b/src/mongo/dbtests/perftests.cpp index 1db307c39c9..d7ff309cd4b 100644 --- a/src/mongo/dbtests/perftests.cpp +++ b/src/mongo/dbtests/perftests.cpp @@ -39,48 +39,35 @@ #include "mongo/platform/basic.h" -#include <boost/filesystem/operations.hpp> #include <boost/thread/condition.hpp> #include <boost/thread/mutex.hpp> #include <boost/thread/thread.hpp> -#include <boost/version.hpp> #include <iomanip> #include <iostream> -#include <fstream> #include <mutex> #include "mongo/config.h" #include "mongo/db/client.h" -#include "mongo/db/concurrency/lock_state.h" #include "mongo/db/db.h" #include "mongo/db/dbdirectclient.h" -#include "mongo/db/json.h" #include "mongo/db/lasterror.h" #include "mongo/db/operation_context_impl.h" -#include "mongo/db/storage/mmap_v1/btree/key.h" -#include "mongo/db/storage/mmap_v1/compress.h" #include "mongo/db/storage/mmap_v1/dur_stats.h" -#include "mongo/db/storage/mmap_v1/durable_mapped_file.h" #include "mongo/db/storage/mmap_v1/mmap.h" #include "mongo/db/storage_options.h" #include "mongo/dbtests/dbtests.h" #include "mongo/dbtests/framework_options.h" #include "mongo/stdx/condition_variable.h" #include "mongo/stdx/thread.h" -#include "mongo/util/allocator.h" -#include "mongo/util/checksum.h" -#include "mongo/util/fail_point.h" #include "mongo/util/log.h" #include "mongo/util/timer.h" #include "mongo/util/version.h" namespace PerfTests { -using std::shared_ptr; using std::cout; using std::endl; using std::fixed; -using std::ifstream; using std::left; using std::min; using std::right; @@ -123,71 +110,8 @@ private: DBDirectClient _client; }; -/* if you want recording of the timings, place the password for the perf database - in ./../settings.py: - pstatspassword="<pwd>" -*/ static std::shared_ptr<DBClientConnection> conn; static string _perfhostname; -void pstatsConnect() { - // no writing to perf db if this is a debug build - DEV return; - - const char* fn = "../../settings.py"; - if (!boost::filesystem::exists(fn)) { - if (boost::filesystem::exists("settings.py")) - fn = "settings.py"; - else { - cout << "no ../../settings.py or ./settings.py file found. will not write perf stats " - "to pstats db." << endl; - cout << "it is recommended this be enabled even on dev boxes" << endl; - return; - } - } - - try { - if (conn == 0) { - MemoryMappedFile f; - const char* p = (const char*)f.mapWithOptions(fn, MongoFile::READONLY); - string pwd; - - { - const char* q = str::after(p, "pstatspassword=\""); - if (*q == 0) { - cout << "info perftests.cpp: no pstatspassword= in settings.py" << endl; - return; - } else { - pwd = str::before(q, '\"'); - } - } - - std::shared_ptr<DBClientConnection> c(new DBClientConnection(false, 60)); - string err; - if (c->connect(HostAndPort("perfdb.10gen.cc"), err)) { - if (!c->auth("perf", "perf", pwd, err)) { - cout << "info: authentication with stats db failed: " << err << endl; - verify(false); - } - conn = c; - - // override the hostname with the buildbot hostname, if present - ifstream hostf("../../info/host"); - if (hostf.good()) { - char buf[1024]; - hostf.getline(buf, sizeof(buf)); - _perfhostname = buf; - } else { - _perfhostname = getHostName(); - } - } else { - cout << err << " (to log perfstats)" << endl; - } - } - } catch (...) { - cout << "pstatsConnect() didn't work; ignoring" << endl; - } -} - class B : public ClientBase { string _ns; @@ -435,175 +359,6 @@ public: } }; -unsigned dontOptimizeOutHopefully = 1; - -class NonDurTest : public B { -public: - virtual int howLongMillis() { - return 3000; - } - virtual bool showDurStats() { - return false; - } -}; - -class BSONIter : public NonDurTest { -public: - int n; - bo b, sub; - string name() { - return "BSONIter"; - } - BSONIter() { - n = 0; - bo sub = bob() - .appendTimeT("t", time(0)) - .appendBool("abool", true) - .appendBinData("somebin", 3, BinDataGeneral, "abc") - .appendNull("anullone") - .obj(); - b = BSON("_id" << OID() << "x" << 3 << "yaaaaaa" << 3.00009 << "zz" << 1 << "q" << false - << "obj" << sub << "zzzzzzz" - << "a string a string"); - } - void timed() { - for (bo::iterator i = b.begin(); i.more();) - if (i.next().fieldName()) - n++; - for (bo::iterator i = sub.begin(); i.more();) - if (i.next().fieldName()) - n++; - } -}; - -class BSONGetFields1 : public NonDurTest { -public: - int n; - bo b, sub; - string name() { - return "BSONGetFields1By1"; - } - BSONGetFields1() { - n = 0; - bo sub = bob() - .appendTimeT("t", time(0)) - .appendBool("abool", true) - .appendBinData("somebin", 3, BinDataGeneral, "abc") - .appendNull("anullone") - .obj(); - b = BSON("_id" << OID() << "x" << 3 << "yaaaaaa" << 3.00009 << "zz" << 1 << "q" << false - << "obj" << sub << "zzzzzzz" - << "a string a string"); - } - void timed() { - if (b["x"].eoo()) - n++; - if (b["q"].eoo()) - n++; - if (b["zzz"].eoo()) - n++; - } -}; - -class BSONGetFields2 : public BSONGetFields1 { -public: - string name() { - return "BSONGetFields"; - } - void timed() { - static const char* names[] = {"x", "q", "zzz"}; - BSONElement elements[3]; - b.getFields(3, names, elements); - if (elements[0].eoo()) - n++; - if (elements[1].eoo()) - n++; - if (elements[2].eoo()) - n++; - } -}; - -class KeyTest : public B { -public: - KeyV1Owned a, b, c; - string name() { - return "Key-woequal"; - } - virtual int howLongMillis() { - return 3000; - } - KeyTest() - : a(BSON("a" << 1 << "b" << 3.0 << "c" - << "qqq")), - b(BSON("a" << 1 << "b" << 3.0 << "c" - << "qqq")), - c(BSON("a" << 1 << "b" << 3.0 << "c" - << "qqqb")) {} - virtual bool showDurStats() { - return false; - } - void timed() { - verify(a.woEqual(b)); - verify(!a.woEqual(c)); - } -}; - -unsigned long long aaa; - -class Timer : public B { -public: - string name() { - return "Timer"; - } - virtual int howLongMillis() { - return 1000; - } - virtual bool showDurStats() { - return false; - } - void timed() { - mongo::Timer t; - aaa += t.millis(); - } -}; - -class Sleep0Ms : public B { -public: - string name() { - return "Sleep0Ms"; - } - virtual int howLongMillis() { - return 400; - } - virtual bool showDurStats() { - return false; - } - void timed() { - sleepmillis(0); - aaa++; - } -}; - -#if defined(__USE_XOPEN2K) -class Yield : public B { -public: - string name() { - return "Yield"; - } - virtual int howLongMillis() { - return 400; - } - virtual bool showDurStats() { - return false; - } - void timed() { - pthread_yield(); - aaa++; - } -}; -#endif - -RWLock lk("testrw"); SimpleMutex m; boost::mutex mboost; // NOLINT boost::timed_mutex mboost_timed; // NOLINT @@ -612,21 +367,6 @@ std::timed_mutex mstd_timed; // NOLINT SpinLock s; stdx::condition_variable c; -class NotifyOne : public B { -public: - string name() { - return "notify_one"; - } - virtual int howLongMillis() { - return 500; - } - virtual bool showDurStats() { - return false; - } - void timed() { - c.notify_one(); - } -}; class boostmutexspeed : public B { public: string name() { @@ -704,1021 +444,19 @@ public: } }; -class spinlockspeed : public B { -public: - string name() { - return "spinlock"; - } - virtual int howLongMillis() { - return 500; - } - virtual bool showDurStats() { - return false; - } - void timed() { - mongo::scoped_spinlock lk(s); - } -}; -int cas; -class casspeed : public B { -public: - string name() { - return "compareandswap"; - } - virtual int howLongMillis() { - return 500; - } - virtual bool showDurStats() { - return false; - } - void timed() { -#ifdef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 -#define RUNCOMPARESWAP 1 - __sync_bool_compare_and_swap(&cas, 0, 0); -#endif - } -}; -class rlock : public B { -public: - string name() { - return "rlock"; - } - virtual int howLongMillis() { - return 500; - } - virtual bool showDurStats() { - return false; - } - void timed() { - lk.lock_shared(); - lk.unlock_shared(); - } -}; -class wlock : public B { -public: - string name() { - return "wlock"; - } - virtual int howLongMillis() { - return 500; - } - virtual bool showDurStats() { - return false; - } - void timed() { - lk.lock(); - lk.unlock(); - } -}; - -class locker_test : public B { -public: - boost::thread_specific_ptr<ResourceId> resId; - boost::thread_specific_ptr<MMAPV1LockerImpl> locker; - boost::thread_specific_ptr<int> id; - stdx::mutex lock; - - // The following members are intitialized in the constructor - LockMode lockMode; - LockMode glockMode; - - locker_test(LockMode m = MODE_X, LockMode gm = MODE_IX) : lockMode(m), glockMode(gm) {} - virtual string name() { - return (str::stream() << "locker_contested" << lockMode); - } - virtual bool showDurStats() { - return false; - } - virtual bool testThreaded() { - return true; - } - virtual void prep() { - resId.reset(new ResourceId(RESOURCE_COLLECTION, std::string("TestDB.collection"))); - locker.reset(new MMAPV1LockerImpl()); - } - - virtual void prepThreaded() { - resId.reset(new ResourceId(RESOURCE_COLLECTION, std::string("TestDB.collection"))); - id.reset(new int); - lock.lock(); - lock.unlock(); - locker.reset(new MMAPV1LockerImpl()); - } - - void timed() { - locker->lockGlobal(glockMode); - locker->lock(*resId, lockMode); - locker->unlockAll(); - } - - void timed2(DBClientBase* c) { - locker->lockGlobal(glockMode); - locker->lock(*resId, lockMode); - locker->unlockAll(); - } -}; - -class glockerIX : public locker_test { -public: - virtual string name() { - return (str::stream() << "glocker" << glockMode); - } - - void timed() { - locker->lockGlobal(glockMode); - locker->unlockAll(); - } - - void timed2(DBClientBase* c) { - locker->lockGlobal(glockMode); - locker->unlockAll(); - } -}; - -class locker_test_uncontested : public locker_test { -public: - locker_test_uncontested(LockMode m = MODE_IX, LockMode gm = MODE_IX) : locker_test(m, gm) {} - virtual string name() { - return (str::stream() << "locker_uncontested" << lockMode); - } - - virtual void prepThreaded() { - id.reset(new int); - - lock.lock(); - lock.unlock(); - locker.reset(new LockerImpl<true>); - resId.reset( - new ResourceId(RESOURCE_COLLECTION, str::stream() << "TestDB.collection" << *id)); - } -}; - - -class glockerIS : public glockerIX { -public: - glockerIS() : glockerIX() { - glockMode = MODE_IS; - } -}; - -class locker_contestedX : public locker_test { -public: - locker_contestedX() : locker_test(MODE_X, MODE_IX) {} -}; - -class locker_contestedS : public locker_test { -public: - locker_contestedS() : locker_test(MODE_S, MODE_IS) {} -}; - -class locker_uncontestedX : public locker_test_uncontested { -public: - locker_uncontestedX() : locker_test_uncontested(MODE_X, MODE_IX) {} -}; - -class locker_uncontestedS : public locker_test_uncontested { -public: - locker_uncontestedS() : locker_test_uncontested(MODE_S, MODE_IS) {} -}; - -class CTM : public B { -public: - CTM() : last(0), delts(0), n(0) {} - string name() { - return "curTimeMillis64"; - } - virtual int howLongMillis() { - return 500; - } - virtual bool showDurStats() { - return false; - } - unsigned long long last; - unsigned long long delts; - unsigned n; - void timed() { - unsigned long long x = curTimeMillis64(); - aaa += x; - if (last) { - unsigned long long delt = x - last; - if (delt) { - delts += delt; - n++; - } - } - last = x; - } - void post() { - // we need to know if timing is highly ungranular - that could be relevant in some places - if (n) - cout << " avg timer granularity: " << ((double)delts) / n << "ms " << endl; - } -}; -class CTMicros : public B { -public: - CTMicros() : last(0), delts(0), n(0) {} - string name() { - return "curTimeMicros64"; - } - virtual int howLongMillis() { - return 500; - } - virtual bool showDurStats() { - return false; - } - unsigned long long last; - unsigned long long delts; - unsigned n; - void timed() { - unsigned long long x = curTimeMicros64(); - aaa += x; - if (last) { - unsigned long long delt = x - last; - if (delt) { - delts += delt; - n++; - } - } - last = x; - } - void post() { - // we need to know if timing is highly ungranular - that could be relevant in some places - if (n) - cout << " avg timer granularity: " << ((double)delts) / n << "ms " << endl; - } -}; - -class Bldr : public B { -public: - int n; - string name() { - return "BufBuilder"; - } - Bldr() {} - virtual int howLongMillis() { - return 3000; - } - virtual bool showDurStats() { - return false; - } - void timed() { - BufBuilder b; - b.appendNum(3); - b.appendUChar(' '); - b.appendStr("abcd"); - n += b.len(); - } -}; - -class StkBldr : public B { -public: - virtual int howLongMillis() { - return 3000; - } - int n; - string name() { - return "StackBufBuilder"; - } - virtual bool showDurStats() { - return false; - } - void timed() { - StackBufBuilder b; - b.appendNum(3); - b.appendUChar(' '); - b.appendStr("abcd"); - n += b.len(); - } -}; - -// if a test is this fast, it was optimized out -class Dummy : public B { -public: - Dummy() {} - virtual int howLongMillis() { - return 3000; - } - string name() { - return "dummy"; - } - void timed() { - dontOptimizeOutHopefully++; - } - virtual bool showDurStats() { - return false; - } -}; - -// test thread local speed -#if defined(_WIN32) -__declspec(thread) int x; -class TLS2 : public B { -public: - virtual int howLongMillis() { - return 3000; - } - string name() { - return "thread-local-storage2"; - } - void timed() { - if (x) - dontOptimizeOutHopefully++; - } - virtual bool showDurStats() { - return false; - } -}; -#endif - -// test thread local speed -class TLS : public B { -public: - virtual int howLongMillis() { - return 3000; - } - string name() { - return "thread-local-storage"; - } - void timed() { - dontOptimizeOutHopefully++; - } - virtual bool showDurStats() { - return false; - } -}; - -bool dummy1 = false; - -class TestException : public DBException { -public: - TestException() : DBException("testexception", 3) {} -}; -struct Z { - Z() { - dontOptimizeOutHopefully--; - } - ~Z() { - dontOptimizeOutHopefully++; - } -}; -void thr1(int n) { - if (dontOptimizeOutHopefully) { - throw TestException(); - } - mongo::unittest::log() << "hmmm" << endl; -} -void thr2(int n) { - if (--n <= 0) { - if (dontOptimizeOutHopefully) { - throw TestException(); - } - mongo::unittest::log() << "hmmm" << endl; - } - Z z; - try { - thr2(n - 1); - } catch (DBException&) { - } -} -void thr3(int n) { - if (--n <= 0) { - if (dontOptimizeOutHopefully) { - throw TestException(); - } - mongo::unittest::log() << "hmmm" << endl; - } - try { - Z z; - thr3(n - 1); - } catch (DBException&) { - } -} -void thr4(int n) { - if (--n <= 0) { - if (dontOptimizeOutHopefully) { - throw TestException(); - } - mongo::unittest::log() << "hmmm" << endl; - } - Z z; - thr4(n - 1); -} -template <void T(int)> -class Throw : public B { -public: - virtual int howLongMillis() { - return 2000; - } - string name() { - return "throw"; - } - void timed() { - try { - T(10); - dontOptimizeOutHopefully += 2; - } catch (DBException& e) { - e.getCode(); - dontOptimizeOutHopefully++; - } - } - virtual bool showDurStats() { - return false; - } -}; - -class New128 : public B { -public: - virtual int howLongMillis() { - return 2000; - } - string name() { - return "new128"; - } - void timed() { - char* p = new char[128]; - if (dontOptimizeOutHopefully++ > 0) - delete[] p; - } - virtual bool showDurStats() { - return false; - } -}; - -class New8 : public B { -public: - virtual int howLongMillis() { - return 2000; - } - string name() { - return "new8"; - } - void timed() { - char* p = new char[8]; - if (dontOptimizeOutHopefully++ > 0) - delete[] p; - } - virtual bool showDurStats() { - return false; - } -}; - -class Compress : public B { -public: - const unsigned sz; - void* p; - Compress() : sz(1024 * 1024 * 100 + 3) {} - virtual unsigned batchSize() { - return 1; - } - string name() { - return "compress"; - } - virtual bool showDurStats() { - return false; - } - virtual int howLongMillis() { - return 4000; - } - void prep() { - p = mongoMalloc(sz); - // this isn't a fair test as it is mostly rands but we just want a rough perf check - static int last; - for (unsigned i = 0; i < sz; i++) { - int r = rand(); - if ((r & 0x300) == 0x300) - r = last; - ((char*)p)[i] = r; - last = r; - } - } - size_t last; - string res; - void timed() { - mongo::Timer t; - string out; - size_t len = compress((const char*)p, sz, &out); - bool ok = uncompress(out.c_str(), out.size(), &res); - ASSERT(ok); - static unsigned once; - if (once++ == 0) - cout << "compress round trip " << sz / (1024.0 * 1024) / (t.millis() / 1000.0) - << "MB/sec\n"; - // cout << len / (1024.0/1024) << " compressed" << endl; - (void)len; // fix unused error while above line is commented out - } - void post() { - ASSERT(memcmp(res.c_str(), p, sz) == 0); - free(p); - } -}; - -// test speed of checksum method -class ChecksumTest : public B { -public: - const unsigned sz; - ChecksumTest() : sz(1024 * 1024 * 100 + 3) {} - string name() { - return "checksum"; - } - virtual int howLongMillis() { - return 2000; - } - virtual bool showDurStats() { - return false; - } - virtual unsigned batchSize() { - return 1; - } - - void* p; - - void prep() { - { - // the checksum code assumes 'standard' rollover on addition overflows. let's check - // that: - unsigned long long x = 0xffffffffffffffffULL; - ASSERT(x + 2 == 1); - } - - p = malloc(sz); - for (unsigned i = 0; i < sz; i++) - ((char*)p)[i] = rand(); - } - - Checksum last; - - void timed() { - static int i; - Checksum c; - c.gen(p, sz); - if (i == 0) - last = c; - else if (i == 1) { - ASSERT(c == last); - } - } - void post() { - { - mongo::Checksum c; - c.gen(p, sz - 1); - ASSERT(c != last); - ((char*&)p)[0]++; // check same data, different order, doesn't give same checksum - ((char*&)p)[1]--; - c.gen(p, sz); - ASSERT(c != last); - // check same data, different order, doesn't give same checksum (different longwords - // case) - ((char*&)p)[1]++; - ((char*&)p)[8]--; - c.gen(p, sz); - ASSERT(c != last); - } - free(p); - } -}; - -class InsertDup : public B { - const BSONObj o; - -public: - InsertDup() : o(BSON("_id" << 1)) {} // dup keys - string name() { - return "insert-duplicate-_ids"; - } - void prep() { - client()->insert(ns(), o); - } - void timed() { - client()->insert(ns(), o); - } - void post() { - verify(client()->count(ns()) == 1); - } -}; - -class Insert1 : public B { - const BSONObj x; - OID oid; - BSONObj query; - -public: - virtual int howLongMillis() { - return profiling ? 30000 : 5000; - } - Insert1() : x(BSON("x" << 99)) { - oid.init(); - query = BSON("_id" << oid); - i = 0; - } - string name() { - return "insert-simple"; - } - unsigned i; - void timed() { - BSONObj o = BSON("_id" << i++ << "x" << 99); - client()->insert(ns(), o); - } - virtual bool testThreaded() { - if (profiling) - return false; - return true; - } - string name2() { - return "findOne_by_id"; - } - - void timed2(DBClientBase* c) { - Query q = QUERY("_id" << (unsigned)(rand() % i)); - c->findOne(ns(), q); - } - void post() { -#if !defined(MONGO_CONFIG_DEBUG_BUILD) - verify(client()->count(ns()) > 50); -#endif - } -}; - -class InsertBig : public B { - BSONObj x; - virtual int howLongMillis() { - if (sizeof(void*) == 4) { - // See SERVER-12556 - Running this test for some time causes occasional failures - // on Windows 32-bit, because the virtual address space is used up and remapping - // starts to fail. Value of zero means that only one iteration of the test - // will run. - // - return 0; - } - return 5000; - } - -public: - InsertBig() { - char buf[200000]; - BSONObjBuilder b; - b.append("x", 99); - b.appendBinData("bin", 200000, (BinDataType)129, buf); - x = b.obj(); - } - string name() { - return "insert-big"; - } - void timed() { - client()->insert(ns(), x); - } -}; - -class InsertRandom : public B { -public: - virtual int howLongMillis() { - return profiling ? 30000 : 5000; - } - string name() { - return "random-inserts"; - } - void prep() { - client()->insert(ns(), BSONObj()); - ASSERT_OK(dbtests::createIndex(txn(), ns(), BSON("x" << 1))); - } - void timed() { - int x = rand(); - BSONObj y = BSON("x" << x << "y" << rand() << "z" << 33); - client()->insert(ns(), y); - } -}; - -/** upserts about 32k records and then keeps updating them - 2 indexes -*/ -class Update1 : public B { -public: - static int rand() { - return std::rand() & 0x7fff; - } - virtual string name() { - return "random-upserts"; - } - void prep() { - client()->insert(ns(), BSONObj()); - ASSERT_OK(dbtests::createIndex(txn(), ns(), BSON("x" << 1))); - } - void timed() { - int x = rand(); - BSONObj q = BSON("x" << x); - BSONObj y = BSON("x" << x << "y" << rand() << "z" << 33); - client()->update(ns(), q, y, /*upsert*/ true); - } - virtual bool testThreaded() { - return true; - } - virtual string name2() { - return name() + "-inc"; - } - - virtual void timed2(DBClientBase* c) { - static BSONObj I = BSON("$inc" << BSON("y" << 1)); - // test some $inc's - int x = rand(); - BSONObj q = BSON("x" << x); - c->update(ns(), q, I); - } -}; - -template <typename T> -class MoreIndexes : public T { -public: - string name() { - return T::name() + "-more-indexes"; - } - void prep() { - T::prep(); - ASSERT_OK(dbtests::createIndex(this->txn(), this->ns(), BSON("y" << 1))); - ASSERT_OK(dbtests::createIndex(this->txn(), this->ns(), BSON("z" << 1))); - } -}; - -// Tests what the worst case is for the overhead of enabling a fail point. If 'fpInjected' -// is false, then the fail point will be compiled out. If 'fpInjected' is true, then the -// fail point will be compiled in. Since the conditioned block is more or less trivial, any -// difference in performance is almost entirely attributable to the cost of checking -// whether the failpoint is enabled. -// -// If fpEnabled is true, then the failpoint will be enabled, using the 'nTimes' model since -// this looks to be the most expensive code path through the fail point enable detection -// logic. -// -// It makes no sense to trigger the slow path if the fp is not injected, so that will fail -// to compile. -template <bool fpInjected, bool fpEnabled> -class FailPointTest : public B { -public: - static_assert(fpInjected || !fpEnabled, "fpInjected || !fpEnabled"); - - FailPointTest() : B(), _value(0) { - if (fpEnabled) { - _fp.setMode(FailPoint::nTimes, std::numeric_limits<FailPoint::ValType>::max()); - verify(_fp.shouldFail()); - } else { - verify(!_fp.shouldFail()); - } - } - - virtual string name() { - return std::string("failpoint") + (fpInjected ? "-present" : "-absent") + - (fpInjected ? (fpEnabled ? "-enabled" : "-disabled") : ""); - } - - virtual int howLongMillis() { - return 5000; - } - virtual bool showDurStats() { - return false; - } - - virtual void timed() { - if (MONGO_unlikely(_value != 0) || (fpInjected && MONGO_FAIL_POINT(_fp))) { - // We should only get here if the failpoint is enabled. - verify(fpEnabled); - } - } - - virtual string name2() { - // Will inhibit running 'timed2' as its own test, but will cause it to be run as a - // threaded test. - return name(); - } - - virtual void timed2(DBClientBase*) { - // We just want to re-run 'timed' when timed2 is invoked as a threaded test, so it - // invoke 'timed' statically to avoid overhead of virtual function call. - this->FailPointTest::timed(); - } - - virtual bool testThreaded() { - return true; - } - -private: - // The failpoint under test. - FailPoint _fp; - - // _value should always be zero for this test to behave as expected, but we don't want - // the compiler exploiting this fact to compile out our check, so mark it volatile. - const volatile int _value; -}; - -void t() { - for (int i = 0; i < 20; i++) { - sleepmillis(21); - string fn = "/tmp/t1"; - DurableMappedFile f; - unsigned long long len = 1 * 1024 * 1024; - verify(f.create(fn, len, /*sequential*/ rand() % 2 == 0)); - { - char* p = (char*)f.getView(); - verify(p); - // write something to the private view as a test - strcpy(p, "hello"); - } - if (storageGlobalParams.dur) { - char* w = (char*)f.view_write(); - strcpy(w + 6, "world"); - } - MongoFileFinder ff; - ASSERT(ff.findByPath(fn)); - } -} - -class StatusTestBase : public B { -public: - StatusTestBase() - : _message("Some string data that should not fit in a short string optimization") {} - - virtual int howLongMillis() { - return 2000; - } - virtual bool showDurStats() { - return false; - } - -protected: - NOINLINE_DECL Status doThingOK() const { - return Status::OK(); - } - - NOINLINE_DECL Status doThingNotOK() const { - return Status(ErrorCodes::InternalError, _message, 42); - } - -private: - const std::string _message; -}; - -class ReturnOKStatus : public StatusTestBase { -public: - string name() { - return "return-ok-status"; - } - void timed() { - doThingOK(); - } -}; - -class ReturnNotOKStatus : public StatusTestBase { -public: - string name() { - return "return-not-ok-status"; - } - void timed() { - doThingNotOK(); - } -}; - -class CopyOKStatus : public StatusTestBase { -public: - CopyOKStatus() : _status(doThingOK()) {} - - string name() { - return "copy-ok-status"; - } - void timed() { - const Status copy = _status; - } - -private: - const Status _status; -}; - -class CopyNotOKStatus : public StatusTestBase { -public: - CopyNotOKStatus() : _status(doThingNotOK()) {} - - string name() { - return "copy-not-ok-status"; - } - void timed() { - const Status copy = _status; - } - -private: - const Status _status; -}; - -class StatusMoveTestBase : public StatusTestBase { -public: - StatusMoveTestBase(bool ok) - : StatusTestBase(), - _a(ok ? doThingOK() : doThingNotOK()), - _b(_a.isOK() ? Status::OK() : Status(_a.code(), _a.reason().c_str(), _a.location())) {} - - void timed() { - Status temp(std::move(_a)); - _a = std::move(_b); - _b = std::move(temp); - } - -protected: - Status _a; - Status _b; -}; - -class MoveOKStatus : public StatusMoveTestBase { -public: - MoveOKStatus() : StatusMoveTestBase(true) {} - string name() { - return "move-ok-status"; - } -}; - -class MoveNotOKStatus : public StatusMoveTestBase { -public: - MoveNotOKStatus() : StatusMoveTestBase(false) {} - string name() { - return "move-not-ok-status"; - } -}; class All : public Suite { public: All() : Suite("perf") {} - Result* run(const string& filter, int runsPerTest) { - stdx::thread a(t); - Result* res = Suite::run(filter, runsPerTest); - a.join(); - return res; - } - void setupTests() { - pstatsConnect(); cout << "stats test rps------ time-- " << dur::stats.curr()->_CSVHeader() << endl; - if (profiling) { - add<Insert1>(); - } else { - add<Dummy>(); - add<ChecksumTest>(); - add<Compress>(); - add<TLS>(); -#if defined(_WIN32) - add<TLS2>(); -#endif - add<New8>(); - add<New128>(); - add<Throw<thr1>>(); - add<Throw<thr2>>(); - add<Throw<thr3>>(); - add<Throw<thr4>>(); - add<Timer>(); - add<Sleep0Ms>(); -#if defined(__USE_XOPEN2K) - add<Yield>(); -#endif - add<rlock>(); - add<wlock>(); - add<glockerIX>(); - add<glockerIS>(); - add<locker_contestedX>(); - add<locker_uncontestedX>(); - add<locker_contestedS>(); - add<locker_uncontestedS>(); - add<NotifyOne>(); - add<simplemutexspeed>(); - add<boostmutexspeed>(); - add<boosttimed_mutexspeed>(); - add<stdmutexspeed>(); - add<stdtimed_mutexspeed>(); - add<spinlockspeed>(); -#ifdef RUNCOMPARESWAP - add<casspeed>(); -#endif - add<CTM>(); - add<CTMicros>(); - add<KeyTest>(); - add<Bldr>(); - add<StkBldr>(); - add<BSONIter>(); - add<BSONGetFields1>(); - add<BSONGetFields2>(); - // add< TaskQueueTest >(); - add<InsertDup>(); - add<Insert1>(); - add<InsertRandom>(); - add<MoreIndexes<InsertRandom>>(); - add<Update1>(); - add<MoreIndexes<Update1>>(); - add<InsertBig>(); - add<FailPointTest<false, false>>(); - add<FailPointTest<true, false>>(); - add<FailPointTest<true, true>>(); - - add<ReturnOKStatus>(); - add<ReturnNotOKStatus>(); - add<CopyOKStatus>(); - add<CopyNotOKStatus>(); - add<MoveOKStatus>(); - add<MoveNotOKStatus>(); - } + add<simplemutexspeed>(); + add<boostmutexspeed>(); + add<boosttimed_mutexspeed>(); + add<stdmutexspeed>(); + add<stdtimed_mutexspeed>(); } } myall; } |