Add option minimize_mem (sr #108158)

This commit is contained in:
wbaumann
2014-04-20 17:32:47 +00:00
parent 8739bc32a8
commit b71f3b65b4
10 changed files with 292 additions and 112 deletions

View File

@ -171,6 +171,13 @@ static time_t delay_upload;
GET If-Modified-Since for single files. */
static int gui_optimize;
/* Remove nodes that are currently not needed to minimize memory usage. */
static int minimize_mem;
/* When to next run minimize_tree. 0 means to not run minimize_tree.
Must be updated when a node is created. */
static time_t next_minimize;
/* Time interval to wait, before a directory is updated. Usually equal to
dir_refresh, but will be varied in case the connection timed out.*/
static time_t retry;
@ -276,6 +283,9 @@ get_upload_time(dav_node *node)
return item->save_at;
}
static void
minimize_tree(dav_node *node);
static int
move_dir(dav_node *src, dav_node *dst, dav_node *dst_parent,
const char *dst_name);
@ -602,6 +612,7 @@ dav_init_cache(const dav_args *args, const char *mpoint)
file_refresh = args->file_refresh;
delay_upload = args->delay_upload;
gui_optimize = args->gui_optimize;
minimize_mem = args->minimize_mem;
retry = dir_refresh;
min_retry = args->retry;
max_retry = args->max_retry;
@ -645,6 +656,7 @@ dav_init_cache(const dav_args *args, const char *mpoint)
backup->mode = S_IFDIR | S_IRWXU;
clean_cache();
next_minimize = 0;
int ret = update_directory(root, 0);
if (ret == EAGAIN) {
@ -740,6 +752,16 @@ dav_tidy_cache(void)
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->files);
}
static dav_node_list_item *item = NULL;
dav_node_list_item *next_item = changed;
@ -1713,6 +1735,43 @@ delete_tree(dav_node *node)
}
/* Removes file nodes that are currently not needed to minimize
memory usage. */
static void
minimize_tree(dav_node *node)
{
if (node == backup) return;
if (is_dir(node)) {
int rm = !is_open(node)
&& (time(NULL) > (node->utime + 2 * file_refresh))
&& (time(NULL) > (node->atime + 2 * file_refresh));
dav_node *child = node->childs;
while (child) {
dav_node *next = child->next;
if (rm || is_dir(child)) {
minimize_tree(child);
} else if (next_minimize == 0) {
next_minimize = time(NULL) + 2 * file_refresh;
}
child = next;
}
} else if (!is_cached(node) && !is_locked(node) && !is_created(node)) {
remove_from_tree(node);
remove_from_table(node);
delete_node(node);
} else if (next_minimize == 0) {
next_minimize = time(NULL) + file_refresh;
}
}
/* Moves directory src to dst using WebDAV method MOVE. */
static int
move_dir(dav_node *src, dav_node *dst, dav_node *dst_parent,
@ -1932,6 +1991,9 @@ new_node(dav_node *parent, mode_t mode)
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG), "new node: %p->%p",
node->parent, node);
fs_stat->files++;
if (next_minimize == 0)
next_minimize = node->atime + file_refresh;
return node;
}

View File

@ -295,6 +295,9 @@
May be overridden by system config file and user config file. */
#define DAV_GUI_OPTIMIZE 0
/* Remove nodes that are currently not needed to minimize memory usage. */
#define DAV_MINIMIZE_MEM 0
/* These Macros will be defined by the command line option -D of the
preprocessor:

View File

@ -1729,6 +1729,7 @@ new_args(void)
args->file_refresh = DAV_FILE_REFRESH;
args->delay_upload = DAV_DELAY_UPLOAD;
args->gui_optimize = DAV_GUI_OPTIMIZE;
args->minimize_mem = DAV_MINIMIZE_MEM;
return args;
}
@ -1845,6 +1846,8 @@ log_dbg_config(dav_args *args)
" delay_upload: %i", args->delay_upload);
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG),
" gui_optimize: %i", args->gui_optimize);
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG),
" minimize_mem: %i", args->minimize_mem);
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG),
" debug: %#x", args->debug);
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG),
@ -2241,6 +2244,8 @@ read_config(dav_args *args, const char * filename, int system)
args->delay_upload = arg_to_int(parmv[1], 10, parmv[0]);
} else if (strcmp(parmv[0], "gui_optimize") == 0) {
args->gui_optimize = arg_to_int(parmv[1], 10, parmv[0]);
} else if (strcmp(parmv[0], "minimize_mem") == 0) {
args->minimize_mem = arg_to_int(parmv[1], 10, parmv[0]);
} else if (strcmp(parmv[0], "debug") == 0) {
args->debug |= debug_opts(parmv[1]);
args->neon_debug |= debug_opts_neon(parmv[1]);

View File

@ -110,6 +110,7 @@ typedef struct {
time_t file_refresh; /* User config file, system config file */
int delay_upload; /* User config file, system config file */
int gui_optimize; /* User config file, system config file */
int minimize_mem; /* User config file, system config file */
/* Debugging */
int debug; /* User config file, system config file */
int neon_debug; /* User config file, system config file */