diff options
author | Alberto Lerner <alerner@10gen.com> | 2010-09-22 11:16:44 -0400 |
---|---|---|
committer | Alberto Lerner <alerner@10gen.com> | 2010-09-22 11:16:44 -0400 |
commit | 3f41bf1c714177601e7bc4e4a9067704d79a41dd (patch) | |
tree | 9d773360355275fea6628bb1dba0916430c8746e /s/d_writeback.h | |
parent | 9183168f8c0d15357e4d247f0686f5a2bebb561b (diff) | |
download | mongo-3f41bf1c714177601e7bc4e4a9067704d79a41dd.tar.gz |
SERVER-1713 a WriteBackManager and exposing its queuesEmpty() method
Diffstat (limited to 's/d_writeback.h')
-rw-r--r-- | s/d_writeback.h | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/s/d_writeback.h b/s/d_writeback.h new file mode 100644 index 00000000000..365a3e6aadc --- /dev/null +++ b/s/d_writeback.h @@ -0,0 +1,75 @@ +// @file d_writeback.h + +/** +* 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/>. +*/ + +#pragma once + +#include "../pch.h" + +#include "../util/queue.h" + +namespace mongo { + + /* + * The WriteBackManager keeps one queue of pending operations per mongos. The operations get here + * if they were directed to a chunk that is no longer in this mongod server. The operations are + * "written back" to the mongos server per its request (command 'writebacklisten'). + * + * The class is thread safe. + */ + class WriteBackManager{ + public: + WriteBackManager(); + ~WriteBackManager(); + + /* + * @param remote server ID this operation came from + * @param op the operation itself + * + * Enqueues opeartion 'op' in server 'remote's queue. The operation will be written back to + * remote at a later stager. + */ + void queueWriteBack( const string& remote , const BSONObj& op ); + + /* + * @param remote server ID + * @return the queue for operations that came from 'remote' + * + * Gets access to server 'remote's queue, which is synchronized. + */ + BlockingQueue<BSONObj>* getWritebackQueue( const string& remote ); + + /* + * @return true if there is no operation queued for write back + */ + bool queuesEmpty() const; + + private: + // a map from mongos's serverIDs to queues of "rejected" operations + // an operation is rejected if it targets data that does not live on this shard anymore + typedef map< string , BlockingQueue<BSONObj>* > WriteBackQueuesMap; + + // '_writebackQueueLock' protects only the map itself, since each queue is syncrhonized. + mutable mongo::mutex _writebackQueueLock; + WriteBackQueuesMap _writebackQueues; + + }; + + // TODO collect global state in a central place and init during startup + extern WriteBackManager writeBackManager; + +} // namespace mongo |