那谁的技术博客

感兴趣领域:高性能服务器编程,存储,算法,Linux内核
随笔 - 210, 文章 - 0, 评论 - 1183, 引用 - 0
数据加载中……

ccache0.6 版本发布

这个版本没有太多的新特性,大部分为改进原有版本的问题,版本主要的工作包括:

version 0.6 (2009.10.22, base on svn reversion 85)
1) rename ccache_create and ccache_destroy to ccache_open and ccache_close
respectly
2) when open the cache, use ini style configure file to config the cache
3) rename the API ccache_replace to ccache_set
4) all the funcions's first param is cache
5) when open the cache, init the compare function pointer, so when use the
cache API does not need to specify the compare function  
6) add install/uninstall target in Makefile
7) use Bob Jenkins hash algorithm instead of the previous one.

项目地址在: commoncache
另外,项目的wiki页面我新增了一些解释commoncache实现和简单的demo代码。

另外,感谢 helloghui提出代码中的一个BUG。






posted on 2009-10-22 20:51 那谁 阅读(4443) 评论(8)  编辑 收藏 引用 所属分类: ccache

评论

# re: ccache0.6 版本发布  回复  更多评论   

converse你好,看了一些ccache源码,感谢你的开源项目。我有几个问题(因为并没有看到方方面面,所以也不算特别肯定,抱歉):
1、ccache使用mmap映射文件到内存,除了持久存储,应该就是为了使不相关进程能访问同一cache,但存储里却用了指针(ccache_t里,prev,next等等),也就是地址,而地址是仅仅只对初始化它们(init)的进程才有意义的,因为并不能保证文件会被不同进程映射到它们相同的逻辑地址。所以我觉得项目里mmap、文件的初衷达不到,也就是只有单进程能访问cache,而且程序重启reload file不可用。我个人觉得所有需要存储的指针(地址)都应该改为偏移量(off_t);
2、项目只使用了一个rwlock,也就是锁粒度是整个cache级的,我觉得这个是不能接受的,一旦有写锁加上,整个cache都无法访问。cache应用中会有大量的读操作(多进程,多线程),也会有一定量的写操作,读操作应该尽量不被堵塞。建议读写锁粒度可以细化到hashitem级。另外我看里面除了visit其他全部都是加的写锁,包括find,具体代码我没细看,可能你有一些值需要更新,但是我觉得原则上find操作应该加读锁;
3、对unfix的支持好像是freearea通过多级fix(alignsiz)实现的?这个我没细看,没太多发言权。因为当时追踪看到了,有些奇怪,提一下。我觉得这里就是一个类似malloc包的内存管理,malloc包也会有小的块这样的概念,但和你这个好像并不是相同的用意。
2010-05-04 23:13 | ping

# re: ccache0.6 版本发布  回复  更多评论   

@ping
1.第一点我没太看明白,我的测试用例就是使用多进程去进行压力测试的,好像还没有发现问题.
2.这一点我也比较头疼,但是目前没有找到降低锁粒度的办法.find操作要加写锁,是因为根据LRU算法,每次访问过的节点,需要往链表头走一步,所以也有更新的操作.这样,经常被find的元素,就会越靠近链表头.
3.是的,这个算法类似STL中内存池的设计.
2010-05-04 23:30 | 那谁

# re: ccache0.6 版本发布  回复  更多评论   

@那谁
第一点可能我省字没说明白,我的意思是这样:
既然ccache使用了mmap和文件,那它肯定应该能支持:1、一个程序启动,往里面insert一些数据,程序关闭;程序再次启动,load上次的文件,这时它应该是能读取上次写入的那些数据的;2、不相干的进程使用ccache,指定相同的文件,那它们应该是能通信的,彼此的更新都能看到,而且也能同步访问(rwlock)。不然你的ccache只能给一个进程或父子之类的相关进程访问,这显然意义不大。我想上面两点也应该是你使用mmap和文件的初衷。
而你想要不同的进程、不相干的进程都能理解你的文件结构的话,只能使用偏移量,不能使用指针。比如你创建cache的进程(配置init=1)mmap返回的地址为A,里面的某个指针freearea指向的地方相对于它(ccache_t )的偏移量为X,然后freearea这个指针的值就为A+x,它被保存在文件里了,另一个不相干的进程(配置init=0)把它mmap到自己的进程空间,它的mmap返回值为B,而不是A,而这时你用freearea这个指针的值(A+x)去访问你的空闲区显然就出错了(应该是B+x)。所以我说在文件(以及共享内存)不能使用指针、只能使用偏移量,是这个意思。
你的test/目录下那个多进程insert的代码我看了,因为是父子进程继承mmap的关系,所以不会出错,因为这种继承关系本身就保证了mmap值的想同。
前面这些是基于对你的mmap作用、init作用的大概判断的基础上说的,希望没有理解错,以致浪费你的时间。
下面是一个会出问题的例子代码:
#define WCF "../conf/fix_cache.conf.w"
#define RCF "../conf/fix_cache.conf.r"

void ccget()
{
int i,len;
char str[9];
ccache_data_t data;
ccache_t *cache = ccache_open(RCF,NULL);
assert(cache);

for(i = 1;i <= 1000000;i++)
{
len = sprintf(str,"%08d",i);

//data.data = (void *)&str;
//data.datasize = len;
data.key = (void *)&str;
data.keysize = len;

if(ccache_find(cache,&data) != 0)
{
printf("find FAIL\n");
break;
}
else printf("%s\t%s\n",(char *)data.key,(char *)data.data);
}
}
void ccset()
{
int i,len;
char str[9];
ccache_data_t data;
ccache_t *cache = ccache_open(WCF,NULL);
assert(cache);

for(i = 1;i <= 1000000;i++)
{
len = sprintf(str,"%08d",i);

data.data = (void *)&str;
data.datasize = len;
data.key = (void *)&str;
data.keysize = len;

if(ccache_insert(cache,&data,NULL,NULL) != 0)
{
printf("insert FAIL\n");
break;
}
}
}
int main(int argc,char **argv)
{
if(!strcmp(argv[1],"set")) ccset();
else if(!strcmp(argv[1],"get")) ccget();
}

其中fix_cache.conf.w就是你的fix_cache.conf文件,fix_cache.conf.r则是把它里面的init=1改为init=0,其它不变。
我用它来模仿不相干进程,先写数据:
./cctest set
然后再打开文件读数据:
./cctest get
我测了两次,一次段错误,一次get FAIL.

如果是我对init的使用理解有误,对耽误你的时间表示歉意。
2010-05-06 00:02 | ping

# re: ccache0.6 版本发布  回复  更多评论   

@ping
你说的没错,之前这个问题一直没有发现,是因为我之前写的服务器程序都是父子进程的模式,能否给我留一个联系方式,我将在下一次修正这个BUG的时候在changelog中加入你的信息,谢谢.你可以在私人留言中给我留下联系方式.



2010-05-06 00:39 | 那谁

# re: ccache0.6 版本发布  回复  更多评论   

@那谁
呵呵,不用。之前我有看过你在CU上写的lighttpd源码分析学习lighttpd,收获很多,这次看ccache的代码也学到了一些东西,尊敬你开源和共享的精神,这次能有所帮助已经很高兴了。技术范围内的讨论大家都有收获就好,简简单单,你不用特意的感谢。
2010-05-06 09:16 | ping

# re: ccache0.6 版本发布  回复  更多评论   

有几个问题想问问博主,感谢博主有空解答。

1。是否支持重复索引数据。
2。数据被删除后空间是否真的被释放。
3。能否支持按照表的方式管理。
4。可否考虑使用文件锁的方式实现?
2010-08-19 20:28 | njmpop@sina.com.cn

# re: ccache0.6 版本发布  回复  更多评论   

converse,你好,你的程序我在mingw下编译,发现编译不过,找不到sys/mman.h这个头文件,请问我怎么解决这个问题?
2010-08-26 17:57 | messi

# re: ccache0.6 版本发布  回复  更多评论   

很久不更新版本了,封板了。
2012-05-25 16:50 | wxh

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理