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
2018-10-15 16:53:04 +08:00

151 lines
5.2 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, //缓存未命中
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_LEN0表示没有该头部
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