Commit fef15518 authored by Kevin.Liu's avatar Kevin.Liu
Browse files

Merge pull request #21 from Seagate/features/media-scan-optimize

Implemented the skeleton of media scan and media optimize.
parents 698e3180 187e7195
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -236,4 +236,26 @@ KineticStatus KineticAdminClient_SetACL(KineticSession * const session,
KineticStatus KineticAdminClient_UpdateFirmware(KineticSession * const session,
    char const * const fw_path);

/**
 * @brief Executes a `Media Scan` operation to perform media scan operation to the Kinetic drive.
 *
 * @param session       The connected KineticSession to use for the operation.
 * @param operation     KineticMediaScan_Operation pointer..
 *
 * @return              Returns the resulting KineticStatus.
 */
KineticStatus KineticAdminClient_MediaScan(KineticSession * const session,
	const KineticMediaScan_Operation* operation, KineticCommand_Priority priority);

/**
 * @brief Executes a `Media Optimize` operation to perform media optimize operation to the Kinetic drive.
 *
 * @param session       The connected KineticSession to use for the operation.
 * @param operation     KineticMediaOptimize_Operation pointer..
 *
 * @return              Returns the resulting KineticStatus.
 */
KineticStatus KineticAdminClient_MediaOptimize(KineticSession * const session,
	const KineticMediaOptimize_Operation* operation, KineticCommand_Priority priority);

#endif // _KINETIC_ADMIN_CLIENT_H
+15 −0
Original line number Diff line number Diff line
@@ -473,6 +473,21 @@ struct _KineticP2P_Operation {
    KineticP2P_OperationData* operations; ///> Pointer to operations array which must remain valid until operations complete
};

typedef struct KineticMedia_Operation{
	char* start_key;
	char* end_key;
	bool start_key_inclusive;
	bool end_key_inclusive;
}KineticMediaScan_Operation, KineticMediaOptimize_Operation;

typedef enum _KineticCommand_Priority{
    PRIORITY_NORMAL,
    PRIORITY_LOWEST,
    PRIORITY_LOWER,
    PRIORITY_HIGHER,
    PRIORITY_HIGHEST
} KineticCommand_Priority;

/**
 * @brief Limit for P2P operations.
 */
+32 −0
Original line number Diff line number Diff line
@@ -288,3 +288,35 @@ KineticStatus KineticAdminClient_UpdateFirmware(KineticSession * const session,
    
    return KineticController_ExecuteOperation(operation, NULL);
}

KineticStatus KineticAdminClient_MediaScan(KineticSession * const session,
	const KineticMediaScan_Operation* mediascan_operation, KineticCommand_Priority priority) {
	KINETIC_ASSERT(session != NULL);

	KineticOperation* operation = KineticAllocator_NewOperation(session);
	if (operation == NULL) {return KINETIC_STATUS_MEMORY_ERROR;}


	KineticStatus status = KineticBuilder_BuildMediaScan(operation, mediascan_operation, priority);
    if (status != KINETIC_STATUS_SUCCESS) {
        return status;
    }

    return KineticController_ExecuteOperation(operation, NULL);
}

KineticStatus KineticAdminClient_MediaOptimize(KineticSession * const session,
	const KineticMediaOptimize_Operation* mediaoptimize_operation, KineticCommand_Priority priority) {
	KINETIC_ASSERT(session != NULL);

	KineticOperation* operation = KineticAllocator_NewOperation(session);
	if (operation == NULL) {return KINETIC_STATUS_MEMORY_ERROR;}


	KineticStatus status = KineticBuilder_BuildMediaOptimize(operation, mediaoptimize_operation, priority);
    if (status != KINETIC_STATUS_SUCCESS) {
        return status;
    }

    return KineticController_ExecuteOperation(operation, NULL);
}
+75 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@
#include "kinetic_request.h"
#include "kinetic_acl.h"
#include "kinetic_callbacks.h"
#include "kinetic_types_internal.h"

#include <stdlib.h>
#include <errno.h>
@@ -417,6 +418,80 @@ KineticStatus KineticBuilder_BuildSetACL(KineticOperation* const op,
    return KINETIC_STATUS_SUCCESS;
}

static void initRangeAndPriority(KineticOperation* const op,
		const struct KineticMedia_Operation* media_operation, KineticCommand_Priority priority)
{
    op->request->message.command.header->has_messagetype = true;
    op->request->command->body = &op->request->message.body;
    op->request->command->body->security = &op->request->message.security;
    op->request->command->body->range = &op->request->message.keyRange;

    char *data = media_operation->start_key == NULL ? "" : media_operation->start_key;
    op->request->command->body->range->has_startkey = true;
    op->request->command->body->range->startkey = (ProtobufCBinaryData) {
        .data = (uint8_t *)data,
        .len = strlen(data),
    };

    data = media_operation->end_key == NULL ? "" : media_operation->end_key;
    op->request->command->body->range->has_endkey = true;
    op->request->command->body->range->endkey = (ProtobufCBinaryData) {
        .data = (uint8_t *)data,
        .len = strlen(data),
    };

    op->request->command->body->range->startkeyinclusive = media_operation->start_key_inclusive;
    op->request->command->body->range->endkeyinclusive = media_operation->end_key_inclusive;
    op->request->command->body->range->has_startkeyinclusive = true;
    op->request->command->body->range->has_endkeyinclusive = true;

    switch(priority)
    {
    case PRIORITY_NORMAL:
    	op->request->command->header->priority = COM__SEAGATE__KINETIC__PROTO__COMMAND__PRIORITY__NORMAL;
    	break;
    case PRIORITY_LOWEST:
    	op->request->command->header->priority = COM__SEAGATE__KINETIC__PROTO__COMMAND__PRIORITY__LOWEST;
    	break;
    case PRIORITY_LOWER:
    	op->request->command->header->priority = COM__SEAGATE__KINETIC__PROTO__COMMAND__PRIORITY__LOWER;
    	break;
    case PRIORITY_HIGHER:
    	op->request->command->header->priority = COM__SEAGATE__KINETIC__PROTO__COMMAND__PRIORITY__HIGHER;
    	break;
    case PRIORITY_HIGHEST:
    	op->request->command->header->priority = COM__SEAGATE__KINETIC__PROTO__COMMAND__PRIORITY__HIGHEST;
    	break;
    default:
    	op->request->command->header->priority = COM__SEAGATE__KINETIC__PROTO__COMMAND__PRIORITY__NORMAL;
    	break;
    }
}

KineticStatus KineticBuilder_BuildMediaScan(KineticOperation* const op,
	const KineticMediaScan_Operation* mediascan_operation, KineticCommand_Priority priority)
{
    KineticOperation_ValidateOperation(op);

    op->request->message.command.header->messagetype = COM__SEAGATE__KINETIC__PROTO__COMMAND__MESSAGE_TYPE__MEDIASCAN;
    initRangeAndPriority(op, mediascan_operation, priority);
    op->timeoutSeconds = KineticOperation_TimeoutMediaScan;

    return KINETIC_STATUS_SUCCESS;
}

KineticStatus KineticBuilder_BuildMediaOptimize(KineticOperation* const op,
	const KineticMediaOptimize_Operation* mediaoptimize_operation, KineticCommand_Priority priority)
{
    KineticOperation_ValidateOperation(op);

    op->request->message.command.header->messagetype = COM__SEAGATE__KINETIC__PROTO__COMMAND__MESSAGE_TYPE__MEDIASCAN;
    initRangeAndPriority(op, mediaoptimize_operation, priority);
    op->timeoutSeconds = KineticOperation_TimeoutMediaOptimize;

    return KINETIC_STATUS_SUCCESS;
}

KineticStatus KineticBuilder_BuildUpdateFirmware(KineticOperation* const op, const char* fw_path)
{
    KineticOperation_ValidateOperation(op);
+6 −0
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@
/* Operations with non-standard timeouts. */
typedef enum {
    KineticOperation_TimeoutSetACL = 30,
	KineticOperation_TimeoutMediaScan = 30,
	KineticOperation_TimeoutMediaOptimize = 30,
    KineticOperation_TimeoutSetPin = 30,
    KineticOperation_TimeoutLockUnlock = 30,
    KineticOperation_TimeoutErase = 180,
@@ -66,6 +68,10 @@ KineticStatus KineticBuilder_BuildSetACL(KineticOperation* const op,
    struct ACL *ACLs);
KineticStatus KineticBuilder_BuildSetClusterVersion(KineticOperation* const op,
    int64_t new_cluster_version);
KineticStatus KineticBuilder_BuildMediaScan(KineticOperation* const op,
	const KineticMediaScan_Operation* mediascan_operation, KineticCommand_Priority priority);
KineticStatus KineticBuilder_BuildMediaOptimize(KineticOperation* const op,
	const KineticMediaOptimize_Operation* mediaoptimize_operation, KineticCommand_Priority priority);
KineticStatus KineticBuilder_BuildUpdateFirmware(KineticOperation* const op,
    const char* fw_path);

Loading