Commit 439d5953 authored by Lars Ellenberg's avatar Lars Ellenberg Committed by Philipp Reisner

drbd: show progress bar and ETA for online-verify

Signed-off-by: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent ea5442af
...@@ -2157,7 +2157,10 @@ static inline void drbd_get_syncer_progress(struct drbd_conf *mdev, ...@@ -2157,7 +2157,10 @@ static inline void drbd_get_syncer_progress(struct drbd_conf *mdev,
* units of BM_BLOCK_SIZE. * units of BM_BLOCK_SIZE.
* for the percentage, we don't care. */ * for the percentage, we don't care. */
*bits_left = drbd_bm_total_weight(mdev) - mdev->rs_failed; if (mdev->state.conn == C_VERIFY_S || mdev->state.conn == C_VERIFY_T)
*bits_left = mdev->ov_left;
else
*bits_left = drbd_bm_total_weight(mdev) - mdev->rs_failed;
/* >> 10 to prevent overflow, /* >> 10 to prevent overflow,
* +1 to prevent division by zero */ * +1 to prevent division by zero */
if (*bits_left > mdev->rs_total) { if (*bits_left > mdev->rs_total) {
......
...@@ -45,6 +45,19 @@ const struct file_operations drbd_proc_fops = { ...@@ -45,6 +45,19 @@ const struct file_operations drbd_proc_fops = {
.release = single_release, .release = single_release,
}; };
void seq_printf_with_thousands_grouping(struct seq_file *seq, long v)
{
/* v is in kB/sec. We don't expect TiByte/sec yet. */
if (unlikely(v >= 1000000)) {
/* cool: > GiByte/s */
seq_printf(seq, "%ld,", v / 1000000);
v /= 1000000;
seq_printf(seq, "%03ld,%03ld", v/1000, v % 1000);
} else if (likely(v >= 1000))
seq_printf(seq, "%ld,%03ld", v/1000, v % 1000);
else
seq_printf(seq, "%ld", v);
}
/*lge /*lge
* progress bars shamelessly adapted from driver/md/md.c * progress bars shamelessly adapted from driver/md/md.c
...@@ -94,6 +107,7 @@ static void drbd_syncer_progress(struct drbd_conf *mdev, struct seq_file *seq) ...@@ -94,6 +107,7 @@ static void drbd_syncer_progress(struct drbd_conf *mdev, struct seq_file *seq)
/* Rolling marks. last_mark+1 may just now be modified. last_mark+2 is /* Rolling marks. last_mark+1 may just now be modified. last_mark+2 is
* at least (DRBD_SYNC_MARKS-2)*DRBD_SYNC_MARK_STEP old, and has at * at least (DRBD_SYNC_MARKS-2)*DRBD_SYNC_MARK_STEP old, and has at
* least DRBD_SYNC_MARK_STEP time before it will be modified. */ * least DRBD_SYNC_MARK_STEP time before it will be modified. */
/* ------------------------ ~18s average ------------------------ */
i = (mdev->rs_last_mark + 2) % DRBD_SYNC_MARKS; i = (mdev->rs_last_mark + 2) % DRBD_SYNC_MARKS;
dt = (jiffies - mdev->rs_mark_time[i]) / HZ; dt = (jiffies - mdev->rs_mark_time[i]) / HZ;
if (dt > (DRBD_SYNC_MARK_STEP * DRBD_SYNC_MARKS)) if (dt > (DRBD_SYNC_MARK_STEP * DRBD_SYNC_MARKS))
...@@ -107,14 +121,29 @@ static void drbd_syncer_progress(struct drbd_conf *mdev, struct seq_file *seq) ...@@ -107,14 +121,29 @@ static void drbd_syncer_progress(struct drbd_conf *mdev, struct seq_file *seq)
seq_printf(seq, "finish: %lu:%02lu:%02lu", seq_printf(seq, "finish: %lu:%02lu:%02lu",
rt / 3600, (rt % 3600) / 60, rt % 60); rt / 3600, (rt % 3600) / 60, rt % 60);
/* current speed average over (SYNC_MARKS * SYNC_MARK_STEP) jiffies */
dbdt = Bit2KB(db/dt); dbdt = Bit2KB(db/dt);
if (dbdt > 1000) seq_printf(seq, " speed: ");
seq_printf(seq, " speed: %ld,%03ld", seq_printf_with_thousands_grouping(seq, dbdt);
dbdt/1000, dbdt % 1000); seq_printf(seq, " (");
else /* ------------------------- ~3s average ------------------------ */
seq_printf(seq, " speed: %ld", dbdt); if (proc_details >= 1) {
/* this is what drbd_rs_should_slow_down() uses */
i = (mdev->rs_last_mark + DRBD_SYNC_MARKS-1) % DRBD_SYNC_MARKS;
dt = (jiffies - mdev->rs_mark_time[i]) / HZ;
if (dt > (DRBD_SYNC_MARK_STEP * DRBD_SYNC_MARKS))
stalled = 1;
if (!dt)
dt++;
db = mdev->rs_mark_left[i] - rs_left;
rt = (dt * (rs_left / (db/100+1)))/100; /* seconds */
dbdt = Bit2KB(db/dt);
seq_printf_with_thousands_grouping(seq, dbdt);
seq_printf(seq, " -- ");
}
/* --------------------- long term average ---------------------- */
/* mean speed since syncer started /* mean speed since syncer started
* we do account for PausedSync periods */ * we do account for PausedSync periods */
dt = (jiffies - mdev->rs_start - mdev->rs_paused) / HZ; dt = (jiffies - mdev->rs_start - mdev->rs_paused) / HZ;
...@@ -122,11 +151,8 @@ static void drbd_syncer_progress(struct drbd_conf *mdev, struct seq_file *seq) ...@@ -122,11 +151,8 @@ static void drbd_syncer_progress(struct drbd_conf *mdev, struct seq_file *seq)
dt = 1; dt = 1;
db = mdev->rs_total - rs_left; db = mdev->rs_total - rs_left;
dbdt = Bit2KB(db/dt); dbdt = Bit2KB(db/dt);
if (dbdt > 1000) seq_printf_with_thousands_grouping(seq, dbdt);
seq_printf(seq, " (%ld,%03ld)", seq_printf(seq, ")");
dbdt/1000, dbdt % 1000);
else
seq_printf(seq, " (%ld)", dbdt);
if (mdev->state.conn == C_SYNC_TARGET) { if (mdev->state.conn == C_SYNC_TARGET) {
if (mdev->c_sync_rate > 1000) if (mdev->c_sync_rate > 1000)
...@@ -236,7 +262,9 @@ static int drbd_seq_show(struct seq_file *seq, void *v) ...@@ -236,7 +262,9 @@ static int drbd_seq_show(struct seq_file *seq, void *v)
Bit2KB(drbd_bm_total_weight(mdev))); Bit2KB(drbd_bm_total_weight(mdev)));
} }
if (mdev->state.conn == C_SYNC_SOURCE || if (mdev->state.conn == C_SYNC_SOURCE ||
mdev->state.conn == C_SYNC_TARGET) mdev->state.conn == C_SYNC_TARGET ||
mdev->state.conn == C_VERIFY_S ||
mdev->state.conn == C_VERIFY_T)
drbd_syncer_progress(mdev, seq); drbd_syncer_progress(mdev, seq);
if (mdev->state.conn == C_VERIFY_S || mdev->state.conn == C_VERIFY_T) { if (mdev->state.conn == C_VERIFY_S || mdev->state.conn == C_VERIFY_T) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment