Files
mongo/s/d_logic.cpp

108 lines
3.2 KiB
C++
Raw Normal View History

2009-03-17 17:25:10 -04:00
// d_logic.cpp
2009-03-11 17:28:49 -04:00
/**
* 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/>.
*/
/**
these are commands that live in mongod
mostly around shard management and checking
*/
2010-04-27 15:27:52 -04:00
#include "pch.h"
2009-03-11 17:28:49 -04:00
#include <map>
#include <string>
#include "../db/commands.h"
#include "../db/jsobj.h"
2009-03-17 17:25:10 -04:00
#include "../db/dbmessage.h"
2010-04-29 12:35:36 -04:00
#include "../db/query.h"
2009-03-11 17:28:49 -04:00
#include "../client/connpool.h"
#include "../util/queue.h"
2010-04-19 16:59:50 -04:00
#include "shard.h"
#include "d_logic.h"
2010-04-19 16:59:50 -04:00
2009-03-11 17:28:49 -04:00
using namespace std;
namespace mongo {
2010-06-14 18:44:51 -04:00
2009-03-17 17:25:10 -04:00
bool handlePossibleShardedMessage( Message &m, DbResponse &dbresponse ){
2010-06-14 18:44:51 -04:00
if ( ! shardingState.enabled() )
2009-12-27 00:41:39 -05:00
return false;
2010-05-12 15:26:00 -07:00
int op = m.operation();
2010-04-29 20:32:52 -04:00
if ( op < 2000
|| op >= 3000
|| op == dbGetMore // cursors are weird
)
2009-03-17 17:25:10 -04:00
return false;
2010-05-12 15:26:00 -07:00
const char *ns = m.singleData()->_data + 4;
2009-03-17 17:25:10 -04:00
string errmsg;
if ( shardVersionOk( ns , errmsg ) ){
2009-03-17 17:25:10 -04:00
return false;
}
log() << "shardVersionOk failed ns:" << ns << " " << errmsg << endl;
2009-03-17 17:25:10 -04:00
if ( doesOpGetAResponse( op ) ){
BufBuilder b( 32768 );
b.skip( sizeof( QueryResult ) );
{
BSONObj obj = BSON( "$err" << errmsg );
b.appendBuf( obj.objdata() , obj.objsize() );
2009-03-17 17:25:10 -04:00
}
QueryResult *qr = (QueryResult*)b.buf();
2010-07-18 13:34:16 -04:00
qr->_resultFlags() = ResultFlag_ErrSet | ResultFlag_ShardConfigStale;
2009-03-17 17:25:10 -04:00
qr->len = b.len();
qr->setOperation( opReply );
qr->cursorId = 0;
qr->startingFrom = 0;
qr->nReturned = 1;
b.decouple();
Message * resp = new Message();
resp->setData( qr , true );
dbresponse.response = resp;
2010-05-12 15:26:00 -07:00
dbresponse.responseTo = m.header()->id;
2009-03-17 17:25:10 -04:00
return true;
}
2010-06-14 18:44:51 -04:00
const OID& clientID = ShardedConnectionInfo::get(false)->getID();
massert( 10422 , "write with bad shard config and no server id!" , clientID.isSet() );
log() << "got write with an old config - writing back ns: " << ns << endl;
BSONObjBuilder b;
b.appendBool( "writeBack" , true );
b.append( "ns" , ns );
b.appendTimestamp( "version" , shardingState.getVersion( ns ) );
2010-07-15 09:52:43 -04:00
b.appendTimestamp( "yourVersion" , ShardedConnectionInfo::get( true )->getVersion( ns ) );
2010-05-12 15:26:00 -07:00
b.appendBinData( "msg" , m.header()->len , bdtCustom , (char*)(m.singleData()) );
log() << "writing back msg with len: " << m.header()->len << " op: " << m.operation() << endl;
2010-06-14 18:44:51 -04:00
queueWriteBack( clientID.str() , b.obj() );
2009-03-17 17:25:10 -04:00
return true;
}
2009-11-03 10:35:48 -05:00
2009-03-11 17:28:49 -04:00
}