summaryrefslogtreecommitdiff
path: root/s/strategy_single.cpp
diff options
context:
space:
mode:
Diffstat (limited to 's/strategy_single.cpp')
-rw-r--r--s/strategy_single.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/s/strategy_single.cpp b/s/strategy_single.cpp
index b45af4c57c2..2408b48055e 100644
--- a/s/strategy_single.cpp
+++ b/s/strategy_single.cpp
@@ -64,8 +64,51 @@ namespace mongo {
}
+ void handleIndexWrite( int op , Request& r ){
+
+ DbMessage& d = r.d();
+
+ if ( op == dbInsert ){
+ while( d.moreJSObjs() ){
+ BSONObj o = d.nextJsObj();
+ const char * ns = o["ns"].valuestr();
+ if ( r.getConfig()->isSharded( ns ) ){
+ uassert( "can't use unique indexes with sharding" , ! o["unique"].trueValue() );
+ ChunkManager * cm = r.getConfig()->getChunkManager( ns );
+ assert( cm );
+ for ( int i=0; i<cm->numChunks();i++)
+ doWrite( op , r , cm->getChunk(i)->getShard() );
+ }
+ else {
+ doWrite( op , r , r.singleServerName() );
+ }
+ }
+ }
+ else if ( op == dbUpdate ){
+ throw UserException( "can't update system.indexes" );
+ }
+ else if ( op == dbDelete ){
+ // TODO
+ throw UserException( "can't delete indexes on sharded collection yet" );
+ }
+ else {
+ log() << "handleIndexWrite invalid write op: " << op << endl;
+ throw UserException( "handleIndexWrite invalid write op" );
+ }
+
+ }
+
virtual void writeOp( int op , Request& r ){
const char *ns = r.getns();
+
+ if ( r.isShardingEnabled() &&
+ strstr( ns , ".system.indexes" ) == strstr( ns , "." ) &&
+ strstr( ns , "." ) ){
+ log(1) << " .system.indexes write for: " << ns << endl;
+ handleIndexWrite( op , r );
+ return;
+ }
+
log(3) << "single write: " << ns << endl;
doWrite( op , r , r.singleServerName() );
}