Search in sources :

Example 1 with ArangoException

use of com.arangodb.ArangoException in project YCSB by brianfrankcooper.

the class ArangoDBClient method insert.

/**
   * Insert a record in the database. Any field/value pairs in the specified
   * values HashMap will be written into the record with the specified record
   * key.
   * 
   * @param table
   *      The name of the table
   * @param key
   *      The record key of the record to insert.
   * @param values
   *      A HashMap of field/value pairs to insert in the record
   * @return Zero on success, a non-zero error code on error. See the
   *     {@link DB} class's description for a discussion of error codes.
   */
@Override
public Status insert(String table, String key, HashMap<String, ByteIterator> values) {
    try {
        BaseDocument toInsert = new BaseDocument(key);
        for (Map.Entry<String, ByteIterator> entry : values.entrySet()) {
            toInsert.addAttribute(entry.getKey(), byteIteratorToString(entry.getValue()));
        }
        arangoDriver.createDocument(table, toInsert, true, /*create collection if not exist*/
        waitForSync);
        return Status.OK;
    } catch (ArangoException e) {
        if (e.getErrorNumber() != ErrorNums.ERROR_ARANGO_UNIQUE_CONSTRAINT_VIOLATED) {
            logger.error("Fail to insert: {} {} with ex {}", table, key, e.toString());
        } else {
            logger.debug("Trying to create document with duplicate key: {} {}", table, key);
            return Status.BAD_REQUEST;
        }
    } catch (RuntimeException e) {
        logger.error("Exception while trying insert {} {} with ex {}", table, key, e.toString());
    }
    return Status.ERROR;
}
Also used : StringByteIterator(com.yahoo.ycsb.StringByteIterator) ByteIterator(com.yahoo.ycsb.ByteIterator) BaseDocument(com.arangodb.entity.BaseDocument) ArangoException(com.arangodb.ArangoException) HashMap(java.util.HashMap) Map(java.util.Map)

Example 2 with ArangoException

use of com.arangodb.ArangoException in project YCSB by brianfrankcooper.

the class ArangoDBClient method init.

/**
   * Initialize any state for this DB. Called once per DB instance; there is
   * one DB instance per client thread.
   * 
   * Actually, one client process will share one DB instance here.(Coincide to
   * mongoDB driver)
   */
@Override
public void init() throws DBException {
    INIT_COUNT.incrementAndGet();
    synchronized (ArangoDBClient.class) {
        if (arangoDriver != null) {
            return;
        }
        Properties props = getProperties();
        // Set the DB address
        String ip = props.getProperty("arangodb.ip", "localhost");
        String portStr = props.getProperty("arangodb.port", "8529");
        int port = Integer.parseInt(portStr);
        // If clear db before run
        String dropDBBeforeRunStr = props.getProperty("arangodb.dropDBBeforeRun", "false");
        dropDBBeforeRun = Boolean.parseBoolean(dropDBBeforeRunStr);
        // Set the sync mode
        String waitForSyncStr = props.getProperty("arangodb.waitForSync", "false");
        waitForSync = Boolean.parseBoolean(waitForSyncStr);
        // Set if transaction for update
        String transactionUpdateStr = props.getProperty("arangodb.transactionUpdate", "false");
        transactionUpdate = Boolean.parseBoolean(transactionUpdateStr);
        // Init ArangoDB connection
        try {
            ArangoConfigure arangoConfigure = new ArangoConfigure();
            arangoConfigure.setArangoHost(new ArangoHost(ip, port));
            arangoConfigure.init();
            arangoDriver = new ArangoDriver(arangoConfigure);
        } catch (Exception e) {
            logger.error("Failed to initialize ArangoDB", e);
            System.exit(-1);
        }
        // Init the database
        if (dropDBBeforeRun) {
            // Try delete first
            try {
                arangoDriver.deleteDatabase(databaseName);
            } catch (ArangoException e) {
                if (e.getErrorNumber() != ErrorNums.ERROR_ARANGO_DATABASE_NOT_FOUND) {
                    logger.error("Failed to delete database: {} with ex: {}", databaseName, e.toString());
                    System.exit(-1);
                } else {
                    logger.info("Fail to delete DB, already deleted: {}", databaseName);
                }
            }
        }
        try {
            arangoDriver.createDatabase(databaseName);
            logger.info("Database created: " + databaseName);
        } catch (ArangoException e) {
            if (e.getErrorNumber() != ErrorNums.ERROR_ARANGO_DUPLICATE_NAME) {
                logger.error("Failed to create database: {} with ex: {}", databaseName, e.toString());
                System.exit(-1);
            } else {
                logger.info("DB already exists: {}", databaseName);
            }
        }
        // Always set the default db
        arangoDriver.setDefaultDatabase(databaseName);
        logger.info("ArangoDB client connection created to {}:{}", ip, port);
        // Log the configuration
        logger.info("Arango Configuration: dropDBBeforeRun: {}; address: {}:{}; databaseName: {};" + " waitForSync: {}; transactionUpdate: {};", dropDBBeforeRun, ip, port, databaseName, waitForSync, transactionUpdate);
    }
}
Also used : ArangoDriver(com.arangodb.ArangoDriver) ArangoException(com.arangodb.ArangoException) Properties(java.util.Properties) ArangoHost(com.arangodb.ArangoHost) DBException(com.yahoo.ycsb.DBException) ArangoException(com.arangodb.ArangoException) ArangoConfigure(com.arangodb.ArangoConfigure)

Example 3 with ArangoException

use of com.arangodb.ArangoException in project YCSB by brianfrankcooper.

the class ArangoDBClient method read.

/**
   * Read a record from the database. Each field/value pair from the result
   * will be stored in a HashMap.
   * 
   * @param table
   *      The name of the table
   * @param key
   *      The record key of the record to read.
   * @param fields
   *      The list of fields to read, or null for all of them
   * @param result
   *      A HashMap of field/value pairs for the result
   * @return Zero on success, a non-zero error code on error or "not found".
   */
@SuppressWarnings("unchecked")
@Override
public Status read(String table, String key, Set<String> fields, HashMap<String, ByteIterator> result) {
    try {
        DocumentEntity<BaseDocument> targetDoc = arangoDriver.getDocument(table, key, BaseDocument.class);
        BaseDocument aDocument = targetDoc.getEntity();
        if (!this.fillMap(result, aDocument.getProperties(), fields)) {
            return Status.ERROR;
        }
        return Status.OK;
    } catch (ArangoException e) {
        if (e.getErrorNumber() != ErrorNums.ERROR_ARANGO_DOCUMENT_NOT_FOUND) {
            logger.error("Fail to read: {} {} with ex {}", table, key, e.toString());
        } else {
            logger.debug("Trying to read document not exist: {} {}", table, key);
            return Status.NOT_FOUND;
        }
    } catch (RuntimeException e) {
        logger.error("Exception while trying read {} {} with ex {}", table, key, e.toString());
    }
    return Status.ERROR;
}
Also used : BaseDocument(com.arangodb.entity.BaseDocument) ArangoException(com.arangodb.ArangoException)

Example 4 with ArangoException

use of com.arangodb.ArangoException in project YCSB by brianfrankcooper.

the class ArangoDBClient method scan.

/**
   * Perform a range scan for a set of records in the database. Each
   * field/value pair from the result will be stored in a HashMap.
   * 
   * @param table
   *      The name of the table
   * @param startkey
   *      The record key of the first record to read.
   * @param recordcount
   *      The number of records to read
   * @param fields
   *      The list of fields to read, or null for all of them
   * @param result
   *      A Vector of HashMaps, where each HashMap is a set field/value
   *      pairs for one record
   * @return Zero on success, a non-zero error code on error. See the
   *     {@link DB} class's description for a discussion of error codes.
   */
@Override
public Status scan(String table, String startkey, int recordcount, Set<String> fields, Vector<HashMap<String, ByteIterator>> result) {
    DocumentCursor<BaseDocument> cursor = null;
    try {
        String aqlQuery = String.format("FOR target IN %s FILTER target._key >= @key SORT target._key ASC LIMIT %d RETURN %s ", table, recordcount, constructReturnForAQL(fields, "target"));
        Map<String, Object> bindVars = new MapBuilder().put("key", startkey).get();
        cursor = arangoDriver.executeDocumentQuery(aqlQuery, bindVars, null, BaseDocument.class);
        Iterator<BaseDocument> iterator = cursor.entityIterator();
        while (iterator.hasNext()) {
            BaseDocument aDocument = iterator.next();
            HashMap<String, ByteIterator> aMap = new HashMap<String, ByteIterator>(aDocument.getProperties().size());
            if (!this.fillMap(aMap, aDocument.getProperties())) {
                return Status.ERROR;
            }
            result.add(aMap);
        }
        return Status.OK;
    } catch (Exception e) {
        logger.error("Exception while trying scan {} {} {} with ex {}", table, startkey, recordcount, e.toString());
    } finally {
        if (cursor != null) {
            try {
                cursor.close();
            } catch (ArangoException e) {
                logger.error("Fail to close cursor", e);
            }
        }
    }
    return Status.ERROR;
}
Also used : StringByteIterator(com.yahoo.ycsb.StringByteIterator) ByteIterator(com.yahoo.ycsb.ByteIterator) BaseDocument(com.arangodb.entity.BaseDocument) HashMap(java.util.HashMap) MapBuilder(com.arangodb.util.MapBuilder) ArangoException(com.arangodb.ArangoException) DBException(com.yahoo.ycsb.DBException) ArangoException(com.arangodb.ArangoException)

Example 5 with ArangoException

use of com.arangodb.ArangoException in project YCSB by brianfrankcooper.

the class ArangoDBClient method update.

/**
   * Update a record in the database. Any field/value pairs in the specified
   * values HashMap will be written into the record with the specified record
   * key, overwriting any existing values with the same field name.
   * 
   * @param table
   *      The name of the table
   * @param key
   *      The record key of the record to write.
   * @param values
   *      A HashMap of field/value pairs to update in the record
   * @return Zero on success, a non-zero error code on error. See this class's
   *     description for a discussion of error codes.
   */
@Override
public Status update(String table, String key, HashMap<String, ByteIterator> values) {
    try {
        if (!transactionUpdate) {
            BaseDocument updateDoc = new BaseDocument();
            for (String field : values.keySet()) {
                updateDoc.addAttribute(field, byteIteratorToString(values.get(field)));
            }
            arangoDriver.updateDocument(table, key, updateDoc);
            return Status.OK;
        } else {
            // id for documentHandle
            String transactionAction = "function (id) {" + // use internal database functions
            "var db = require('internal').db;" + // collection.update(document, data, overwrite, keepNull, waitForSync)
            String.format("db._update(id, %s, true, false, %s);}", mapToJson(values), Boolean.toString(waitForSync).toLowerCase());
            TransactionEntity transaction = arangoDriver.createTransaction(transactionAction);
            transaction.addWriteCollection(table);
            transaction.setParams(createDocumentHandle(table, key));
            arangoDriver.executeTransaction(transaction);
            return Status.OK;
        }
    } catch (ArangoException e) {
        if (e.getErrorNumber() != ErrorNums.ERROR_ARANGO_DOCUMENT_NOT_FOUND) {
            logger.error("Fail to update: {} {} with ex {}", table, key, e.toString());
        } else {
            logger.debug("Trying to update document not exist: {} {}", table, key);
            return Status.NOT_FOUND;
        }
    } catch (RuntimeException e) {
        logger.error("Exception while trying update {} {} with ex {}", table, key, e.toString());
    }
    return Status.ERROR;
}
Also used : BaseDocument(com.arangodb.entity.BaseDocument) TransactionEntity(com.arangodb.entity.TransactionEntity) ArangoException(com.arangodb.ArangoException)

Aggregations

ArangoException (com.arangodb.ArangoException)5 BaseDocument (com.arangodb.entity.BaseDocument)4 ByteIterator (com.yahoo.ycsb.ByteIterator)2 DBException (com.yahoo.ycsb.DBException)2 StringByteIterator (com.yahoo.ycsb.StringByteIterator)2 HashMap (java.util.HashMap)2 ArangoConfigure (com.arangodb.ArangoConfigure)1 ArangoDriver (com.arangodb.ArangoDriver)1 ArangoHost (com.arangodb.ArangoHost)1 TransactionEntity (com.arangodb.entity.TransactionEntity)1 MapBuilder (com.arangodb.util.MapBuilder)1 Map (java.util.Map)1 Properties (java.util.Properties)1