/usr/include/mongo/s/balancer_policy.h is in mongodb-dev 1:2.4.9-1ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 | // @file balancer_policy.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/>.
*/
#ifndef S_BALANCER_POLICY_HEADER
#define S_BALANCER_POLICY_HEADER
#include "mongo/db/jsobj.h"
#include "mongo/s/type_chunk.h"
namespace mongo {
struct ChunkInfo {
const BSONObj min;
const BSONObj max;
ChunkInfo( const BSONObj& a_min, const BSONObj& a_max )
: min( a_min.getOwned() ), max( a_max.getOwned() ){}
ChunkInfo( const BSONObj& chunk )
: min(chunk[ChunkType::min()].Obj().getOwned()),
max(chunk[ChunkType::max()].Obj().getOwned()) {
}
string toString() const;
};
struct TagRange {
BSONObj min;
BSONObj max;
string tag;
TagRange(){}
TagRange( const BSONObj& a_min, const BSONObj& a_max, const string& a_tag )
: min( a_min.getOwned() ), max( a_max.getOwned() ), tag( a_tag ){}
string toString() const;
};
class ShardInfo {
public:
ShardInfo();
ShardInfo( long long maxSize, long long currSize,
bool draining, bool opsQueued,
const set<string>& tags = set<string>(),
const string& _mongoVersion = string("") );
void addTag( const string& tag );
/** @return true if we have the tag OR if the tag is "" */
bool hasTag( const string& tag ) const;
/**
* @return true if a shard cannot receive any new chunks because it reaches 'shardLimits'.
* Expects the optional fields "maxSize", can in size in MB, and "usedSize", currently used size
* in MB, on 'shardLimits'.
*/
bool isSizeMaxed() const;
/**
* @return true if 'shardLimist' contains a field "draining". Expects the optional field
* "isDraining" on 'shrdLimits'.
*/
bool isDraining() const { return _draining; }
/**
* @return true if a shard currently has operations in any of its writeback queues
*/
bool hasOpsQueued() const { return _hasOpsQueued; }
long long getMaxSize() const { return _maxSize; }
long long getCurrSize() const { return _currSize; }
string getMongoVersion() const { return _mongoVersion; }
string toString() const;
private:
long long _maxSize;
long long _currSize;
bool _draining;
bool _hasOpsQueued;
set<string> _tags;
string _mongoVersion;
};
struct MigrateInfo {
const string ns;
const string to;
const string from;
const ChunkInfo chunk;
MigrateInfo( const string& a_ns , const string& a_to , const string& a_from , const BSONObj& a_chunk )
: ns( a_ns ) , to( a_to ) , from( a_from ), chunk( a_chunk ) {}
};
typedef map< string,ShardInfo > ShardInfoMap;
typedef map< string,vector<BSONObj> > ShardToChunksMap;
class DistributionStatus : boost::noncopyable {
public:
DistributionStatus( const ShardInfoMap& shardInfo,
const ShardToChunksMap& shardToChunksMap );
// only used when building
/**
* @return if range is valid
*/
bool addTagRange( const TagRange& range );
// ---- these methods might be better suiting in BalancerPolicy
/**
* @param forTag "" if you don't care, or a tag
* @return shard best suited to receive a chunk
*/
string getBestReceieverShard( const string& forTag ) const;
/**
* @return the shard with the most chunks
* based on # of chunks with the given tag
*/
string getMostOverloadedShard( const string& forTag ) const;
// ---- basic accessors, counters, etc...
/** @return total number of chunks */
unsigned totalChunks() const;
/** @return number of chunks in this shard */
unsigned numberOfChunksInShard( const string& shard ) const;
/** @return number of chunks in this shard with the given tag */
unsigned numberOfChunksInShardWithTag( const string& shard, const string& tag ) const;
/** @return chunks for the shard */
const vector<BSONObj>& getChunks( const string& shard ) const;
/** @return all tags we know about, not include "" */
const set<string>& tags() const { return _allTags; }
/** @return the right tag for chunk, possibly "" */
string getTagForChunk( const BSONObj& chunk ) const;
/** @return all shards we know about */
const set<string>& shards() const { return _shards; }
/** @return the ShardInfo for the shard */
const ShardInfo& shardInfo( const string& shard ) const;
/** writes all state to log() */
void dump() const;
private:
const ShardInfoMap& _shardInfo;
const ShardToChunksMap& _shardChunks;
map<BSONObj,TagRange> _tagRanges;
set<string> _allTags;
set<string> _shards;
};
class BalancerPolicy {
public:
/**
* Returns a suggested chunk to move whithin a collection's shards, given information about
* space usage and number of chunks for that collection. If the policy doesn't recommend
* moving, it returns NULL.
*
* @param ns is the collections namepace.
* @param DistributionStatus holds all the info about the current state of the cluster/namespace
* @param balancedLastTime is the number of chunks effectively moved in the last round.
* @returns NULL or MigrateInfo of the best move to make towards balacing the collection.
* caller owns the MigrateInfo instance
*/
static MigrateInfo* balance( const string& ns,
const DistributionStatus& distribution,
int balancedLastTime );
private:
static bool _isJumbo( const BSONObj& chunk );
};
} // namespace mongo
#endif // S_BALANCER_POLICY_HEADER
|