From: Alasdair Kergon Date: Wed, 30 Sep 2009 17:43:51 +0000 (+0000) Subject: Factor out poll_mirror_progress and introduce progress_t. X-Git-Tag: v2_02_91~2619 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=42dd692beab286cc8f4879ea4da1b7d5d70ffbfa;p=lvm2.git Factor out poll_mirror_progress and introduce progress_t. --- diff --git a/WHATS_NEW b/WHATS_NEW index 89c5d1de5..979c46a08 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.54 - ===================================== + Factor out poll_mirror_progress and introduce progress_t. Distinguish between powers of 1000 and powers of 1024 in unit suffixes. Restart lvconverts in vgchange by sharing lv_spawn_background_polling. Generalise polldaemon code by changing mirror-specific variable names. diff --git a/tools/polldaemon.c b/tools/polldaemon.c index d0c39d1f1..4a529fd13 100644 --- a/tools/polldaemon.c +++ b/tools/polldaemon.c @@ -63,6 +63,43 @@ static int _become_daemon(struct cmd_context *cmd) return 1; } +typedef enum { + PROGRESS_CHECK_FAILED = 0, + PROGRESS_UNFINISHED = 1, + PROGRESS_FINISHED_SEGMENT = 2, + PROGRESS_FINISHED_ALL = 3 +} progress_t; + +progress_t poll_mirror_progress(struct cmd_context *cmd, + struct logical_volume *lv, const char *name, + struct daemon_parms *parms) +{ + float segment_percent = 0.0, overall_percent = 0.0; + uint32_t event_nr = 0; + + if (!lv_mirror_percent(cmd, lv, !parms->interval, &segment_percent, + &event_nr)) { + log_error("ABORTING: Mirror percentage check failed."); + return PROGRESS_CHECK_FAILED; + } + + overall_percent = copy_percent(lv); + if (parms->progress_display) + log_print("%s: %s: %.1f%%", name, parms->progress_title, + overall_percent); + else + log_verbose("%s: %s: %.1f%%", name, parms->progress_title, + overall_percent); + + if (segment_percent < 100.0) + return PROGRESS_UNFINISHED; + + if (overall_percent >= 100.0) + return PROGRESS_FINISHED_ALL; + + return PROGRESS_FINISHED_SEGMENT; +} + static int _check_lv_status(struct cmd_context *cmd, struct volume_group *vg, struct logical_volume *lv, @@ -70,8 +107,7 @@ static int _check_lv_status(struct cmd_context *cmd, int *finished) { struct dm_list *lvs_changed; - float segment_percent = 0.0, overall_percent = 0.0; - uint32_t event_nr = 0; + progress_t progress; /* By default, caller should not retry */ *finished = 1; @@ -86,21 +122,11 @@ static int _check_lv_status(struct cmd_context *cmd, return 0; } - if (!lv_mirror_percent(cmd, lv, !parms->interval, &segment_percent, - &event_nr)) { - log_error("ABORTING: Mirror percentage check failed."); - return 0; - } - - overall_percent = copy_percent(lv); - if (parms->progress_display) - log_print("%s: %s: %.1f%%", name, parms->progress_title, - overall_percent); - else - log_verbose("%s: %s: %.1f%%", name, parms->progress_title, - overall_percent); + progress = poll_mirror_progress(cmd, lv, name, parms); + if (progress == PROGRESS_CHECK_FAILED) + return_0; - if (segment_percent < 100.0) { + if (progress == PROGRESS_UNFINISHED) { /* The only case the caller *should* try again later */ *finished = 0; return 1; @@ -112,7 +138,7 @@ static int _check_lv_status(struct cmd_context *cmd, } /* Finished? Or progress to next segment? */ - if (overall_percent >= 100.0) { + if (progress == PROGRESS_FINISHED_ALL) { if (!parms->poll_fns->finish_copy(cmd, vg, lv, lvs_changed)) return 0; } else {