From e6cb857c98bdd09ce36d3d6a4018494c1dfd8435 Mon Sep 17 00:00:00 2001 From: Fan Yong Date: Wed, 4 Mar 2015 05:00:32 +0800 Subject: [PATCH] LU-6322 lfsck: show start/complete time directly It is more easy for the users to use/understand when the LFSCK was started and/or when the LFSCK completed by showing related time directly. Signed-off-by: Fan Yong Change-Id: Ibdacccf1abba6041eaddd6bb5456fb122e9ca994 Reviewed-on: http://review.whamcloud.com/13948 Tested-by: Jenkins Reviewed-by: Andreas Dilger Tested-by: Maloo Reviewed-by: Lai Siyao Reviewed-by: Oleg Drokin --- lustre/lfsck/lfsck_internal.h | 2 +- lustre/lfsck/lfsck_layout.c | 6 ++--- lustre/lfsck/lfsck_lib.c | 58 ++++++++++++++++++++++++++---------------- lustre/lfsck/lfsck_namespace.c | 44 +++++++++++++++++++++++++------- 4 files changed, 75 insertions(+), 35 deletions(-) diff --git a/lustre/lfsck/lfsck_internal.h b/lustre/lfsck/lfsck_internal.h index 6153b0c..5041e63 100644 --- a/lustre/lfsck/lfsck_internal.h +++ b/lustre/lfsck/lfsck_internal.h @@ -884,7 +884,7 @@ void lfsck_instance_cleanup(const struct lu_env *env, struct lfsck_instance *lfsck); int lfsck_bits_dump(struct seq_file *m, int bits, const char *names[], const char *prefix); -int lfsck_time_dump(struct seq_file *m, __u64 time, const char *prefix); +int lfsck_time_dump(struct seq_file *m, __u64 time, const char *name); int lfsck_pos_dump(struct seq_file *m, struct lfsck_position *pos, const char *prefix); void lfsck_pos_fill(const struct lu_env *env, struct lfsck_instance *lfsck, diff --git a/lustre/lfsck/lfsck_layout.c b/lustre/lfsck/lfsck_layout.c index 207bfcf..c94cf83 100644 --- a/lustre/lfsck/lfsck_layout.c +++ b/lustre/lfsck/lfsck_layout.c @@ -4789,17 +4789,17 @@ static int lfsck_layout_dump(const struct lu_env *env, goto out; rc = lfsck_time_dump(m, lo->ll_time_last_complete, - "time_since_last_completed"); + "last_completed"); if (rc < 0) goto out; rc = lfsck_time_dump(m, lo->ll_time_latest_start, - "time_since_latest_start"); + "latest_start"); if (rc < 0) goto out; rc = lfsck_time_dump(m, lo->ll_time_last_checkpoint, - "time_since_last_checkpoint"); + "last_checkpoint"); if (rc < 0) goto out; diff --git a/lustre/lfsck/lfsck_lib.c b/lustre/lfsck/lfsck_lib.c index 02616b7..4951396 100644 --- a/lustre/lfsck/lfsck_lib.c +++ b/lustre/lfsck/lfsck_lib.c @@ -1719,8 +1719,11 @@ int lfsck_bits_dump(struct seq_file *m, int bits, const char *names[], int flag; int i; bool newline = (bits != 0 ? false : true); + int rc; - seq_printf(m, "%s:%c", prefix, bits != 0 ? ' ' : '\n'); + rc = seq_printf(m, "%s:%c", prefix, bits != 0 ? ' ' : '\n'); + if (rc < 0) + return rc; for (i = 0, flag = 1; bits != 0; i++, flag = 1 << i) { if (flag & bits) { @@ -1729,25 +1732,38 @@ int lfsck_bits_dump(struct seq_file *m, int bits, const char *names[], if (bits == 0) newline = true; - seq_printf(m, "%s%c", names[i], - newline ? '\n' : ','); + rc = seq_printf(m, "%s%c", names[i], + newline ? '\n' : ','); + if (rc < 0) + return rc; } } } if (!newline) - seq_printf(m, "\n"); - return 0; + rc = seq_printf(m, "\n"); + + return rc; } -int lfsck_time_dump(struct seq_file *m, __u64 time, const char *prefix) +int lfsck_time_dump(struct seq_file *m, __u64 time, const char *name) { - if (time != 0) - seq_printf(m, "%s: "LPU64" seconds\n", prefix, - cfs_time_current_sec() - time); - else - seq_printf(m, "%s: N/A\n", prefix); - return 0; + int rc; + + if (time == 0) { + rc = seq_printf(m, "%s_time: N/A\n", name); + if (rc == 0) + rc = seq_printf(m, "time_since_%s: N/A\n", name); + + return rc; + } + + rc = seq_printf(m, "%s_time: "LPU64"\n", name, time); + if (rc == 0) + rc = seq_printf(m, "time_since_%s: "LPU64" seconds\n", + name, cfs_time_current_sec() - time); + + return rc; } int lfsck_pos_dump(struct seq_file *m, struct lfsck_position *pos, @@ -1755,17 +1771,15 @@ int lfsck_pos_dump(struct seq_file *m, struct lfsck_position *pos, { if (fid_is_zero(&pos->lp_dir_parent)) { if (pos->lp_oit_cookie == 0) - seq_printf(m, "%s: N/A, N/A, N/A\n", - prefix); - else - seq_printf(m, "%s: "LPU64", N/A, N/A\n", - prefix, pos->lp_oit_cookie); - } else { - seq_printf(m, "%s: "LPU64", "DFID", "LPX64"\n", - prefix, pos->lp_oit_cookie, - PFID(&pos->lp_dir_parent), pos->lp_dir_cookie); + return seq_printf(m, "%s: N/A, N/A, N/A\n", prefix); + + return seq_printf(m, "%s: "LPU64", N/A, N/A\n", + prefix, pos->lp_oit_cookie); } - return 0; + + return seq_printf(m, "%s: "LPU64", "DFID", "LPX64"\n", + prefix, pos->lp_oit_cookie, + PFID(&pos->lp_dir_parent), pos->lp_dir_cookie); } void lfsck_pos_fill(const struct lu_env *env, struct lfsck_instance *lfsck, diff --git a/lustre/lfsck/lfsck_namespace.c b/lustre/lfsck/lfsck_namespace.c index 1598f75f..987ce57 100644 --- a/lustre/lfsck/lfsck_namespace.c +++ b/lustre/lfsck/lfsck_namespace.c @@ -4275,17 +4275,17 @@ lfsck_namespace_dump(const struct lu_env *env, struct lfsck_component *com, goto out; rc = lfsck_time_dump(m, ns->ln_time_last_complete, - "time_since_last_completed"); + "last_completed"); if (rc < 0) goto out; rc = lfsck_time_dump(m, ns->ln_time_latest_start, - "time_since_latest_start"); + "latest_start"); if (rc < 0) goto out; rc = lfsck_time_dump(m, ns->ln_time_last_checkpoint, - "time_since_last_checkpoint"); + "last_checkpoint"); if (rc < 0) goto out; @@ -4318,17 +4318,18 @@ lfsck_namespace_dump(const struct lu_env *env, struct lfsck_component *com, if (duration != 0) do_div(new_checked, duration); + if (rtime != 0) do_div(speed, rtime); - lfsck_namespace_dump_statistics(m, ns, checked, - ns->ln_objs_checked_phase2, - rtime, ns->ln_run_time_phase2); + lfsck_namespace_dump_statistics(m, ns, checked, 0, rtime, 0); seq_printf(m, "average_speed_phase1: "LPU64" items/sec\n" "average_speed_phase2: N/A\n" + "average_speed_total: "LPU64" items/sec\n" "real_time_speed_phase1: "LPU64" items/sec\n" "real_time_speed_phase2: N/A\n", speed, + speed, new_checked); LASSERT(lfsck->li_di_oit != NULL); @@ -4366,50 +4367,75 @@ lfsck_namespace_dump(const struct lu_env *env, struct lfsck_component *com, com->lc_new_checked; __u64 speed1 = ns->ln_items_checked; __u64 speed2 = checked; + __u64 speed0 = speed1 + speed2; __u64 new_checked = com->lc_new_checked * msecs_to_jiffies(MSEC_PER_SEC); __u32 rtime = ns->ln_run_time_phase2 + cfs_duration_sec(duration + HALF_SEC); + __u32 time0 = ns->ln_run_time_phase1 + rtime; if (duration != 0) do_div(new_checked, duration); + if (ns->ln_run_time_phase1 != 0) do_div(speed1, ns->ln_run_time_phase1); + else if (ns->ln_items_checked != 0) + time0++; + if (rtime != 0) do_div(speed2, rtime); + else if (checked != 0) + time0++; + + if (time0 != 0) + do_div(speed0, time0); + lfsck_namespace_dump_statistics(m, ns, ns->ln_items_checked, checked, ns->ln_run_time_phase1, rtime); - seq_printf(m, "average_speed_phase1: "LPU64" items/sec\n" "average_speed_phase2: "LPU64" objs/sec\n" + "average_speed_total: "LPU64" items/sec\n" "real_time_speed_phase1: N/A\n" "real_time_speed_phase2: "LPU64" objs/sec\n" "current_position: "DFID"\n", speed1, speed2, + speed0, new_checked, PFID(&ns->ln_fid_latest_scanned_phase2)); } else { __u64 speed1 = ns->ln_items_checked; __u64 speed2 = ns->ln_objs_checked_phase2; + __u64 speed0 = speed1 + speed2; + __u32 time0 = ns->ln_run_time_phase1 + ns->ln_run_time_phase2; if (ns->ln_run_time_phase1 != 0) do_div(speed1, ns->ln_run_time_phase1); + else if (ns->ln_items_checked != 0) + time0++; + if (ns->ln_run_time_phase2 != 0) do_div(speed2, ns->ln_run_time_phase2); + else if (ns->ln_objs_checked_phase2 != 0) + time0++; + + if (time0 != 0) + do_div(speed0, time0); + lfsck_namespace_dump_statistics(m, ns, ns->ln_items_checked, ns->ln_objs_checked_phase2, ns->ln_run_time_phase1, ns->ln_run_time_phase2); - seq_printf(m, "average_speed_phase1: "LPU64" items/sec\n" "average_speed_phase2: "LPU64" objs/sec\n" + "average_speed_total: "LPU64" items/sec\n" "real_time_speed_phase1: N/A\n" "real_time_speed_phase2: N/A\n" "current_position: N/A\n", speed1, - speed2); + speed2, + speed0); } out: up_read(&com->lc_sem); -- 1.8.3.1