summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlishu <[email protected]>2019-08-12 14:06:30 +0800
committerlishu <[email protected]>2019-08-12 14:06:30 +0800
commit7c16243238ac90bdfdb8c2e57897ac0d45e940eb (patch)
tree71fb750d6045a6ed8cc549c22cd10885cf376d52
parentaa8c58e98beef3f68fb0fc2647db2b5efae997c4 (diff)
更新tango_cache
-rw-r--r--bin/conf/main.conf84
-rw-r--r--src/inc/cache_evbase_client.h25
-rw-r--r--src/inc/tango_cache_client.h197
-rw-r--r--src/inc/tfe_future.h2
-rw-r--r--src/lib/libcjson.abin42168 -> 42168 bytes
-rw-r--r--src/lib/libcrypto.abin5788576 -> 5788472 bytes
-rw-r--r--src/lib/libcurl.abin834506 -> 827674 bytes
-rw-r--r--src/lib/libevent.abin649304 -> 649304 bytes
-rw-r--r--src/lib/libssl.abin1019068 -> 1019068 bytes
-rw-r--r--src/lib/libtango_cache_client.abin353972 -> 797162 bytes
-rw-r--r--src/lib/libxml2.abin2736692 -> 2727532 bytes
11 files changed, 182 insertions, 126 deletions
diff --git a/bin/conf/main.conf b/bin/conf/main.conf
index 94939cf..a6bb3ff 100644
--- a/bin/conf/main.conf
+++ b/bin/conf/main.conf
@@ -1,4 +1,4 @@
-[NETWORK]
+[NETWORK]
DataRecvPort=33082
SurveySendPort=22080
@@ -10,15 +10,16 @@ RecvQueueMaxnum=2000000
MediaHashThreadSafe=1
MediaHashSize=65536
MediaHashElemNum=1048576
-MediaHashExpireTime=300
+MediaHashExpireTime=240
[MAAT]
TableInfo=./conf/table_info.conf
FullCfgDir=/home/mesasoft/dd/ddrule/full/index/
IncCfgDir=/home/mesasoft/dd/ddrule/inc/index/
+EffectInvervalMs=1
[LOG]
-LogLevel=30
+LogLevel=10
LogPath=./log/runtime.log
#resp msg log
@@ -31,35 +32,58 @@ MediaCreateLogPath= ./log/media_create.log
MediaExpireLogPath= ./log/media_expire.log
#field_stat
-StatCycle=30
+StatCycle=2
StatFile=./log/dd_stat.log
-SysinfoCycle=30
+SysinfoCycle=2
SysinfoFile=./log/dd_sysinfo.log
[TANGO_CACHE]
-#MINIO IP地址,目前只支持一个
-MINIO_IP_LIST=192.168.10.61-64;
-MINIO_LISTEN_PORT=9000
-
-#每个域名最多开启的链接数
-MAX_CONNECTION_PER_HOST=10
-
-#bucket的名称
-CACHE_BUCKET_NAME=openbucket
-
-#缓存最大占用的内存空间大小,超出空间时上传失败
-MAX_USED_MEMORY_SIZE_MB=5120
-
-#上传时Expires头部的过期时间,单位秒,最小60(1分钟)
-CACHE_DEFAULT_TTL_SECOND=3600
-
-#是否对对象的名称进行哈希,开启哈希有助于提高上传下载的速率
-CACHE_OBJECT_KEY_HASH_SWITCH=0
-
-#WIRED LOAD BALANCER配置
-#WIREDLB_OVERRIDE=1
-#WIREDLB_TOPIC=
-#WIREDLB_GROUP=
-#WIREDLB_DATACENTER=
-
+#Addresses of minio. Format is defined by WiredLB.
+minio_ip_list=192.168.10.180;
+minio_listen_port=9000
+#For Non-Struct logs, we will use Nginx as a proxy to access each object. Set Nginx's port.
+minio_proxy_port=9100
+#Maximum number of connections opened by per host.
+#max_connection_per_host=1
+#Maximum number of requests in a pipeline.
+#max_cnnt_pipeline_num=20
+#Maximum parellel sessions(http and redis) is allowed to open.
+#max_curl_session_num=20
+#Maximum time the request is allowed to take(seconds).
+#max_curl_transfer_timeout_s=0
+
+#Bucket name in minio.
+cache_bucket_name=ntcbucket
+cache_bucket_num=32
+#Maximum size of memory used by tango_cache_client. Upload will fail if the current size of memory used exceeds this value.
+max_used_memory_size_mb=5120
+cache_upload_losf_size=4194304
+#When use LOSF mode, objects will be uploaded even if its total size doesnt reach $cache_upload_losf_size after timeouts.
+#cache_upload_losf_timeout_s=10
+#Default TTL of objects, i.e. the time after which the object will expire(minumun 60s, i.e. 1 minute).
+cache_default_ttl_second=36000
+#Whether to hash the object key before cache actions. GET/PUT may be faster if you open it.
+cache_object_key_hash_switch=0
+
+#Store way: 0-MINIO; 1-LOSF, META in REDIS, object in minio; 2-META and small object in Redis, large object in minio;
+cache_store_object_way=1
+#If $cache_store_object_way is 2 and the size of a object is not bigger than this value, object will be stored in redis.
+redis_cache_object_size=512000
+#max_redis_session_num=800
+#If $cache_store_object_way is not 0, we will use redis to store meta and object.
+redis_cluster_ip_list=192.168.10.180;
+redis_cluster_port_range=9001-9004;
+#Configs of WiredLB for Minios load balancer.
+#wiredlb_override=1
+#wiredlb_topic=
+#wiredlb_datacenter=
+wiredlb_health_port=52101
+#wiredlb_group=
+
+log_fsstat_appname=TANGO_CACHE
+log_fsstat_filepath=./field_stat.log
+log_fsstat_interval=10
+log_fsstat_trig=1
+log_fsstat_dst_ip=127.0.0.1
+log_fsstat_dst_port=8125 \ No newline at end of file
diff --git a/src/inc/cache_evbase_client.h b/src/inc/cache_evbase_client.h
index 5bead2f..feab191 100644
--- a/src/inc/cache_evbase_client.h
+++ b/src/inc/cache_evbase_client.h
@@ -6,6 +6,8 @@
#include "tango_cache_client.h"
+/* API��ʹ��˵���ο�tango_cache_client.h */
+
struct cache_evbase_instance
{
struct tango_cache_instance *instance;
@@ -16,14 +18,17 @@ struct cache_evbase_instance
struct cache_evbase_ctx
{
+ size_t object_size; //tango_ctx�������Ա�޷����ع�����ֱ�ӻ�ȡ�Ļ����ڶ�дһ��������
struct tango_cache_ctx *ctx;
+ struct tango_losf_meta *losf_meta; //LOSFһ�����ϴ�ʱû��ctx
struct cache_evbase_instance *instance_asyn;
};
-/*����API�̰߳�ȫ��API��ʹ��˵���ο�tango_cache_client.h*/
+/*����API�̰߳�ȫ������ͬһ��cache_evbase_ctx�����Կ��̷߳��ʡ�*/
enum CACHE_ERR_CODE cache_evbase_get_last_error(const struct cache_evbase_ctx *ctx_asyn);
enum CACHE_ERR_CODE cache_evbase_ctx_error(const struct cache_evbase_instance *instance);
+long long cache_evbase_maximum_session(const struct cache_evbase_instance *instance);
void cache_evbase_get_statistics(const struct cache_evbase_instance *instance, struct cache_statistics *out);
void cache_evbase_global_init(void);
@@ -34,16 +39,16 @@ struct tango_cache_parameter *cache_evbase_parameter_new(const char* profile_pat
/*����ʵ�����̰߳�ȫ���ڲ�������һ���߳�*/
struct cache_evbase_instance *cache_evbase_instance_new(struct tango_cache_parameter *param, void *runtimelog);
-
-//GET�ӿڣ��ɹ�����0��ʧ�ܷ���-1��future�ص���������������߳���ִ�У���ͬ
-int cache_evbase_fetch_object(struct cache_evbase_instance *instance, struct future* f, struct tango_cache_meta_get *meta);
+/******************************************* GET�ӿ� ****************************************/
+//�ɹ�����0��ʧ�ܷ���-1��future�ص���������������߳���ִ�У���ͬ
+int cache_evbase_fetch_object(struct cache_evbase_instance *instance, struct future* f, struct tango_cache_meta_get *meta, enum OBJECT_LOCATION where_to_get);
int cache_evbase_head_object(struct cache_evbase_instance *instance, struct future* f, struct tango_cache_meta_get *meta);
struct tango_cache_result *cache_evbase_read_result(void *promise_result);
-//DELETE�ӿ�
-int cache_evbase_delete_object(struct cache_evbase_instance *instance, struct future* f, const char *objkey);
+/****************************************** DELETE�ӿ� **************************************/
+int cache_evbase_delete_object(struct cache_evbase_instance *instance, struct future* f, const char *objkey, const char *minio_addr=NULL, const char *bucket=NULL);
-//һ�����ϴ��ӿ�
+/***************************************** һ�����ϴ��ӿ� **********************************/
int cache_evbase_upload_once_data(struct cache_evbase_instance *instance, struct future* f,
enum PUT_MEMORY_COPY_WAY way, const char *data, size_t size,
struct tango_cache_meta_put *meta,
@@ -53,14 +58,12 @@ int cache_evbase_upload_once_evbuf(struct cache_evbase_instance *instance, struc
struct tango_cache_meta_put *meta,
char *path/*OUT*/, size_t pathsize);
-//��ʽ�ϴ��ӿ�
+/****************************************** ��ʽ�ϴ��ӿ� ***********************************/
struct cache_evbase_ctx *cache_evbase_update_start(struct cache_evbase_instance *instance, struct future* f, struct tango_cache_meta_put *meta);
int cache_evbase_update_frag_data(struct cache_evbase_ctx *ctx_asyn, enum PUT_MEMORY_COPY_WAY way, const char *data, size_t size);
int cache_evbase_update_frag_evbuf(struct cache_evbase_ctx *ctx_asyn, struct evbuffer *evbuf);
-void cache_evbase_update_end(struct cache_evbase_ctx *ctx_asyn);
+int cache_evbase_update_end(struct cache_evbase_ctx *ctx_asyn, char *path/*OUT*/, size_t pathsize);
void cache_evbase_update_cancel(struct cache_evbase_ctx *ctx_asyn);
-void cache_evbase_get_object_path(const struct cache_evbase_ctx *ctx, char *path/*OUT*/, size_t pathsize);
-
#endif
diff --git a/src/inc/tango_cache_client.h b/src/inc/tango_cache_client.h
index c551e8f..188dee8 100644
--- a/src/inc/tango_cache_client.h
+++ b/src/inc/tango_cache_client.h
@@ -12,47 +12,68 @@
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,
- CACHE_ERR_REDIS_JSON,
- CACHE_ERR_REDIS_CONNECT,
- CACHE_OUTOF_SESSION,
- CACHE_UPDATE_CANCELED,
-};
-
-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
+ 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,
+ CACHE_ERR_INSTANCE_ID = -114,
+ CACHE_ERR_BAD_REQUEST = -115,
};
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�Ự��
+ 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 put_cancel; //UPLOAD Cancel����
+ long long put_losf_num; //LOSF�ϲ���ĸ���
+ 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);
+long long tango_cache_maximum_session(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, //���ֻ����һ��
@@ -62,77 +83,84 @@ enum CACHE_RESULT_TYPE
RESULT_TYPE_MISS, //����δ���У����������ͻ��⣬ֻ����һ��(��END֮��)������������
};
-//promise_success�Ľ��result
-struct tango_cache_result
+enum OBJECT_LOCATION
{
- const char *data_frag; //���typeΪRESULT_TYPE_HEADER��ÿ��ͷ��������һ������(HTTP1.1��ʽ)
- size_t size;
- size_t tlength; //������ܳ��ȣ��ص�ʱ����Ч
- enum CACHE_RESULT_TYPE type;
+ OBJECT_IN_UNKNOWN=0,
+ OBJECT_IN_MINIO,
+ OBJECT_IN_REDIS
};
-enum CACHE_HTTP_HDR_TYPE
+//Range֧��3��: bytes=x-y; bytes=x-; bytes=-y
+struct tango_cache_get_range
{
- HDR_CONTENT_TYPE=0,
- HDR_CONTENT_ENCODING,
- HDR_CONTENT_DISPOSITION,
- HDR_CONTENT_MD5,
-
- HDR_CONTENT_NUM,
+ int64_t start_offset; // -1��ʾ������
+ int64_t end_offset; // -1��ʾ������
};
struct tango_cache_meta_get
{
const char* url; //����:URL���ǽṹ����־:�ļ�·������CACHE_OBJECT_KEY_HASH_SWITCH=0ʱ��󳤶�256�ֽڣ�=1ʱ������
struct request_freshness get;
+ struct tango_cache_get_range *range; //����ͷRange
};
-struct tango_cache_meta_put
+//promise_success�Ľ��result
+struct tango_cache_result
{
- 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;
+ const char *data_frag; //���typeΪRESULT_TYPE_HEADER��ÿ��ͷ��������һ������(HTTP1.1��ʽ)
+ size_t size; //����Ƭ�εij���
+ size_t tlength;//��������response body���Ƶ��ܳ���(��Range����ͷʱ������Ĵ�С)���ص�ʱ����Ч
+ enum CACHE_RESULT_TYPE type;
+ enum OBJECT_LOCATION location;
};
-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*/
//�ɹ�ʱ�ص�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);
+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);
+/****************************************** 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,
+};
-/* UPLOAD�ӿڵ�API
- * ע��: UPLOAD�ӿڵ�API����future��ΪNULL�������ϴ�����ʱ�����֪ͨ�ص����������򲻵��ã�
- */
+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;
+};
-/*����һ���ϴ�API*/
+/****************************************** ����һ��UPLOAD�ӿڵ�API ******************************************/
//��path��Ϊ�գ����������Ĵ洢·��
//����ֵ: 0-�ɹ���<0ʧ�ܣ���ͬ
int tango_cache_upload_once_data(struct tango_cache_instance *instance, struct future* f,
@@ -143,18 +171,17 @@ int tango_cache_upload_once_evbuf(struct tango_cache_instance *instance, struct
enum EVBUFFER_COPY_WAY way, struct evbuffer *evbuf,
struct tango_cache_meta_put *meta,
char *path/*OUT*/, size_t pathsize);
-/*��ʽ�ϴ�API*/
+
+/****************************************** ��ʽ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);
-void tango_cache_update_end(struct tango_cache_ctx *ctx);
+//ע��: ����ʧ��ʱ���ٵ���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);
-//��ȡ����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
diff --git a/src/inc/tfe_future.h b/src/inc/tfe_future.h
index c428f08..fc2311d 100644
--- a/src/inc/tfe_future.h
+++ b/src/inc/tfe_future.h
@@ -21,6 +21,8 @@ struct promise * future_to_promise(struct future * f);
void future_destroy(struct future * f);
void promise_failed(struct promise * p, enum e_future_error error, const char * what);
void promise_success(struct promise * p, void * result);
+void promise_finish(struct promise * p);
+void promise_allow_many_successes(struct promise *p);
void promise_set_ctx(struct promise * p, void * ctx, promise_ctx_destroy_cb * cb);
void * promise_get_ctx(struct promise * p);
void * promise_dettach_ctx(struct promise * p);
diff --git a/src/lib/libcjson.a b/src/lib/libcjson.a
index cb5fed5..8a069a6 100644
--- a/src/lib/libcjson.a
+++ b/src/lib/libcjson.a
Binary files differ
diff --git a/src/lib/libcrypto.a b/src/lib/libcrypto.a
index 7c1224f..cbb87c0 100644
--- a/src/lib/libcrypto.a
+++ b/src/lib/libcrypto.a
Binary files differ
diff --git a/src/lib/libcurl.a b/src/lib/libcurl.a
index d938a26..14f09b4 100644
--- a/src/lib/libcurl.a
+++ b/src/lib/libcurl.a
Binary files differ
diff --git a/src/lib/libevent.a b/src/lib/libevent.a
index 2881fa9..446113b 100644
--- a/src/lib/libevent.a
+++ b/src/lib/libevent.a
Binary files differ
diff --git a/src/lib/libssl.a b/src/lib/libssl.a
index bab5589..af344b2 100644
--- a/src/lib/libssl.a
+++ b/src/lib/libssl.a
Binary files differ
diff --git a/src/lib/libtango_cache_client.a b/src/lib/libtango_cache_client.a
index c103ee6..8cb78e4 100644
--- a/src/lib/libtango_cache_client.a
+++ b/src/lib/libtango_cache_client.a
Binary files differ
diff --git a/src/lib/libxml2.a b/src/lib/libxml2.a
index d803f5f..208e299 100644
--- a/src/lib/libxml2.a
+++ b/src/lib/libxml2.a
Binary files differ