From: Andre Noll Date: Mon, 7 Feb 2011 16:56:36 +0000 (+0100) Subject: Merge branch 't/logfile_only_for_daemon' X-Git-Tag: v0.1.5~20 X-Git-Url: http://git.tuebingen.mpg.de/?p=dss.git;a=commitdiff_plain;h=69add8d2b5d6c8f402e9f94d47df732479535f2d;hp=-c Merge branch 't/logfile_only_for_daemon' --- 69add8d2b5d6c8f402e9f94d47df732479535f2d diff --combined dss.c index db065c6,e32e7e2..b4ad2d2 --- a/dss.c +++ b/dss.c @@@ -1,5 -1,5 +1,5 @@@ /* - * Copyright (C) 2008-2009 Andre Noll + * Copyright (C) 2008-2010 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@@ -64,106 -64,7 +64,106 @@@ enum hook_status snapshot_removal_statu DEFINE_DSS_ERRLIST; +static const char const *hook_status_description[] = {HOOK_STATUS_ARRAY}; +/* may be called with ds == NULL. */ +static int disk_space_low(struct disk_space *ds) +{ + struct disk_space ds_struct; + + if (!ds) { + int ret = get_disk_space(".", &ds_struct); + if (ret < 0) + return ret; + ds = &ds_struct; + } + if (conf.min_free_mb_arg) + if (ds->free_mb < conf.min_free_mb_arg) + return 1; + if (conf.min_free_percent_arg) + if (ds->percent_free < conf.min_free_percent_arg) + return 1; + if (conf.min_free_percent_inodes_arg) + if (ds->percent_free_inodes < conf.min_free_percent_inodes_arg) + return 1; + return 0; +} + +static void dump_dss_config(const char *msg) +{ + const char dash[] = "-----------------------------"; + int ret; + FILE *log = logfile? logfile : stderr; + struct disk_space ds; + int64_t now = get_current_time(); + + if (conf.loglevel_arg > INFO) + return; + + fprintf(log, "%s <%s config> %s\n", dash, msg, dash); + fprintf(log, "\n*** disk space ***\n\n"); + ret = get_disk_space(".", &ds); + if (ret >= 0) { + DSS_INFO_LOG("disk space low: %s\n", disk_space_low(&ds)? + "yes" : "no"); + log_disk_space(&ds); + } else + DSS_ERROR_LOG("can not get free disk space: %s\n", + dss_strerror(-ret)); + + /* we continue on errors from get_disk_space */ + + fprintf(log, "\n*** command line and config file options ***\n\n"); + cmdline_parser_dump(log, &conf); + fprintf(log, "\n*** internal state ***\n\n"); + fprintf(log, + "pid: %d\n" + "logile: %s\n" + "snapshot_currently_being_removed: %s\n" + "path_to_last_complete_snapshot: %s\n" + "reference_snapshot: %s\n" + "snapshot_creation_status: %s\n" + "snapshot_removal_status: %s\n" + , + (int) getpid(), + logfile? conf.logfile_arg : "stderr", + snapshot_currently_being_removed? + snapshot_currently_being_removed->name : "(none)", + path_to_last_complete_snapshot? + path_to_last_complete_snapshot : "(none)", + name_of_reference_snapshot? + name_of_reference_snapshot : "(none)", + hook_status_description[snapshot_creation_status], + hook_status_description[snapshot_removal_status] + ); + if (create_pid != 0) + fprintf(log, + "create_pid: %" PRId32 "\n" + "create process is %sstopped\n" + , + create_pid, + create_process_stopped? "" : "not " + ); + if (remove_pid != 0) + fprintf(log, "remove_pid: %" PRId32 "\n", remove_pid); + if (next_snapshot_time != 0) + fprintf(log, "next snapshot due in %" PRId64 " seconds\n", + next_snapshot_time - now); + if (current_snapshot_creation_time != 0) + fprintf(log, "current_snapshot_creation_time: %" + PRId64 " (%" PRId64 " seconds ago)\n", + current_snapshot_creation_time, + now - current_snapshot_creation_time + ); + if (next_removal_check.tv_sec != 0) { + fprintf(log, "next removal check: %llu (%llu seconds ago)\n", + (long long unsigned)next_removal_check.tv_sec, + now - (long long unsigned)next_removal_check.tv_sec + ); + + } + fprintf(log, "%s %s\n", dash, msg, dash); +} /* a litte cpp magic helps to DRY */ #define COMMANDS \ @@@ -226,6 -127,25 +226,6 @@@ static __printf_1_2 void dss_msg(const va_end(argp); } -static int disk_space_low(void) -{ - struct disk_space ds; - int ret = get_disk_space(".", &ds); - - if (ret < 0) - return ret; - if (conf.min_free_mb_arg) - if (ds.free_mb < conf.min_free_mb_arg) - return 1; - if (conf.min_free_percent_arg) - if (ds.percent_free < conf.min_free_percent_arg) - return 1; - if (conf.min_free_percent_inodes_arg) - if (ds.percent_free_inodes < conf.min_free_percent_inodes_arg) - return 1; - return 0; -} - static void dss_get_snapshot_list(struct snapshot_list *sl) { get_snapshot_list(sl, conf.unit_interval_arg, conf.num_intervals_arg); @@@ -521,7 -441,7 +521,7 @@@ static int try_to_free_disk_space(void const char *why; int low_disk_space; - ret = disk_space_low(); + ret = disk_space_low(NULL); if (ret < 0) return ret; low_disk_space = ret; @@@ -964,7 -884,7 +964,7 @@@ static int parse_config_file(int overri conf.logfile_given = 1; } } - if (conf.logfile_given) { + if (conf.logfile_given && conf.run_given && conf.daemon_given) { logfile = open_log(conf.logfile_arg); log_welcome(conf.loglevel_arg); } @@@ -983,16 -903,24 +983,16 @@@ static int change_to_dest_dir(void return dss_chdir(conf.dest_dir_arg); } -static void dump_dss_config(const char *msg) -{ - if (conf.loglevel_arg > INFO) - return; - DSS_INFO_LOG("%s\n", msg); - cmdline_parser_dump(logfile? logfile : stderr, &conf); -} - static int handle_sighup(void) { int ret; DSS_NOTICE_LOG("SIGHUP, re-reading config\n"); - dump_dss_config("current config"); + dump_dss_config("old"); ret = parse_config_file(1); if (ret < 0) return ret; - dump_dss_config("new config"); + dump_dss_config("reloaded"); invalidate_next_snapshot_time(); return change_to_dest_dir(); } @@@ -1426,10 -1354,10 +1426,10 @@@ int main(int argc, char **argv } if (conf.daemon_given) daemon_init(); - dump_dss_config("dss configuration"); ret = change_to_dest_dir(); if (ret < 0) goto out; + dump_dss_config("startup"); ret = setup_signal_handling(); if (ret < 0) goto out; diff --combined dss.ggo index 3a97568,8f1ec5c..1662e0d --- a/dss.ggo +++ b/dss.ggo @@@ -1,9 -1,9 +1,9 @@@ -# Copyright (C) 2008-2009 Andre Noll +# Copyright (C) 2008-2010 Andre Noll # # Licensed under the GPL v2. For licencing details see COPYING. package "dss" -version "0.1.3" +version "0.1.4" purpose "the dyadic snapshot scheduler dss creates hardlink-based snapshots of a given directory on a remote @@@ -77,9 -77,10 +77,10 @@@ option "logfile" "Logfile for the dss daemon process" string typestr="filename" optional - details=" - This option is mostly useful for the run command if --daemon - is also given. + details = " + This option is only honored if both --run and --daemon are + given. Otherwise it is silently ignored and log output is + written to stderr. " ################## @@@ -268,7 -269,7 +269,7 @@@ option "pre-create-hook" #~~~~~~~~~~~~~~~~~~~~~~~~~~ "Executed before snapshot creation" string typestr="command" -default = "/bin/true" +default = "true" optional details=" Execute this command before trying to create a new snapshot. @@@ -287,7 -288,7 +288,7 @@@ option "post-create-hook" #~~~~~~~~~~~~~~~~~~~~~~~~~~ "Executed after snapshot creation" string typestr="command" -default = "/bin/true" +default = "true" optional details=" Execute this after a snapshot has successfully been @@@ -304,7 -305,7 +305,7 @@@ option "pre-remove-hook" #~~~~~~~~~~~~~~~~~~~~~~~~~~ "Executed before snapshot removal" string typestr="command" -default = "/bin/true" +default = "true" optional details=" Execute this command before removing a snapshot. The full @@@ -326,7 -327,7 +327,7 @@@ option "post-remove-hook" #~~~~~~~~~~~~~~~~~~~~~~~~~~ "Executed after snapshot removal" string typestr="command" -default = "/bin/true" +default = "true" optional details=" Execute this after a snapshot has successfully been removed. As @@@ -339,7 -340,7 +340,7 @@@ option "exit-hook" #~~~~~~~~~~~~~~~~~~~ "Executed if run command exits" string typestr="command" -default = "/bin/true" +default = "true" optional details=" This hook is only used if the --run command was given which @@@ -400,8 -401,7 +401,8 @@@ details= Note that not every file system supports the concept of inodes. Moreover it is not possible to reliably detect whether this is the case. Therefore this feature is disabled by default. It's - safe to enable it for ext3 file systems on linux though. + safe to enable it for ext2/ext3/ext4 file systems on linux + though. A value of zero (the default) deactivates this check. "