summaryrefslogtreecommitdiff
path: root/src/mongo/db/background.cpp
blob: c57c3a5e919d69cb531f085547c0421e92afaa83 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// background.cpp

/**
*    Copyright (C) 2010 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 "mongo/db/background.h"

namespace mongo {

    SimpleMutex BackgroundOperation::m("bg");
    std::map<std::string, unsigned> BackgroundOperation::dbsInProg;
    std::set<std::string> BackgroundOperation::nsInProg;

    bool BackgroundOperation::inProgForDb(const StringData& db) {
        SimpleMutex::scoped_lock lk(m);
        return dbsInProg[db.toString()] > 0;
    }

    bool BackgroundOperation::inProgForNs(const StringData& ns) {
        SimpleMutex::scoped_lock lk(m);
        return nsInProg.count(ns.toString()) > 0;
    }

    void BackgroundOperation::assertNoBgOpInProgForDb(const StringData& db) {
        uassert(12586,
                "cannot perform operation: a background operation is currently running for this database",
                !inProgForDb(db));
    }

    void BackgroundOperation::assertNoBgOpInProgForNs(const StringData& ns) {
        uassert(12587,
                "cannot perform operation: a background operation is currently running for this collection",
                !inProgForNs(ns));
    }

    BackgroundOperation::BackgroundOperation(const StringData& ns) : _ns(ns) {
        SimpleMutex::scoped_lock lk(m);
        dbsInProg[_ns.db().toString()]++;
        nsInProg.insert(_ns.ns());
    }

    BackgroundOperation::~BackgroundOperation() {
        SimpleMutex::scoped_lock lk(m);
        dbsInProg[_ns.db().toString()]--;
        nsInProg.erase(_ns.ns());
    }

    void BackgroundOperation::dump(std::stringstream& ss) {
        SimpleMutex::scoped_lock lk(m);
        if( nsInProg.size() ) {
            ss << "\n<b>Background Jobs in Progress</b>\n";
            for( std::set<std::string>::iterator i = nsInProg.begin(); i != nsInProg.end(); i++ )
                ss << "  " << *i << '\n';
        }
        for( std::map<std::string,unsigned>::iterator i = dbsInProg.begin(); i != dbsInProg.end(); i++ ) {
            if( i->second )
                ss << "database " << i->first << ": " << i->second << '\n';
        }
    }




} // namespace mongo