summaryrefslogtreecommitdiff
path: root/jstests/sharding/bigMapReduce.js
blob: b4a293b1d58d6486bdd86268591202979459c59f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
s = new ShardingTest( "bigMapReduce" , 2 , 1 , 1 , { chunksize : 1 } );

s.adminCommand( { enablesharding : "test" } )
s.adminCommand( { shardcollection : "test.foo", key : { "_id" : 1 } } )

db = s.getDB( "test" );
var str=""
for (i=0;i<4*1024;i++) { str=str+"a"; }
for (j=0; j<50; j++) for (i=0; i<512; i++){ db.foo.save({y:str})}
db.getLastError();

s.printChunks();
s.printChangeLog();

function map() { emit('count', 1); } 
function reduce(key, values) { return Array.sum(values) } 

gotAGoodOne = false;

for ( iter=0; iter<5; iter++ ){
    try {
        out = db.foo.mapReduce(map, reduce,"big_out") 
        gotAGoodOne = true
    }
    catch ( e ){
        if ( __mrerror__ && __mrerror__.cause && __mrerror__.cause.assertionCode == 13388 ){
            // TODO: SERVER-2396
            sleep( 1000 );
            continue;
        }
        printjson( __mrerror__ );
        throw e;
    }
}
assert( gotAGoodOne , "no good for basic" )

gotAGoodOne = false;
// test output to a different DB
// do it multiple times so that primary shard changes
for (iter = 0; iter < 5; iter++) {
    outCollStr = "mr_replace_col_" + iter;
    outDbStr = "mr_db_" + iter;

    print("Testing mr replace into DB " + iter)

    try {
        res = db.foo.mapReduce( map , reduce , { out : { replace: outCollStr, db: outDbStr } } )
        gotAGoodOne = true;
    }
    catch ( e ){
        if ( __mrerror__ && __mrerror__.cause && __mrerror__.cause.assertionCode == 13388 ){
            // TODO: SERVER-2396
            sleep( 1000 );
            continue;
        }
        printjson( __mrerror__ );
        throw e;
    }
    printjson(res);

    outDb = s.getDB(outDbStr);
    outColl = outDb[outCollStr];

    obj = outColl.convertToSingleObject("value");
    assert.eq( 25600 , obj.count , "Received wrong result " + obj.count );

    print("checking result field");
    assert.eq(res.result.collection, outCollStr, "Wrong collection " + res.result.collection);
    assert.eq(res.result.db, outDbStr, "Wrong db " + res.result.db);

    // make sure final collection has index on _id
    assert(outDb.system.indexes.count({ns: outDbStr + "." + outCollStr, key: {_id: 1}}) > 0, "No index on _id")
    assert( gotAGoodOne , "no good for out db" )
}

assert( gotAGoodOne , "no good for out db" )

s.stop()