151 lines
5.2 KiB
C
151 lines
5.2 KiB
C
#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, //缓存未命中
|
||
CACHE_TIMEOUT, //缓存超时
|
||
CACHE_OUTOF_MEMORY,//当前内存占用超过限制,查看MAX_USED_MEMORY_SIZE_MB是否过小或者当前上传速率跟不上调用者的速率
|
||
CACHE_ERR_CURL,
|
||
CACHE_ERR_WIREDLB,
|
||
CACHE_ERR_SOCKPAIR,
|
||
CACHE_ERR_INTERNAL,
|
||
};
|
||
|
||
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
|
||
};
|
||
|
||
struct cache_statistics
|
||
{
|
||
long long get_recv_num; //发起GET的次数
|
||
long long get_succ_num; //GET成功的次数
|
||
long long get_miss_num; //GET未命中的次数
|
||
long long get_error_num;//GET失败的次数
|
||
long long put_recv_num; //发起UPLOAD的次数
|
||
long long put_succ_num; //UPLOAD成功的次数
|
||
long long put_error_num;//UPLOAD失败的次数
|
||
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_num; //当前正在进行GET/PUT的HTTP会话数
|
||
};
|
||
|
||
enum CACHE_RESULT_TYPE
|
||
{
|
||
RESULT_TYPE_HEADER=0, //最多只调用一次
|
||
RESULT_TYPE_USERTAG, //最多只调用一次
|
||
RESULT_TYPE_BODY, //可能调用多次
|
||
RESULT_TYPE_END, //全部结束,只调用一次,不附带数据
|
||
RESULT_TYPE_MISS, //缓存未命中,与其他类型互斥,只调用一次(有END之意),不附带数据
|
||
};
|
||
|
||
//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 CACHE_HTTP_HDR_TYPE
|
||
{
|
||
HDR_CONTENT_TYPE=0,
|
||
HDR_CONTENT_ENCODING,
|
||
HDR_CONTENT_DISPOSITION,
|
||
HDR_CONTENT_MD5,
|
||
|
||
HDR_CONTENT_NUM,
|
||
};
|
||
|
||
struct tango_cache_meta_get
|
||
{
|
||
const char* url; //缓存:URL;非结构化日志:文件名;最大长度256字节
|
||
struct request_freshness get;
|
||
};
|
||
|
||
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_LEN,0表示没有该头部
|
||
struct response_freshness put;
|
||
};
|
||
|
||
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);
|
||
|
||
/*以下所有API线程不安全*/
|
||
//每个监听线程创建一个instance
|
||
struct tango_cache_instance *tango_cache_instance_new(struct event_base* evbase,const char* profile_path, const char* section, void *runtimelog);
|
||
|
||
|
||
/* GET接口的API*/
|
||
//成功时回调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);
|
||
//从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);
|
||
|
||
|
||
/* UPLOAD接口的API
|
||
* 注意: UPLOAD接口的API,若future不为NULL,则在上传结束时会调用通知回调函数,否则不调用;
|
||
*/
|
||
|
||
/*完整一次上传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);
|
||
/*流式上传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);
|
||
void tango_cache_update_end(struct tango_cache_ctx *ctx);
|
||
|
||
//获取对象key值;当CACHE_OBJECT_KEY_HASH_SWITCH=1开启对URL/文件名哈希时有用
|
||
void tango_cache_get_object_path(const struct tango_cache_ctx *ctx, char *path/*OUT*/, size_t pathsize);
|
||
|
||
#endif
|
||
|