int ConfigDiffTracker<ValType,ShardType>::
calculateConfigDiff( string config,
                     const set<ChunkVersion>& extraMinorVersions )
{
    verifyAttached();

    // Get the diff query required
    Query diffQuery = configDiffQuery( extraMinorVersions );

    ScopedDbConnection conn(config);

    try {

        // Open a cursor for the diff chunks
        auto_ptr<DBClientCursor> cursor = conn->query(
                                              ChunkType::ConfigNS, diffQuery, 0, 0, 0, 0, ( DEBUG_BUILD ? 2 : 1000000 ) );
        verify( cursor.get() );

        int diff = calculateConfigDiff( *cursor.get() );

        conn.done();

        return diff;
    }
    catch( DBException& e ) {
        // Should only happen on connection errors
        e.addContext( str::stream() << "could not calculate config difference for ns " << _ns << " on " << config );
        throw;
    }
}
Esempio n. 2
0
int ConfigDiffTracker<ValType, ShardType>::calculateConfigDiff(CatalogManager* catalogManager) {
    _assertAttached();

    // Get the diff query required
    Query diffQuery = configDiffQuery();

    try {
        std::vector<ChunkType> chunks;
        uassertStatusOK(catalogManager->getChunks(
                            diffQuery.getFilter(), diffQuery.getSort(), boost::none, &chunks));

        return calculateConfigDiff(chunks);
    } catch (DBException& e) {
        // Should only happen on connection errors
        e.addContext(str::stream() << "could not calculate config difference for ns " << _ns);
        throw;
    }
}