There is now a fragmentation level for the table optimisation
authorMichael Vogel <icarus@dabo.de>
Sat, 12 Dec 2015 16:46:24 +0000 (17:46 +0100)
committerMichael Vogel <icarus@dabo.de>
Sat, 12 Dec 2015 16:46:24 +0000 (17:46 +0100)
include/cron.php
mod/admin.php
view/templates/admin_site.tpl

index d95d8bc601bfa7b19d7a5d89eaaa977c0c9e780a..8bf168ed50d02f9764b6788ea9b89aa1925113b3 100644 (file)
@@ -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"]));
                }
 
index 8d2a7688f8f500e2b7cbcb5905cb43dfdce6d080..9e330fd1dc0380bf127d61be8016a67cbb10c8f4 100644 (file)
@@ -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.")),
index c1e70614ce65518a5ef2bf870c5ea9a87f82c17a..b08e5f935f6982ebd94a4bb358c06861d4a73f79 100644 (file)
        {{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}}