Verified Commit d0158918 authored by Alberto Miranda's avatar Alberto Miranda ♨️
Browse files

Add task functions to libnornsctl

Add nornsctl_iotask_init()
Add NORNSCTL_IOTASK()
Add nornsctl_submit()
Add nornsctl_wait()
Add nornsctl_cancel()
Add nornsctl_error()
parent 17e33901
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
@@ -173,6 +173,35 @@ nornsctl_update_namespace(const char* nsid,
norns_error_t 
nornsctl_unregister_namespace(const char* nsid) __THROW;


/* Initialize an asynchronous I/O task */
void 
nornsctl_iotask_init(norns_iotask_t* task, 
                     norns_op_t operation,
                     norns_resource_t* src, 
                     norns_resource_t* dst) __THROW;
norns_iotask_t 
NORNSCTL_IOTASK(norns_op_t operation, 
                norns_resource_t src, ...) __THROW;


/* Submit an asynchronous I/O task */
norns_error_t 
nornsctl_submit(norns_iotask_t* task) __THROW;

/* wait for the completion of the I/O task associated to 'task' */
norns_error_t 
nornsctl_wait(norns_iotask_t* task) __THROW;

/* Try to cancel an asynchronous I/O task associated with task */
norns_error_t 
nornsctl_cancel(norns_iotask_t* task) __THROW;

/* Check the status of a submitted I/O task */
norns_error_t 
nornsctl_error(norns_iotask_t* task, 
               norns_stat_t* stats) __THROW;

/* Return a string describing the error number */
char* 
nornsctl_strerror(norns_error_t errnum) __THROW;
+85 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@
#include "defaults.h"

#define LIBNORNSCTL_LOG_PREFIX "libnornsctl"
#define MIN_WAIT_TIME ((useconds_t) 250*1e3)

static bool validate_job(nornsctl_job_t* job);
static bool validate_namespace(nornsctl_backend_t* backend);
@@ -331,6 +332,90 @@ nornsctl_job_init(nornsctl_job_t* job, const char** hosts, size_t nhosts,
    job->j_nlimits = nlimits;
}

void 
nornsctl_iotask_init(norns_iotask_t* task, 
                     norns_op_t optype,
                     norns_resource_t* src, 
                     norns_resource_t* dst) {

    if(task == NULL) {
        return;
    }

    memset(task, 0, sizeof(*task));

    if(src == NULL) {
        return;
    }

    task->t_id = 0;
    task->t_op = optype;
    task->t_src = *src;

    if(dst != NULL) {
        task->t_dst = *dst;
        return;
    }

    // dst is NULL, set r_flags so that we are aware of it later
    task->t_dst.r_flags = NORNS_NULL_RESOURCE;
}

norns_error_t
nornsctl_submit(norns_iotask_t* task) {

    if(task == NULL) {
        return NORNS_EBADARGS;
    }

    return send_submit_request(task);
}

norns_error_t
nornsctl_error(norns_iotask_t* task, 
               norns_stat_t* stats) {

    if(task == NULL || stats == NULL) {
        return NORNS_EBADARGS;
    }

    return send_status_request(task, stats);
}

/* wait for the completion of the I/O task associated to 'task' */
norns_error_t
nornsctl_wait(norns_iotask_t* task) {

    norns_error_t rv;
    norns_stat_t stats;

    if(task == NULL) {
        ERR("invalid arguments");
        return NORNS_EBADARGS;
    }

    do {
        rv = send_status_request(task, &stats);

        if(rv != NORNS_SUCCESS) {
            ERR("error waiting for request: %s", norns_strerror(rv));
            return rv;
        }

        if(stats.st_status == NORNS_EFINISHED || 
           stats.st_status == NORNS_EFINISHEDWERROR) {
            return NORNS_SUCCESS;
        }

        // wait for 250 milliseconds
        // before retrying
        usleep(MIN_WAIT_TIME);
    } while(true);

    return NORNS_SUCCESS;
}


static bool
validate_namespace(nornsctl_backend_t* backend) {