* Copyright (c) 2022 Huawei Technologies Co.,Ltd.
*
* DSS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*
* http://license.coscl.org.cn/MulanPSL2
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
* -------------------------------------------------------------------------
*
* dss_vtable.h
*
*
* IDENTIFICATION
* src/common/dss_vtable.h
*
* -------------------------------------------------------------------------
*/
#ifndef __DSS_VTABLE_H__
#define __DSS_VTABLE_H__
#include "dss_defs.h"
#include "dss_ctrl_def.h"
#include "cm_error.h"
#include "dss_errno.h"
#include "dss_vtable.h"
#include "stdint.h"
#include "stdbool.h"
#include <time.h>
#define LIB_VTABLE_NAME "libbio_bdev.so"
#define LIB_VTABLE_ADAPTER_NAME "libvTable.so"
#define VT_FULL_OPERATE 1
#define VT_PARTIAL_OPERATE 0
#define VT_INSERT_BL 0
#define VT_DELETE_BL 1
typedef enum {
RET_CACHE_OK = 0,
RET_CACHE_PROTECTED = 1,
RET_CACHE_ERROR = 2,
RET_CACHE_EPERM = 3,
RET_CACHE_BUSY = 4,
RET_CACHE_NEED_RETRY = 5,
RET_CACHE_NOT_READY = 6,
RET_CACHE_NOT_FOUND = 7,
RET_CACHE_CONFLICT = 8,
RET_CACHE_MISS = 9,
RET_CACHE_NO_SPACE = 10,
RET_CACHE_UNAVAILABLE = 11,
RET_CACHE_EXCEED_QUOTA = 12,
RET_CACHE_PT_FAULT = 13,
RET_CACHE_READ_EXCEED = 14,
RET_CACHE_EXISTS = 15,
RET_CACHE_BUTT
} CResult;
typedef enum {
LOCAL_AFFINITY = 1,
GLOBAL_BALANCE = 2,
AFFINITY_BUTT
} AffinityStrategy;
typedef enum {
WRITE_BACK = 1,
WRITE_THROUGH = 2,
STRATEGY_BUTT
} WriteStrategy;
typedef enum {
CONVERGENCE,
SEPARATES
} WorkerMode;
#define MAX_KEY_SIZE (256)
#define LOCATION_SIZE (2)
typedef void (*BioLoadCallback)(void *context, int32_t result);
typedef struct {
char key[MAX_KEY_SIZE];
uint32_t size;
time_t time;
} ObjStat;
typedef struct {
uint64_t location[LOCATION_SIZE];
} ObjLocation;
typedef struct {
uint64_t tenantId;
AffinityStrategy affinity;
WriteStrategy strategy;
} CacheDescriptor;
#define CACHE_SPACE_ADDRESS_SIZE (2)
#define CACHE_SPACE_DEC_SIZE (64)
typedef struct {
uint64_t address;
uint32_t size;
} CacheAddress;
typedef struct {
uint8_t allocLoc;
uint16_t addressNum;
uint16_t descriptorSize;
ObjLocation loc;
CacheAddress address[CACHE_SPACE_ADDRESS_SIZE];
char descriptorInfo[CACHE_SPACE_DEC_SIZE];
} CacheSpaceInfo;
typedef enum {
STDOUT_TYPE,
FILE_TYPE,
STDERR_TYPE
} LogType;
typedef struct {
LogType logType;
char logFilePath[PATH_MAX];
uint8_t enable;
char certificationPath[PATH_MAX];
char caCerPath[PATH_MAX];
char caCrlPath[PATH_MAX];
char privateKeyPath[PATH_MAX];
char privateKeyPassword[PATH_MAX];
char hseKfsMasterPath[PATH_MAX];
char hseKfsStandbyPath[PATH_MAX];
bool isDriverServer;
} ClientOptionsConfig;
typedef struct {
char** ipList;
uint64_t* offsetList;
uint64_t* lengthList;
size_t size;
size_t capacity;
} PtInfoList;
void Exit();
void BdevExit();
CResult Initialize(WorkerMode mode, ClientOptionsConfig *optConf);
CResult CreateVolume(uint16_t volumeType, uint64_t cap, uint32_t alignedSize, uint64_t* volumeId);
CResult DestroyVolume(uint64_t volumeId);
CResult Write(uint64_t volumeId, uint64_t offset, uint32_t length, char *value);
CResult List(uint64_t volumeId, bool* exist, uint64_t* cap, uint32_t* alignedSize, uint16_t* type);
CResult Read(uint64_t volumeId, uint64_t offset, uint32_t length, char *value);
CResult Append(uint64_t volumeId, uint64_t offset, uint32_t length, char *value);
CResult Fence(const char *ip, uint64_t volumeId, uint16_t operateType, bool fullOperate);
CResult FenceQuery(const char *ip, uint64_t volumeId, uint16_t *isFenced);
int VtableAdapterAppend(uint64_t lunId, uint64_t offset, uint64_t length, const char* value);
int VtableAdapterWrite(uint64_t lunId, uint64_t offset, uint64_t length, char* value);
int VtableAdapterInit();
typedef struct st_vtable_func {
bool symbolnited;
bool isInitialize;
void* vtableHandle;
void* vtableAdapterHandle;
void (*BdevExit)(void);
CResult (*Initialize)(WorkerMode mode, ClientOptionsConfig *optConf);
CResult (*CreateVolume)(uint16_t volumeType, uint64_t cap, uint32_t alignedSize, uint64_t* volumeId);
CResult (*DestroyVolume)(uint64_t volumeId);
CResult (*Write)(uint64_t volumeId, uint64_t offset, uint32_t length, char *value);
CResult (*Read)(uint64_t volumeId, uint64_t offset, uint32_t length, char *value);
CResult (*List)(uint64_t volumeId, bool* exist, uint64_t* cap, uint32_t* alignedSize, uint16_t* type);
void (*PtInfoListDestroy)(PtInfoList *ptInfoList);
PtInfoList* (*PtInfoListCreate)(size_t init_capacity);
CResult (*GetMasterNodeIPByOffset)(uint64_t volumeId, uint64_t offset, uint64_t length, PtInfoList *ptInfoList);
CResult (*VtableAdapterInit)();
CResult (*VtableAdapterAppend)(uint64_t volumeId, uint64_t offset, uint32_t length, char *value);
CResult (*VtableAdapterWrite)(uint64_t volumeId, uint64_t offset, uint64_t length, char *value);
CResult (*Fence)(const char *ip, uint64_t volumeId, uint16_t operateType, bool fullOperate);
CResult (*FenceQuery)(const char *ip, uint64_t volumeId, uint16_t *isFenced);
} vtable_func_t;
#ifdef __cplusplus
extern "C" {
#endif
extern vtable_func_t g_vtable_func;
status_t vtable_func_init();
void VtableExit(void);
status_t VtableInitAdapter();
status_t VtableInitialize(WorkerMode mode, ClientOptionsConfig *optConf);
status_t VtableCreateVolume(uint16_t volumeType, uint64_t cap, uint32_t alignedSize, uint64_t* volumeId);
status_t VtableDestroyVolume(uint64_t volumeId);
status_t VtableWrite(uint64_t volumeId, uint64_t offset, uint32_t length, char *value);
status_t VtableRead(uint64_t volumeId, uint64_t offset, uint32_t length, char *value);
status_t VtableList(uint64_t volumeId, bool* exist, uint64_t* cap, uint32_t* alignedSize, uint16_t* type);
status_t VtableGetMasterNodeIPByOffset(uint64_t volumeId, uint64_t offset, char *ip);
status_t VtableAppendAdapter(uint64_t volumeId, uint64_t offset, uint32_t length, char *value);
status_t VtableWriteAdapte(uint64_t volumeId, uint64_t offset, uint32_t length, char *value);
status_t VtableFence(const char *ip, uint64_t volumeId, uint16_t operateType, bool fullOperate);
status_t VtableFenceQuery(const char *ip, uint64_t volumeId, uint16_t *isFenced);
status_t dss_init_vtable(void);
uint64 vtable_name_to_ptid(const char* name);
status_t dss_open_volume_vtable(const char *name, const char *code, int flags, dss_volume_t *volume);
status_t dss_open_simple_volume_vtable(const char *name, int flags, dss_simple_volume_t *volume);
void dss_close_volume_vtable(dss_volume_t *volume);
void dss_close_simple_volume_vtable(dss_simple_volume_t *simple_volume);
uint64 dss_get_volume_size_vtable(dss_volume_t *volume);
status_t dss_try_pread_volume_vtable(dss_volume_t *volume, int64 offset, char *buffer,
int32 size, int32 *read_size);
int32 dss_try_pwrite_volume_vtable(dss_volume_t *volume, int64 offset, char *buffer,
int32 size, int32 *written_size);
int32 dss_try_append_volume_vtable(dss_volume_t *volume, int64 offset, char *buffer,
int32 size, int32 *written_size);
#ifdef __cplusplus
}
#endif
#endif