缓存信息缓存主要用在保存文件,文件夹的描述信息stat,每个信息都有有效信息。
缓存结构体信息如下:
- struct cache
-
{
-
int on;//使用cache
-
//各个不同类型的超时时间
-
unsigned stat_timeout;
-
unsigned dir_tiemout;
-
unsigned link_timeout;
-
//fuse的操作
-
struct fuse_cache_operations *next_oper;
-
//实现path /key-->node/value的hashtable映射
-
GHashTable *table;
-
pthread_mutex_t lock;
-
//上次更新时间
-
time_t last_cleaned;
-
uint6_t wctr;//统计信息
-
}
每个hashtable对应的value数据结构
- struct node {
-
struct stat stat;
-
time_t stat_valid;
-
char** dir;
-
time_t dir_valid;
-
char* link;
-
time_t link_valid;
-
time_t valid;
-
}
在sshfs中使用了缓存信息的函数为
- static int sshfs_open_common(const char*path,mode_t mode,struct fuse_file_info*fi)
-
{
-
………
-
//这里每次的请求过来的stat信息都会进行缓存,但是如果多次打开文件的话,服务器也是
-
//多次打开文件
-
cache_add_attr(path,&stbuf,wrctr);
-
……..
-
}
-
cache_add_attr(const char*path,const struct stat*stbuf,uint6_t wctr)
-
{
-
……..
-
node = cache_get(path);
-
now = time(NULL);
-
node->stat= *stbuf;
-
node->stat_valid = time(NULL)+cache.stat_timeout;
-
……
-
//每次调用就会主动调用,如果缓存空间不够,就清除过时的信息
-
//如果时间超时,或者hashtable中的大小达到,就开始删除
-
cache_clean();
-
}
-
//只要sshfs_open/添加被调用,就会自动调用cache_clean();
-
static void cache_clean(void)
-
{ //默认超时时间为20s
-
time_t now = time(NULL);
-
//直接删除,不用进行回写
-
if(now>cache.last_cleaned+MIN_CACHE_CLEAN_INTERVAL &&
-
(g_hash_table_size(cache.table)>MAX_CACHE_SIZE||now>
-
cache.last_cleaned + CACHE_CLEAN_INTERVAL))
-
{
-
//这里能在删除时,不被回写的主要原因是只是保存读取的信息,不用回写,而且
-
//采用了定时机制,命中了即使超时也不能采用,另外修改操作没有进行缓存,修改后, //还要清空缓存
-
g_hash_table_remove(cache.table, (GHRFunc)cache_clean_entry,&now);
-
cache.last_cleaned = now;
-
}
-
}
而另外使用缓存的信息时,就是系统调用函数
getdir
(readdir),而在进行文件读的时候没有进行大小的合法性判断,但是在
getdir中没有调用该目录的查看。
阅读(1729) | 评论(0) | 转发(0) |