Add option minimize_mem (sr #108158)
This commit is contained in:
62
src/cache.c
62
src/cache.c
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
|
||||
|
@ -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]);
|
||||
|
@ -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 */
|
||||
|
Reference in New Issue
Block a user