This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
tango-tfe/cache/include/tango_cache_client.h

175 lines
6.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __TANGO_CACHE_CLIENT_H__
#define __TANGO_CACHE_CLIENT_H__
#include <event2/event.h>
#include <event.h>
#include <tfe_future.h>
#include "tango_cache_pending.h"
#define USER_TAG_MAX_LEN 1518
enum CACHE_ERR_CODE
{
CACHE_OK=0,
CACHE_CACHE_MISS = -101, //缓存未命中
CACHE_TIMEOUT = -102, //缓存超时
CACHE_OUTOF_MEMORY= -103,//当前内存占用超过限制查看MAX_USED_MEMORY_SIZE_MB是否过小或者当前上传速率跟不上调用者的速率
CACHE_ERR_CURL = -104,
CACHE_ERR_WIREDLB = -105,
CACHE_ERR_SOCKPAIR= -106,
CACHE_ERR_INTERNAL= -107,
CACHE_ERR_REDIS_JSON = -108,
CACHE_ERR_REDIS_CONNECT= -109,
CACHE_ERR_REDIS_EXEC = -110,
CACHE_OUTOF_SESSION = -111,
CACHE_ERR_EVBUFFER = -112,
CACHE_UPDATE_CANCELED = -113,
};
struct cache_statistics
{
long long get_recv_num; //发起GET的次数
long long get_succ_http; //GET minio成功的次数
long long get_succ_redis;//GET redis成功的次数
long long get_miss_num; //GET未命中的次数
long long get_err_http; //GET minio失败的次数
long long get_err_redis; //GET redis失败的次数
long long put_recv_num; //发起UPLOAD的次数
long long put_succ_http; //UPLOAD minio成功的次数
long long put_succ_redis;//UPLOAD redis成功的次数
long long put_err_http; //UPLOAD minio失败的次数
long long put_err_redis; //UPLOAD redis失败的次数
long long del_recv_num; //发起DELETE的次数
long long del_succ_num; //DELETE成功的次数
long long del_error_num; //DELETE失败的次数
long long totaldrop_num; //内存满以及WiredLB出错时DROP的次数
long long memory_used; //当前UPLOAD BODY所占内存大小
long long session_http; //当前正在进行GET/PUT的HTTP会话数
long long session_redis; //当前正在进行GET/PUT的redis会话数
};
struct tango_cache_parameter;
struct tango_cache_instance;
struct tango_cache_ctx;
enum CACHE_ERR_CODE tango_cache_get_last_error(const struct tango_cache_ctx *ctx);
enum CACHE_ERR_CODE tango_cache_ctx_error(const struct tango_cache_instance *instance);
void tango_cache_get_statistics(const struct tango_cache_instance *instance, struct cache_statistics *out);
/*每个进程执行一次初始化*/
void tango_cache_global_init(void);
//每个minio集群和bucket创建一个parameter多个instance可共享一个parameter
struct tango_cache_parameter *tango_cache_parameter_new(const char* profile_path, const char* section, void *runtimelog);
/*以下所有API线程不安全*/
//每个监听线程创建一个instance
struct tango_cache_instance *tango_cache_instance_new(struct tango_cache_parameter *param, struct event_base* evbase, void *runtimelog);
/****************************************** GET接口的API ******************************************/
enum CACHE_RESULT_TYPE
{
RESULT_TYPE_HEADER=0, //最多只调用一次
RESULT_TYPE_USERTAG, //最多只调用一次
RESULT_TYPE_BODY, //可能调用多次
RESULT_TYPE_END, //全部结束,只调用一次,不附带数据
RESULT_TYPE_MISS, //缓存未命中,与其他类型互斥,只调用一次(有END之意),不附带数据
};
enum OBJECT_LOCATION
{
OBJECT_IN_UNKNOWN=0,
OBJECT_IN_MINIO,
OBJECT_IN_REDIS
};
struct tango_cache_meta_get
{
const char* url; //缓存:URL非结构化日志:文件路径名。CACHE_OBJECT_KEY_HASH_SWITCH=0时最大长度256字节=1时无限制
struct request_freshness get;
};
//promise_success的结果result
struct tango_cache_result
{
const char *data_frag; //如果type为RESULT_TYPE_HEADER每个头部后会包含一个换行(HTTP1.1格式)
size_t size;
size_t tlength; //对象的总长度,回调时都有效
enum CACHE_RESULT_TYPE type;
enum OBJECT_LOCATION location;
};
//成功时回调promise_success
//失败时回调promise_failed(仅一次)使用get_last_error获取错误码
//future不可以为NULL
int tango_cache_fetch_object(struct tango_cache_instance *instance, struct future* f, struct tango_cache_meta_get *meta, enum OBJECT_LOCATION where_to_get);
int tango_cache_head_object(struct tango_cache_instance *instance, struct future* f, struct tango_cache_meta_get *meta);
//从promise_success的result参数提取结果
struct tango_cache_result *tango_cache_read_result(future_result_t *promise_result);
/****************************************** DELETE接口的API ******************************************/
int tango_cache_delete_object(struct tango_cache_instance *instance, struct future* f, const char *objkey, const char *minio_addr=NULL, const char *bucket=NULL);
/****************************************** UPLOAD接口的API ******************************************/
/* 注意: 若future不为NULL则在上传结束时会调用通知回调函数否则不调用*/
enum PUT_MEMORY_COPY_WAY
{
PUT_MEM_COPY=0, //拷贝这块内存
PUT_MEM_FREE, //不拷贝内存,发送完毕由本缓存模块释放该内存
};
enum EVBUFFER_COPY_WAY
{
EVBUFFER_MOVE=0,//evbuffer_add_buffer
EVBUFFER_COPY, //evbuffer_add_buffer_reference
};
enum CACHE_HTTP_HDR_TYPE
{
HDR_CONTENT_TYPE=0,
HDR_CONTENT_ENCODING,
HDR_CONTENT_DISPOSITION,
HDR_CONTENT_MD5,
HDR_CONTENT_NUM,
};
struct tango_cache_meta_put
{
const char* url;
const char* std_hdr[HDR_CONTENT_NUM]; //完整头部,如"Content-Type: text/html"不要包含换行NULL表示没有该头部
const char* usertag; //可以是任意内容GET时会原样返回
size_t usertag_len; //最大长度USER_TAG_MAX_LEN0表示没有该头部
struct response_freshness put;
};
/****************************************** 完整一次UPLOAD接口的API ******************************************/
//若path不为空则输出对象的存储路径
//返回值: 0-成功;<0失败下同
int tango_cache_upload_once_data(struct tango_cache_instance *instance, struct future* f,
enum PUT_MEMORY_COPY_WAY way, const char *data, size_t size,
struct tango_cache_meta_put *meta,
char *path/*OUT*/, size_t pathsize);
int tango_cache_upload_once_evbuf(struct tango_cache_instance *instance, struct future* f,
enum EVBUFFER_COPY_WAY way, struct evbuffer *evbuf,
struct tango_cache_meta_put *meta,
char *path/*OUT*/, size_t pathsize);
/****************************************** 流式UPLOAD接口的API ******************************************/
//返回值: 若为NULL则表示创建失败调用tango_cache_ctx_error查看错误码是否是CACHE_OUTOF_MEMORY(正常情况下是)
struct tango_cache_ctx *tango_cache_update_start(struct tango_cache_instance *instance, struct future* f, struct tango_cache_meta_put *meta);
//返回值: 0-成功;<0失败调用tango_cache_get_last_error查看错误码
int tango_cache_update_frag_data(struct tango_cache_ctx *ctx, const char *data, size_t size);
int tango_cache_update_frag_evbuf(struct tango_cache_ctx *ctx, enum EVBUFFER_COPY_WAY way, struct evbuffer *evbuf);
//注意: 返回失败时不再调用promise回调函数path不为NULL时返回存储路径
int tango_cache_update_end(struct tango_cache_ctx *ctx, char *path/*OUT*/, size_t pathsize);
//调用cancel后不会产生结果回调认作传输失败
void tango_cache_update_cancel(struct tango_cache_ctx *ctx);
#endif