Example usage for com.mongodb CommandResult getErrorMessage

List of usage examples for com.mongodb CommandResult getErrorMessage

Introduction

In this page you can find the example usage for com.mongodb CommandResult getErrorMessage.

Prototype

@Nullable
public String getErrorMessage() 

Source Link

Document

Gets the error message associated with a failed command.

Usage

From source file:org.slc.sli.ingestion.util.MongoCommander.java

License:Apache License

/**
 * Move chunks of a collection to different shards
 * @param collection : the collection to be split
 * @param shards : list of all shards/*  www.  j  a va  2  s.c  o  m*/
 * @param dbConn
 * @return Error description, or null if no errors
 */
private static String moveChunks(String collection, List<String> shards, DB dbConn) {
    int numShards = shards.size();

    if (numShards == 0) {
        return null;
    }

    //
    // Fraction of 256 that each block will occupy
    //
    int charOffset = 256 / numShards;

    //
    // Keep list of the start point for each chunk, so we can move the chunk after creating them
    //
    List<String> moveStrings = new ArrayList<String>();
    moveStrings.add("$minkey");

    //
    // We want one chunk per shard, so we need to do numShards-1 splits
    // Calculate where to split and do it
    //
    for (int shard = 1; shard <= numShards - 1; shard++) {
        //
        // Split points based on the fraction of 256 that each chunk should occupy
        //
        String splitString = Integer.toHexString(charOffset * shard);
        moveStrings.add(splitString);
        CommandResult result = dbConn.command(buildSplitCommand(collection, splitString));
        if (!result.ok()) {
            LOG.error("Error splitting chunk in {}: {}", collection, result.getErrorMessage());
            return result.getErrorMessage();
        }
    }

    //
    // Move each chunk to the correct shard
    // One of these moves will get a "that chunk is already on that shard" error
    // which is ok
    //
    for (int index = 0; index < numShards; index++) {
        DBObject moveCommand = new BasicDBObject();
        moveCommand.put("moveChunk", collection);
        moveCommand.put("find", new BasicDBObject(ID, moveStrings.get(index)));
        moveCommand.put("to", shards.get(index));

        CommandResult result = dbConn.command(moveCommand);
        if (!result.ok()) {
            if (!result.getErrorMessage().equals("that chunk is already on that shard")) {
                LOG.error("Error moving chunk in {}: {}", collection, result.getErrorMessage());
                return result.getErrorMessage();
            }
        }
    }
    return null;
}

From source file:org.slc.sli.ingestion.util.MongoCommander.java

License:Apache License

/**
 * set the state of balancer./*  w w  w . j av a  2  s .c o  m*/
 *
 * @param dbConn
 * @param state
 * @return Error description, or null if no errors
 */
private static String setBalancerState(DB dbConn, boolean state) {
    DBObject balancer = new BasicDBObject(ID, "balancer");
    DBObject updateObj = new BasicDBObject();
    String stopped = state ? "false" : "true";
    updateObj.put("$set", new BasicDBObject("stopped", stopped));
    WriteResult wresult = dbConn.getSisterDB("config").getCollection("settings").update(balancer, updateObj,
            true, false);
    if (wresult != null) {
        CommandResult result = wresult.getLastError();
        if (!result.ok()) {
            LOG.error("Error setting balancer state to {}: {}", state, result.getErrorMessage());
            return result.getErrorMessage();
        }
    }
    return null;
}

From source file:org.slc.sli.ingestion.util.MongoCommander.java

License:Apache License

/**
 * Pre-split database//from  w  w w  .  j  a va2 s. c om
 * @param shardCollections: the set of collections to be split
 * @param dbName
 * @param mongoTemplate
 * @return Error description, or null if no errors
 */
public static String preSplit(Set<String> shardCollections, String dbName, MongoTemplate mongoTemplate) {
    DB dbConn = mongoTemplate.getDb().getSisterDB("admin");

    //Don't do anything if it is non-sharded
    List<String> shards = getShards(dbConn);
    if (shards.size() == 0) {
        return null;
    }

    //set balancer off
    String sresult = setBalancerState(dbConn, false);
    if (sresult != null) {
        return sresult;
    }

    // Enable sharding for this database
    DBObject enableShard = new BasicDBObject("enableSharding", dbName);
    CommandResult result = dbConn.command(enableShard);
    if (!result.ok()) {
        LOG.error("Error enabling sharding on {}: {}", dbConn, result.getErrorMessage());
        return result.getErrorMessage();
    }

    for (String coll : shardCollections) {
        String collection = dbName + "." + coll;

        // Enable sharding for this collection, sharding on _id
        DBObject shardColl = new BasicDBObject();
        shardColl.put("shardCollection", collection);
        shardColl.put("key", new BasicDBObject(ID, 1));
        result = dbConn.command(shardColl);
        if (!result.ok()) {
            LOG.error("Error enabling shard'ing on {}: {}", collection, result.getErrorMessage());
            return result.getErrorMessage();
        }

        sresult = moveChunks(collection, shards, dbConn);
        if (sresult != null) {
            return sresult;
        }
    }
    return preSplitBinCollections(dbName, mongoTemplate);
}

From source file:org.slc.sli.ingestion.util.MongoCommander.java

License:Apache License

private static String preSplitBinCollections(String dbName, MongoTemplate mongoTemplate) {
    DB dbConn = mongoTemplate.getDb().getSisterDB("admin");
    List<String> shards = getShards(dbConn);
    if (shards != null && shards.size() > 0) {
        int numShards = shards.size();
        List<String> collections = Arrays.asList("recordHash", "deltas");
        for (String collectionName : collections) {
            LOG.info("Shard count = {}. Setting up sharding config for {}!", numShards, collectionName);
            String collection = dbName + "." + collectionName;
            DBObject shardColl = new BasicDBObject();
            shardColl.put("shardCollection", collection);
            shardColl.put("key", new BasicDBObject(ID, 1));
            CommandResult result = dbConn.command(shardColl);
            if (!result.ok()) {
                LOG.error("Error enabling shard'ing on recordHash: {}", result.getErrorMessage());
                return result.getErrorMessage();
            }/*from   w ww.  j  av  a 2 s  .  c om*/
            int charOffset = 256 / numShards;
            List<byte[]> shardPoints = new ArrayList<byte[]>();
            shardPoints.add(null);
            for (int shard = 1; shard < numShards; shard++) {
                String splitString = Integer.toHexString(charOffset * shard);
                if (splitString.length() < 2) {
                    splitString = "0" + splitString;
                }

                splitString = splitString + STR_0X38;
                byte[] splitPoint = RecordHash.hex2Binary(splitString);
                shardPoints.add(splitPoint);
                LOG.info("Adding recordHash splitPoint [" + RecordHash.binary2Hex(splitPoint) + "]");

                DBObject splitCmd = new BasicDBObject();
                splitCmd.put("split", collection);
                splitCmd.put("middle", new BasicDBObject(ID, splitPoint));
                result = dbConn.command(splitCmd);
                if (!result.ok()) {
                    LOG.error("Error splitting chunk in recordHash: {}", result.getErrorMessage());
                    return result.getErrorMessage();
                }
            }
            for (int index = 0; index < numShards; index++) {
                DBObject moveCommand = new BasicDBObject();
                moveCommand.put("moveChunk", collection);
                moveCommand.put("find", new BasicDBObject(ID, index == 0 ? "$minkey" : shardPoints.get(index)));
                moveCommand.put("to", shards.get(index));
                result = dbConn.command(moveCommand);
                if (!result.ok()) {
                    if (!result.getErrorMessage().equals("that chunk is already on that shard")) {
                        LOG.error("Error moving chunk in recordHash: {}", result.getErrorMessage());
                        return result.getErrorMessage();
                    }
                }
            }
        }
    } else {
        LOG.info("No shards or shard count < 0. Not setting sharding config for recordHash!");
    }
    return null;
}

From source file:org.springframework.data.document.mongodb.MongoTemplate.java

License:Apache License

public CommandResult executeCommand(final DBObject command) {

    CommandResult result = execute(new DbCallback<CommandResult>() {
        public CommandResult doInDB(DB db) throws MongoException, DataAccessException {
            return db.command(command);
        }/* w w w  .  ja v a  2 s  .c om*/
    });

    String error = result.getErrorMessage();
    if (error != null) {
        // TODO: allow configuration of logging level / throw
        //   throw new InvalidDataAccessApiUsageException("Command execution of " +
        //         command.toString() + " failed: " + error);
        LOGGER.warn("Command execution of " + command.toString() + " failed: " + error);
    }
    return result;
}

From source file:org.springframework.data.mongodb.core.MongoTemplate.java

License:Apache License

protected void logCommandExecutionError(final DBObject command, CommandResult result) {

    String error = result.getErrorMessage();

    if (error != null) {
        LOGGER.warn("Command execution of {} failed: {}", command.toString(), error);
    }/*from w  w w . ja  v  a  2s .c o  m*/
}