diff options
-rw-r--r-- | s/d_logic.cpp | 17 | ||||
-rw-r--r-- | s/shard.h | 5 | ||||
-rw-r--r-- | s/strategy.cpp | 4 | ||||
-rw-r--r-- | s/strategy.h | 2 | ||||
-rw-r--r-- | s/strategy_shard.cpp | 8 |
5 files changed, 30 insertions, 6 deletions
diff --git a/s/d_logic.cpp b/s/d_logic.cpp index 496458d7fc7..7a860e7d3b3 100644 --- a/s/d_logic.cpp +++ b/s/d_logic.cpp @@ -52,9 +52,22 @@ namespace mongo { || op == dbGetMore // cursors are weird ) return false; - - const char *ns = m.singleData()->_data + 4; + DbMessage d(m); + if ( op == dbUpdate ){ + if ( d.getInt(0) & UpdateOption_Broadcast ){ + assert(0); + return false; + } + } + else if ( op == dbDelete ){ + if ( d.getInt(0) & RemoveOption_Broadcast ){ + assert(0); + return false; + } + } + + const char *ns = d.getns(); string errmsg; if ( shardVersionOk( ns , errmsg ) ){ return false; diff --git a/s/shard.h b/s/shard.h index 4d5095c7d99..71576ccc350 100644 --- a/s/shard.h +++ b/s/shard.h @@ -220,6 +220,11 @@ namespace mongo { } static void sync(); + + void donotCheckVersion(){ + _setVersion = false; + _finishedInit = true; + } private: void _init(); diff --git a/s/strategy.cpp b/s/strategy.cpp index c635792cf22..f884baf7d95 100644 --- a/s/strategy.cpp +++ b/s/strategy.cpp @@ -27,8 +27,10 @@ namespace mongo { // ----- Strategy ------ - void Strategy::doWrite( int op , Request& r , const Shard& shard ){ + void Strategy::doWrite( int op , Request& r , const Shard& shard , bool checkVersion ){ ShardConnection conn( shard , r.getns() ); + if ( ! checkVersion ) + conn.donotCheckVersion(); conn->say( r.m() ); conn.done(); } diff --git a/s/strategy.h b/s/strategy.h index c9f4bb804b7..2aa4434ffba 100644 --- a/s/strategy.h +++ b/s/strategy.h @@ -33,7 +33,7 @@ namespace mongo { virtual void writeOp( int op , Request& r ) = 0; protected: - void doWrite( int op , Request& r , const Shard& shard ); + void doWrite( int op , Request& r , const Shard& shard , bool checkVersion = true ); void doQuery( Request& r , const Shard& shard ); void insert( const Shard& shard , const char * ns , const BSONObj& obj ); diff --git a/s/strategy_shard.cpp b/s/strategy_shard.cpp index 0ec723afc82..2f50401246c 100644 --- a/s/strategy_shard.cpp +++ b/s/strategy_shard.cpp @@ -219,8 +219,10 @@ namespace mongo { if ( multi ){ set<Shard> shards; manager->getShardsForQuery( shards , chunkFinder ); + int * x = (int*)(r.d().afterNS()); + x[0] |= UpdateOption_Broadcast; for ( set<Shard>::iterator i=shards.begin(); i!=shards.end(); i++){ - doWrite( dbUpdate , r , *i ); + doWrite( dbUpdate , r , *i , false ); } } else { @@ -251,7 +253,9 @@ namespace mongo { throw UserException( 8015 , "can only delete with a non-shard key pattern if can delete as many as we find" ); for ( set<Shard>::iterator i=shards.begin(); i!=shards.end(); i++){ - doWrite( dbDelete , r , *i ); + int * x = (int*)(r.d().afterNS()); + x[0] |= RemoveOption_Broadcast; + doWrite( dbDelete , r , *i , false ); } } |