summaryrefslogtreecommitdiff
path: root/s
diff options
context:
space:
mode:
authorEliot Horowitz <eliot@10gen.com>2009-02-26 15:21:47 -0500
committerEliot Horowitz <eliot@10gen.com>2009-02-26 15:21:47 -0500
commitd8661d9b0825df64aae0714274440ab06fb6a802 (patch)
tree9087f168a8b9fd63e9dffbfb527840bc5ae96f5a /s
parent347c6a862fe24b04f97039a7b4d3e7dda302bd76 (diff)
downloadmongo-d8661d9b0825df64aae0714274440ab06fb6a802.tar.gz
sharded delete
Diffstat (limited to 's')
-rw-r--r--s/strategy_shard.cpp33
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" );