intel-cloud / cosbench

a benchmark tool for cloud object storage service
Other
573 stars 242 forks source link

[Developer]: The way to add method that you want. e.g. restore method #408

Closed kisscelia closed 2 years ago

kisscelia commented 3 years ago

IDE: Eclipse aws-java-sdk version: 1.12.x

  1. add restore in StorageAPI.java(cosbench-api/com.intel.cosbench.api.storage)
    /**
     * Restore an object from a container.
     *
     * @param container - the name of a container.
     * @param object    - the name of an object to be restored.
     * @param config    - the configuration used for this operation.
     */
    public void restoreObjectV2(String container, String object, Config config);
  1. add restore in NoneStorage.java(cosbench-api/com.intel/cosbench.api.storage)
    @Override
    public void restoreObjectV2(String container, String object, Config config) {
        if (logging)
            logger.info("performing RESTORE at /{}/{}", container, object);
    }
  1. add Restore.java in cosbench-driver(com.intel.cosbench.driver.operator) The same to Deleter.java
/**  
* @Title: Restorer.java
* @Package com.intel.cosbench.driver.operator  
* @Description: Restore class
* @author sine  
* @date 2021-7-12  
* @version V1.0  
*/

package com.intel.cosbench.driver.operator;

import java.util.Date;

import com.intel.cosbench.bench.*;
import com.intel.cosbench.config.Config;
import com.intel.cosbench.driver.util.ObjectPicker;
import com.intel.cosbench.service.AbortedException;
import com.intel.cosbench.api.storage.StorageException;
import com.intel.cosbench.api.storage.StorageInterruptedException;

/**
 * This class represents primitive RESTORE operation.
 *
 * @author sine
 *
 */
class Restorer extends AbstractOperator {

    public static final String OP_TYPE = "restore";

    private ObjectPicker objPicker = new ObjectPicker();

    public Restorer() {
        /* empty */
    }

    @Override
    protected void init(String id, int ratio, String division, Config config) {
        super.init(id, ratio, division, config);
        objPicker.init(division, config);
    }

    @Override
    public String getOpType() {
        return OP_TYPE;
    }

    @Override
    protected void operate(int idx, int all, Session session) {
        String[] path = objPicker.pickObjPath(session.getRandom(), idx, all);
        Sample sample = doRestoreV2(path[0], path[1], config, session, this);
        session.getListener().onSampleCreated(sample);
        Date now = sample.getTimestamp();
        Result result = new Result(now, getId(), getOpType(), getSampleType(), getName(), sample.isSucc());
        session.getListener().onOperationCompleted(result);
    }

    public static Sample doRestoreV2(String conName, String objName, Config config, Session session, Operator op) {

        if (Thread.interrupted())
            throw new AbortedException();

        long start = System.nanoTime();

        try {
            session.getApi().restoreObjectV2(conName, objName, config); // 2021.7.13
        } catch (StorageInterruptedException sie) {
            doLogErr(session.getLogger(), sie.getMessage(), sie);
            throw new AbortedException();
        } catch (StorageException se) {
            String msg = "Error restoring object " + conName + ": " + objName + se.getMessage();
            doLogWarn(session.getLogger(), msg);
        } catch (Exception e) {
            isUnauthorizedException(e, session);
            errorStatisticsHandle(e, session, conName + "/" + objName);

            return new Sample(new Date(), op.getId(), op.getOpType(), op.getSampleType(), op.getName(), false);
        }

        long end = System.nanoTime();

        return new Sample(new Date(), op.getId(), op.getOpType(), op.getSampleType(), op.getName(), true,
                (end - start) / 1000000, 0L, 0L);
    }

}
  1. modify Operators.java(com.intel.cosbench.driver.operator)

    if (StringUtils.equals(type, Deleter.OP_TYPE))
            return new Deleter();
        // 2021.7.12 ADD
        if (StringUtils.equals(type, Restorer.OP_TYPE))
            return new Restorer();
  2. Add restoreObject in S3Storage.java(cosbench-s3/com.intel.cosbench.api.S3Stor)

@Override
    public void restoreObjectV2(String container, String object, Config config) {
        super.restoreObjectV2(container, object, config);
        try {

            // Create and submit a request to restore an object from Glacier/Deep Archive
            // for some days.
            RestoreObjectRequest requestRestore = new RestoreObjectRequest(container, object, 1);
            restoreClient.restoreObjectV2(requestRestore);

            ObjectMetadata response = client.getObjectMetadata(container, object);

            Boolean restoreFlag = response.getOngoingRestore();
        } catch (AmazonServiceException ase) {
            logger.warn("AmazonServiceException, Status code is: " + ase.getStatusCode() + 
                    ", and below exception encountered when restore object " + object + " at bucket " + container + ": "
                    + ase.getMessage());
            ase.printStackTrace();
        } catch (SdkClientException sce) { // recreate the AmazonS3 client connection if it is broken.
            logger.warn("SdkClientException, and below exception encountered when restore object " + object + " at bucket " + container + ": "
                    + sce.getMessage());
            sce.printStackTrace();

            initRestoreClient();
        }
    }

That's all. Have fun.

Notice: If you want to send restore request, you must set withSignerOverride to AWSS3V4SignerType.