From c21d6b0ab611d7446340ff7ef69eeefd0e80e3ec Mon Sep 17 00:00:00 2001 From: wbaumann Date: Sun, 10 Aug 2014 10:31:24 +0000 Subject: [PATCH] High priority for lock refresh (sr #108607) --- ChangeLog | 4 +++ src/cache.c | 65 +++++++++++++++++++++++------------------- src/kernel_interface.c | 2 ++ 3 files changed, 41 insertions(+), 30 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1c2ae01..67f108e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,10 @@ ChangeLog for davfs2 -------------------- +2014-08-10 Werner Baumann (werner.baumann@onlinehome.de) + * cache.c, kernel_interface.c: + High priority for lock refresh (sr #108607). + 2014-08-09 Werner Baumann (werner.baumann@onlinehome.de) * cache.c, dav_init_cache: Increase faked free space. diff --git a/src/cache.c b/src/cache.c index 8bc54ff..92caf44 100644 --- a/src/cache.c +++ b/src/cache.c @@ -737,35 +737,33 @@ dav_tidy_cache(void) (unsigned long long int) (cache_size + 0x80000) / 0x100000); } - if (cache_size > max_cache_size) - resize_cache(); - - if (minimize_mem && next_minimize && time(NULL) > next_minimize) { - if (debug) - syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG), "minimize_tree"); - next_minimize = 0; - minimize_tree(root); - if (debug) - syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG), - "minimize_tree: %llu nodes remaining", fs_stat->n_nodes); - } - static dav_node_list_item *item = NULL; dav_node_list_item *next_item = changed; - while (next_item && next_item != item) + dav_node *node = NULL; + int found = 0; + while (next_item) { + node = next_item->node; + if (is_locked(node) && node->lock_expire < time(NULL) + lock_refresh) + dav_lock_refresh(node->path, &node->lock_expire); + if (next_item == item) + found = 1; next_item = next_item->next; - if (!next_item) { - item = changed; - if (!item) - return 0; } - next_item = item->next; - dav_node *node = item->node; + if (!found) + item = changed; - if ((is_dirty(node) || is_created(node)) && !is_open_write(node) - && !is_backup(node) && item->save_at - && item-> save_at <= time(NULL)) { + time_t save_at = 0; + if (item) { + node = item->node; + save_at = item->save_at; + item = item->next; + } else { + node = NULL; + } + + if (node && (is_dirty(node) || is_created(node)) && !is_open_write(node) + && !is_backup(node) && save_at && save_at <= time(NULL)) { if (debug) syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG), "tidy: %s", node->path); int ret = dav_put(node->path, node->cache_path, &node->remote_exists, @@ -790,20 +788,27 @@ dav_tidy_cache(void) remove_node(node); } } - } else if (is_locked(node) && !is_dirty(node) && !is_created(node) + } else if (node && is_locked(node) && !is_dirty(node) && !is_created(node) && !is_open_write(node)) { if (dav_unlock(node->path, &node->lock_expire) == 0) remove_from_changed(node); - } else if (is_locked(node) - && node->lock_expire < (time(NULL) + lock_refresh)) { - dav_lock_refresh(node->path, &node->lock_expire); } - item = next_item; + if (cache_size > max_cache_size) + resize_cache(); + + if (minimize_mem && next_minimize && time(NULL) > next_minimize) { + if (debug) + syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG), "minimize_tree"); + next_minimize = 0; + minimize_tree(root); + if (debug) + syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG), + "minimize_tree: %llu nodes remaining", fs_stat->n_nodes); + } + if (item) return 1; - - item = changed; return 0; } diff --git a/src/kernel_interface.c b/src/kernel_interface.c index 3962d1a..d08dee2 100644 --- a/src/kernel_interface.c +++ b/src/kernel_interface.c @@ -225,6 +225,8 @@ dav_init_kernel_interface(const char *url, const char *mpoint, reply = buf + sizeof(struct fuse_out_header); idle_time = args->delay_upload; + if (idle_time > args->lock_refresh / 2) + idle_time = args->lock_refresh / 2; char *path = xasprintf("%s/%s", DAV_DEV_DIR, FUSE_DEV_NAME);