/usr/include/mongo/s/shard.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 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 | // @file shard.h
/**
* Copyright (C) 2008 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 "mongo/pch.h"
#include "mongo/client/connpool.h"
namespace mongo {
class ShardConnection;
class ShardStatus;
/*
* A "shard" one partition of the overall database (and a replica set typically).
*/
class Shard {
public:
Shard()
: _name("") , _addr("") , _maxSize(0) , _isDraining( false ) {
}
Shard( const string& name , const string& addr, long long maxSize = 0 , bool isDraining = false )
: _name(name) , _addr( addr ) , _maxSize( maxSize ) , _isDraining( isDraining ) {
_setAddr( addr );
}
Shard( const string& ident ) {
reset( ident );
}
Shard( const Shard& other )
: _name( other._name ) , _addr( other._addr ) , _cs( other._cs ) ,
_maxSize( other._maxSize ) , _isDraining( other._isDraining ),
_tags( other._tags ) {
}
Shard( const Shard* other )
: _name( other->_name ) , _addr( other->_addr ), _cs( other->_cs ) ,
_maxSize( other->_maxSize ) , _isDraining( other->_isDraining ) {
}
static Shard make( const string& ident ) {
Shard s;
s.reset( ident );
return s;
}
/**
* @param ident either name or address
*/
void reset( const string& ident );
void setAddress( const ConnectionString& cs );
ConnectionString getAddress() const { return _cs; }
string getName() const {
verify( _name.size() );
return _name;
}
string getConnString() const {
verify( _addr.size() );
return _addr;
}
long long getMaxSize() const {
return _maxSize;
}
bool isDraining() const {
return _isDraining;
}
string toString() const {
return _name + ":" + _addr;
}
friend ostream& operator << (ostream& out, const Shard& s) {
return (out << s.toString());
}
bool operator==( const Shard& s ) const {
if ( _name != s._name )
return false;
return _cs.sameLogicalEndpoint( s._cs );
}
bool operator!=( const Shard& s ) const {
return ! ( *this == s );
}
bool operator==( const string& s ) const {
return _name == s || _addr == s;
}
bool operator!=( const string& s ) const {
return _name != s && _addr != s;
}
bool operator<(const Shard& o) const {
return _name < o._name;
}
bool ok() const { return _addr.size() > 0; }
// Set internal to true to run the command with internal authentication privileges.
BSONObj runCommand( const string& db , const string& simple , bool internal = false ) const {
return runCommand( db , BSON( simple << 1 ) , internal );
}
BSONObj runCommand( const string& db , const BSONObj& cmd , bool internal = false) const ;
ShardStatus getStatus() const ;
/**
* mostly for replica set
* retursn true if node is the shard
* of if the replica set contains node
*/
bool containsNode( const string& node ) const;
const set<string>& tags() const { return _tags; }
void addTag( const string& tag ) { _tags.insert( tag ); }
static void getAllShards( vector<Shard>& all );
static void printShardInfo( ostream& out );
static Shard lookupRSName( const string& name);
/**
* @parm current - shard where the chunk/database currently lives in
* @return the currently emptiest shard, if best then current, or EMPTY
*/
static Shard pick( const Shard& current = EMPTY );
static void reloadShardInfo();
static void removeShard( const string& name );
static bool isAShardNode( const string& ident );
static Shard EMPTY;
private:
void _setAddr( const string& addr );
string _name;
string _addr;
ConnectionString _cs;
long long _maxSize; // in MBytes, 0 is unlimited
bool _isDraining; // shard is currently being removed
set<string> _tags;
};
typedef shared_ptr<Shard> ShardPtr;
class ShardStatus {
public:
ShardStatus( const Shard& shard , const BSONObj& obj );
friend ostream& operator << (ostream& out, const ShardStatus& s) {
out << s.toString();
return out;
}
string toString() const {
stringstream ss;
ss << "shard: " << _shard
<< " mapped: " << _mapped
<< " writeLock: " << _writeLock
<< " version: " << _mongoVersion;
return ss.str();
}
bool operator<( const ShardStatus& other ) const {
return _mapped < other._mapped;
}
Shard shard() const {
return _shard;
}
long long mapped() const {
return _mapped;
}
bool hasOpsQueued() const {
return _hasOpsQueued;
}
string mongoVersion() const {
return _mongoVersion;
}
private:
Shard _shard;
long long _mapped;
bool _hasOpsQueued; // true if 'writebacks' are pending
double _writeLock;
string _mongoVersion;
};
class ChunkManager;
typedef shared_ptr<const ChunkManager> ChunkManagerPtr;
class ShardConnection : public AScopedConnection {
public:
ShardConnection( const Shard * s , const string& ns, ChunkManagerPtr manager = ChunkManagerPtr() );
ShardConnection( const Shard& s , const string& ns, ChunkManagerPtr manager = ChunkManagerPtr() );
ShardConnection( const string& addr , const string& ns, ChunkManagerPtr manager = ChunkManagerPtr() );
~ShardConnection();
void done();
void kill();
DBClientBase& conn() {
_finishInit();
verify( _conn );
return *_conn;
}
DBClientBase* operator->() {
_finishInit();
verify( _conn );
return _conn;
}
DBClientBase* get() {
_finishInit();
verify( _conn );
return _conn;
}
/**
* @return the connection object underneath without setting the shard version.
* @throws AssertionException if _conn is uninitialized.
*/
DBClientBase* getRawConn() const {
verify( _conn );
return _conn;
}
string getHost() const {
return _addr;
}
string getNS() const {
return _ns;
}
ChunkManagerPtr getManager() const {
return _manager;
}
bool setVersion() {
_finishInit();
return _setVersion;
}
static void sync();
void donotCheckVersion() {
_setVersion = false;
_finishedInit = true;
}
bool ok() const { return _conn > 0; }
/**
this just passes through excpet it checks for stale configs
*/
bool runCommand( const string& db , const BSONObj& cmd , BSONObj& res );
// Whether or not we release connections from the thread-local cache after a read
static bool releaseConnectionsAfterResponse;
// Controls whether we throw on initially failing to set a version
static bool ignoreInitialVersionFailure;
/** checks all of my thread local connections for the version of this ns */
static void checkMyConnectionVersions( const string & ns );
/**
* Returns all the current sharded connections to the pool.
* Note: This is *dangerous* if we have GLE state.
*/
static void releaseMyConnections();
/**
* Clears all connections in the sharded pool, including connections in the
* thread local storage pool of the current thread.
*/
static void clearPool();
/**
* Forgets a namespace to prevent future versioning.
*/
static void forgetNS( const string& ns );
private:
void _init();
void _finishInit();
bool _finishedInit;
string _addr;
string _ns;
ChunkManagerPtr _manager;
DBClientBase* _conn;
bool _setVersion;
};
extern DBConnectionPool shardConnectionPool;
class ShardingConnectionHook : public DBConnectionHook {
public:
ShardingConnectionHook( bool shardedConnections )
: _shardedConnections( shardedConnections ) {
}
virtual void onCreate( DBClientBase * conn );
virtual void onDestroy( DBClientBase * conn );
bool _shardedConnections;
};
}
|