#ifndef __TANGO_CACHE_CLIENT_IN_H__ #define __TANGO_CACHE_CLIENT_IN_H__ #include #include #include #include #include "tango_cache_client.h" #define RESPONSE_HDR_EXPIRES 1 #define RESPONSE_HDR_LAST_MOD 2 #define RESPONSE_HDR_ALL 3 enum CACHE_REQUEST_METHOD { CACHE_REQUEST_GET=0, CACHE_REQUEST_PUT, }; enum GET_OBJECT_STATE { GET_STATE_START=0, GET_STATE_DELETE, GET_STATE_END, }; enum PUT_OBJECT_STATE { PUT_STATE_START=0, PUT_STATE_WAIT_START, PUT_STATE_PART, PUT_STATE_END, PUT_STATE_CANCEL, }; struct easy_string { char* buff; size_t len; size_t size; }; struct tango_cache_instance { char minio_hostlist[4096]; char bucketname[256]; struct event_base* evbase; struct event timer_event; struct cache_statistics statistic; CURLM *multi_hd; void *runtime_log; time_t relative_ttl; //缓存的相对有效期 u_int64_t cache_limit_size; long max_cnn_host; u_int32_t block_len; //申请buffercache内存的缓存块大小,每次update块大小最好不要超过该值,否则会增加拷贝次数 u_int32_t upload_block_size; //minio分段上传块的最小长度 enum CACHE_ERR_CODE error_code; u_int32_t hash_object_key; }; struct multipart_etag_list { char *etag; u_int32_t part_number; TAILQ_ENTRY(multipart_etag_list) node; }; struct tango_cache_ctx { CURL *curl; struct curl_slist *headers; struct future* future; char error[CURL_ERROR_SIZE]; char object_key[256]; char hostport[24]; //相同ctx使用相同的IP,保证pipeline顺序性 enum CACHE_REQUEST_METHOD method; enum CACHE_ERR_CODE error_code; struct evbuffer *evbuffer; union{ enum PUT_OBJECT_STATE put_state; enum GET_OBJECT_STATE get_state; }; u_int32_t part_index; u_int32_t need_hdrs; //宏RESPONSE_HDR_ bool fail_state; bool close_state; //主动被调用关闭 long res_code; time_t max_age;//Get time_t min_fresh;//Get time_t expires; time_t last_modify; size_t upload_length; size_t upload_offset; char *uploadID; char *combine_xml; struct easy_string response; struct easy_string response_tag; TAILQ_HEAD(__etag_list_head, multipart_etag_list) cache_head; struct tango_cache_instance *instance; }; struct curl_socket_data { struct event sock_event; }; void easy_string_savedata(struct easy_string *estr, const char *data, size_t len); void easy_string_expand(struct easy_string *estr, size_t to_size); void easy_string_destroy(struct easy_string *estr); void tango_cache_ctx_destroy(struct tango_cache_ctx *ctx); struct tango_cache_ctx *tango_cache_update_prepare(struct tango_cache_instance *instance, struct future* future, struct tango_cache_meta *meta); struct tango_cache_ctx *tango_cache_fetch_prepare(struct tango_cache_instance *instance, struct future* future, struct tango_cache_meta *meta); #endif