option to minimize memory usage

This commit is contained in:
wbaumann
2010-07-25 15:34:34 +00:00
parent 78f56f4b3c
commit 6a51851f4d
13 changed files with 309 additions and 153 deletions

View File

@ -168,6 +168,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, int rm_dir);
static int
move_dir(dav_node *src, dav_node *dst, dav_node *dst_parent,
const char *dst_name);
@ -604,6 +614,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;
@ -648,6 +659,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) {
@ -750,6 +762,14 @@ dav_tidy_cache(void)
if (cache_size > max_cache_size)
resize_cache();
if (minimize_mem && next_minimize && time(NULL) > next_minimize) {
next_minimize = 0;
minimize_tree(root, 0);
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;
@ -1845,6 +1865,53 @@ delete_tree(dav_node *node)
}
/* Removes nodes that are currently not needed to minimize
memory usage.
Nodes are not needed if
- a file node is without cached file and its parent directory
has not been updated within file_refresh seconds
- a dir node has no childs and has not been updated within
file_refresh seconds.
rm_dir : if node is a directory only remove it if rm_ dir = 1. */
static void
minimize_tree(dav_node *node, int rm_dir)
{
if (node == backup) return;
if (is_dir(node)) {
int rm = (time(NULL) > (node->utime + file_refresh));
dav_node *child = node->childs;
while (child) {
dav_node *next = child->next;
if (rm || is_dir(child))
minimize_tree(child, rm);
child = next;
}
if (!node->childs && node != root && node != backup) {
if (rm && rm_dir) {
remove_from_tree(node);
remove_from_table(node);
delete_node(node);
*flush = 1;
} else if (node->utime
&& (!next_minimize
|| (node->utime + file_refresh) < next_minimize)) {
next_minimize = node->utime + file_refresh;
}
}
} else if (!is_cached(node) && !is_locked(node) && !is_created(node)) {
remove_from_tree(node);
remove_from_table(node);
delete_node(node);
*flush = 1;
}
}
/* Moves directory src to dst using WebDAV method MOVE. */
static int
move_dir(dav_node *src, dav_node *dst, dav_node *dst_parent,
@ -2068,6 +2135,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)
next_minimize = node->atime + file_refresh;
return node;
}
@ -2176,7 +2246,7 @@ remove_node(dav_node *node)
If there are inconsistencies between the information from the server and
the locally stored state, the local information is updated. Backups are
created if necessary.
This will only be done if the utime of dear is reached, otherwise this
This will only be done if the utime of dir is reached, otherwise this
function will do nothing.
utime and retry will be updated.
If the contents or the mtime of the dir has changed, the dir-cache-file

View File

@ -101,6 +101,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
/* HTTP */
/*======*/

View File

@ -1817,6 +1817,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;
args->debug = 0;
args->neon_debug = 0;
@ -2272,6 +2273,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

@ -95,6 +95,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 */