diff options
author | Nikolaus Rath <Nikolaus@rath.org> | 2016-02-16 10:47:06 -0800 |
---|---|---|
committer | Nikolaus Rath <Nikolaus@rath.org> | 2016-02-16 10:47:06 -0800 |
commit | 451f2075f2b46de34235ba585bc923db2cb37eb5 (patch) | |
tree | 4f9109004efcf99cdd792e51eaf5d24ffb7d6a9b /cache.c | |
parent | e812e29d39f0e7aaf9ead9a19a9a4f288300a7e2 (diff) | |
parent | 391f6767050cce2d34e7d556566c0abd02510854 (diff) | |
download | sshfs-451f2075f2b46de34235ba585bc923db2cb37eb5.tar sshfs-451f2075f2b46de34235ba585bc923db2cb37eb5.tar.gz sshfs-451f2075f2b46de34235ba585bc923db2cb37eb5.tar.bz2 sshfs-451f2075f2b46de34235ba585bc923db2cb37eb5.zip |
Merge pull request #6 from jmmv/cache-options
Make cache parameters configurable
Diffstat (limited to 'cache.c')
-rw-r--r-- | cache.c | 55 |
1 files changed, 33 insertions, 22 deletions
@@ -14,16 +14,19 @@ #include <glib.h> #include <pthread.h> -#define DEFAULT_CACHE_TIMEOUT 20 -#define MAX_CACHE_SIZE 10000 -#define MIN_CACHE_CLEAN_INTERVAL 5 -#define CACHE_CLEAN_INTERVAL 60 +#define DEFAULT_CACHE_TIMEOUT_SECS 20 +#define DEFAULT_MAX_CACHE_SIZE 10000 +#define DEFAULT_CACHE_CLEAN_INTERVAL_SECS 60 +#define DEFAULT_MIN_CACHE_CLEAN_INTERVAL_SECS 5 struct cache { int on; - unsigned stat_timeout; - unsigned dir_timeout; - unsigned link_timeout; + unsigned int stat_timeout_secs; + unsigned int dir_timeout_secs; + unsigned int link_timeout_secs; + unsigned int max_size; + unsigned int clean_interval_secs; + unsigned int min_clean_interval_secs; struct fuse_cache_operations *next_oper; GHashTable *table; pthread_mutex_t lock; @@ -70,9 +73,9 @@ static int cache_clean_entry(void *key_, struct node *node, time_t *now) static void cache_clean(void) { 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)) { + if (now > cache.last_cleaned + cache.min_clean_interval_secs && + (g_hash_table_size(cache.table) > cache.max_size || + now > cache.last_cleaned + cache.clean_interval_secs)) { g_hash_table_foreach_remove(cache.table, (GHRFunc) cache_clean_entry, &now); cache.last_cleaned = now; @@ -172,7 +175,7 @@ void cache_add_attr(const char *path, const struct stat *stbuf, uint64_t wrctr) if (wrctr == cache.write_ctr) { node = cache_get(path); node->stat = *stbuf; - node->stat_valid = time(NULL) + cache.stat_timeout; + node->stat_valid = time(NULL) + cache.stat_timeout_secs; if (node->stat_valid > node->valid) node->valid = node->stat_valid; cache_clean(); @@ -188,7 +191,7 @@ static void cache_add_dir(const char *path, char **dir) node = cache_get(path); g_strfreev(node->dir); node->dir = dir; - node->dir_valid = time(NULL) + cache.dir_timeout; + node->dir_valid = time(NULL) + cache.dir_timeout_secs; if (node->dir_valid > node->valid) node->valid = node->dir_valid; cache_clean(); @@ -210,7 +213,7 @@ static void cache_add_link(const char *path, const char *link, size_t size) node = cache_get(path); g_free(node->link); node->link = g_strndup(link, my_strnlen(link, size-1)); - node->link_valid = time(NULL) + cache.link_timeout; + node->link_valid = time(NULL) + cache.link_timeout_secs; if (node->link_valid > node->valid) node->valid = node->link_valid; cache_clean(); @@ -570,20 +573,28 @@ struct fuse_operations *cache_init(struct fuse_cache_operations *oper) static const struct fuse_opt cache_opts[] = { { "cache=yes", offsetof(struct cache, on), 1 }, { "cache=no", offsetof(struct cache, on), 0 }, - { "cache_timeout=%u", offsetof(struct cache, stat_timeout), 0 }, - { "cache_timeout=%u", offsetof(struct cache, dir_timeout), 0 }, - { "cache_timeout=%u", offsetof(struct cache, link_timeout), 0 }, - { "cache_stat_timeout=%u", offsetof(struct cache, stat_timeout), 0 }, - { "cache_dir_timeout=%u", offsetof(struct cache, dir_timeout), 0 }, - { "cache_link_timeout=%u", offsetof(struct cache, link_timeout), 0 }, + { "cache_timeout=%u", offsetof(struct cache, stat_timeout_secs), 0 }, + { "cache_timeout=%u", offsetof(struct cache, dir_timeout_secs), 0 }, + { "cache_timeout=%u", offsetof(struct cache, link_timeout_secs), 0 }, + { "cache_stat_timeout=%u", offsetof(struct cache, stat_timeout_secs), 0 }, + { "cache_dir_timeout=%u", offsetof(struct cache, dir_timeout_secs), 0 }, + { "cache_link_timeout=%u", offsetof(struct cache, link_timeout_secs), 0 }, + { "cache_max_size=%u", offsetof(struct cache, max_size), 0 }, + { "cache_clean_interval=%u", offsetof(struct cache, + clean_interval_secs), 0 }, + { "cache_min_clean_interval=%u", offsetof(struct cache, + min_clean_interval_secs), 0 }, FUSE_OPT_END }; int cache_parse_options(struct fuse_args *args) { - cache.stat_timeout = DEFAULT_CACHE_TIMEOUT; - cache.dir_timeout = DEFAULT_CACHE_TIMEOUT; - cache.link_timeout = DEFAULT_CACHE_TIMEOUT; + cache.stat_timeout_secs = DEFAULT_CACHE_TIMEOUT_SECS; + cache.dir_timeout_secs = DEFAULT_CACHE_TIMEOUT_SECS; + cache.link_timeout_secs = DEFAULT_CACHE_TIMEOUT_SECS; + cache.max_size = DEFAULT_MAX_CACHE_SIZE; + cache.clean_interval_secs = DEFAULT_CACHE_CLEAN_INTERVAL_SECS; + cache.min_clean_interval_secs = DEFAULT_MIN_CACHE_CLEAN_INTERVAL_SECS; cache.on = 1; return fuse_opt_parse(args, &cache, cache_opts, NULL); |