diff --git a/include/cron.php b/include/cron.php index d95d8bc601..8bf168ed50 100644 --- a/include/cron.php +++ b/include/cron.php @@ -189,24 +189,39 @@ function cron_run(&$argv, &$argc){ q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%" AND `created` < NOW() - INTERVAL %d SECOND', $cachetime); } - // maximum table size in megabyte + // Maximum table size in megabyte $max_tablesize = intval(get_config('system','optimize_max_tablesize')) * 1000000; if ($max_tablesize == 0) $max_tablesize = 100 * 1000000; // Default are 100 MB + // Minimum fragmentation level in percent + $fragmentation_level = intval(get_config('system','optimize_fragmentation')) / 100; + if ($fragmentation_level == 0) + $fragmentation_level = 0.3; // Default value is 30% + // Optimize some tables that need to be optimized $r = q("SHOW TABLE STATUS"); foreach($r as $table) { - // Don't optimize tables that needn't to be optimized - if ($table["Data_free"] == 0) - continue; - // Don't optimize tables that are too large if ($table["Data_length"] > $max_tablesize) continue; + // Don't optimize empty tables + if ($table["Data_length"] == 0) + continue; + + // Calculate fragmentation + $fragmentation = $table["Data_free"] / $table["Data_length"]; + + logger("Table ".$table["Name"]." - Fragmentation level: ".round($fragmentation * 100, 2), LOGGER_DEBUG); + + // Don't optimize tables that needn't to be optimized + if ($fragmentation < $fragmentation_level) + continue; + // So optimize it + logger("Optimize Table ".$table["Name"], LOGGER_DEBUG); q("OPTIMIZE TABLE `%s`", dbesc($table["Name"])); } diff --git a/mod/admin.php b/mod/admin.php index 8d2a7688f8..9e330fd1dc 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -410,6 +410,7 @@ function admin_page_site_post(&$a){ $maxloadavg = ((x($_POST,'maxloadavg')) ? intval(trim($_POST['maxloadavg'])) : 50); $maxloadavg_frontend = ((x($_POST,'maxloadavg_frontend')) ? intval(trim($_POST['maxloadavg_frontend'])) : 50); $optimize_max_tablesize = ((x($_POST,'optimize_max_tablesize')) ? intval(trim($_POST['optimize_max_tablesize'])): 100); + $optimize_fragmentation = ((x($_POST,'optimize_fragmentation')) ? intval(trim($_POST['optimize_fragmentation'])): 30); $poco_completion = ((x($_POST,'poco_completion')) ? intval(trim($_POST['poco_completion'])) : false); $poco_requery_days = ((x($_POST,'poco_requery_days')) ? intval(trim($_POST['poco_requery_days'])) : 7); $poco_discovery = ((x($_POST,'poco_discovery')) ? intval(trim($_POST['poco_discovery'])) : 0); @@ -492,6 +493,7 @@ function admin_page_site_post(&$a){ set_config('system','maxloadavg',$maxloadavg); set_config('system','maxloadavg_frontend',$maxloadavg_frontend); set_config('system','optimize_max_tablesize',$optimize_max_tablesize); + set_config('system','optimize_fragmentation',$optimize_fragmentation); set_config('system','poco_completion',$poco_completion); set_config('system','poco_requery_days',$poco_requery_days); set_config('system','poco_discovery',$poco_discovery); @@ -775,6 +777,7 @@ function admin_page_site(&$a) { '$maxloadavg' => array('maxloadavg', t("Maximum Load Average"), ((intval(get_config('system','maxloadavg')) > 0)?get_config('system','maxloadavg'):50), t("Maximum system load before delivery and poll processes are deferred - default 50.")), '$maxloadavg_frontend' => array('maxloadavg_frontend', t("Maximum Load Average (Frontend)"), ((intval(get_config('system','maxloadavg_frontend')) > 0)?get_config('system','maxloadavg_frontend'):50), t("Maximum system load before the frontend quits service - default 50.")), '$optimize_max_tablesize'=> array('optimize_max_tablesize', t("Maximum table size for optimization"), ((intval(get_config('system','optimize_max_tablesize')) > 0)?get_config('system','optimize_max_tablesize'):100), t("Maximum table size (in MB) for the automatic optimization - default 100 MB. Enter -1 to disable it.")), + '$optimize_fragmentation'=> array('optimize_fragmentation', t("Minimum level of fragmentation"), ((intval(get_config('system','optimize_fragmentation')) > 0)?get_config('system','optimize_fragmentation'):30), t("Minimum fragmenation level to start the automatic optimization - default value is 30%.")), '$poco_completion' => array('poco_completion', t("Periodical check of global contacts"), get_config('system','poco_completion'), t("If enabled, the global contacts are checked periodically for missing or outdated data and the vitality of the contacts and servers.")), '$poco_requery_days' => array('poco_requery_days', t("Days between requery"), get_config('system','poco_requery_days'), t("Number of days after which a server is requeried for his contacts.")), diff --git a/view/templates/admin_site.tpl b/view/templates/admin_site.tpl index c1e70614ce..b08e5f935f 100644 --- a/view/templates/admin_site.tpl +++ b/view/templates/admin_site.tpl @@ -124,6 +124,7 @@ {{include file="field_input.tpl" field=$maxloadavg}} {{include file="field_input.tpl" field=$maxloadavg_frontend}} {{include file="field_input.tpl" field=$optimize_max_tablesize}} + {{include file="field_input.tpl" field=$optimize_fragmentation}} {{include file="field_input.tpl" field=$abandon_days}} {{include file="field_input.tpl" field=$lockpath}} {{include file="field_input.tpl" field=$temppath}}