diff options
author | Eliot Horowitz <eliot@10gen.com> | 2009-02-26 15:21:47 -0500 |
---|---|---|
committer | Eliot Horowitz <eliot@10gen.com> | 2009-02-26 15:21:47 -0500 |
commit | d8661d9b0825df64aae0714274440ab06fb6a802 (patch) | |
tree | 9087f168a8b9fd63e9dffbfb527840bc5ae96f5a /s | |
parent | 347c6a862fe24b04f97039a7b4d3e7dda302bd76 (diff) | |
download | mongo-d8661d9b0825df64aae0714274440ab06fb6a802.tar.gz |
sharded delete
Diffstat (limited to 's')
-rw-r--r-- | s/strategy_shard.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/s/strategy_shard.cpp b/s/strategy_shard.cpp index d07fd1e4e4e..12b9628f828 100644 --- a/s/strategy_shard.cpp +++ b/s/strategy_shard.cpp @@ -137,7 +137,37 @@ namespace mongo { Shard& s = manager->findShard( toupdate ); doWrite( dbUpdate , r , s.getServer() ); } + + void receivedDelete( Request& r , DbMessage& d, ShardManager* manager ){ + int flags = d.pullInt(); + bool justOne = flags & 1; + + uassert( "bad delete message" , d.moreJSObjs() ); + BSONObj pattern = d.nextJsObj(); + + if ( manager->hasShardKey( pattern ) ){ + Shard& s = manager->findShard( pattern ); + doWrite( dbDelete , r , s.getServer() ); + return; + } + + if ( ! justOne && ! pattern.hasField( "_id" ) ) + throw UserException( "can only delete with a non-shard key pattern if can delete as many as we find" ); + + vector<Shard*> shards; + manager->getShardsForQuery( shards , pattern ); + + set<string> seen; + for ( vector<Shard*>::iterator i=shards.begin(); i!=shards.end(); i++){ + Shard * s = *i; + if ( seen.count( s->getServer() ) ) + continue; + seen.insert( s->getServer() ); + doWrite( dbDelete , r , s->getServer() ); + } + } + virtual void writeOp( int op , Request& r ){ const char *ns = r.getns(); @@ -153,6 +183,9 @@ namespace mongo { else if ( op == dbUpdate ){ receivedUpdate( r , d , info ); } + else if ( op == dbDelete ){ + receivedDelete( r , d , info ); + } else { log() << "sharding can't do write op: " << op << endl; throw UserException( "can't do this write op on sharded collection" ); |