summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--s/d_logic.cpp17
-rw-r--r--s/shard.h5
-rw-r--r--s/strategy.cpp4
-rw-r--r--s/strategy.h2
-rw-r--r--s/strategy_shard.cpp8
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 );
}
}