progress_shownotice(render, bg, 7);
}
+static double alpha = 0.1;
+
static void update_progress(secaddr pos)
{
struct timeval now;
gettimeofday(&now, 0);
t = tvdiff(&last_time, &now);
-#define ALPHA 0.1
-#define BETA (1 - ALPHA)
+#define BETA (1 - alpha)
if (t) {
g = wcount ? pow(BETA, t) : 0.0; f = (1 - g)/(1 - BETA);
last_time = now; last_pos = pos;
}
-#undef ALPHA
#undef BETA
throbix++; if (!throbber[throbix]) throbix = 0;
recovered(bad_lo, end); *pos_inout = end;
return (0);
}
- step = step_factor*(bad_hi - bad_lo);
+ step = (step_factor - 1)*(bad_hi - bad_lo);
if (step < step_min) step = step_min;
if (step_max && step > step_max) step = step_max;
- if (step > end - bad_lo) step = end - bad_lo;
- pos = bad_lo + step - 1;
+ if (step > end - bad_hi) step = end - bad_hi;
+ pos = bad_hi + step - 1;
want = run_length_wanted(pos, step, end);
n = recovery_read(&r, pos, want);
#ifdef DEBUG
step_max = parse_int(&p, 1, SECLIMIT - 1, "step maximum");
else if (SKIP_PREFIX("retry"))
max_retries = parse_int(&p, 0, INT_MAX, "retries");
+ else if (SKIP_PREFIX("alpha"))
+ alpha = parse_float(&p, 0, 1, "average decay factor");
else if (SKIP_PREFIX("_badwait"))
bad_block_delay = parse_float(&p, 0, DBL_MAX, "bad-block delay");
else if (SKIP_PREFIX("_blkwait"))
ev = &eventq.v[i];
switch (ev->ev) {
case EV_WRITE: start = ev->pos; f |= f_write; break;
- case EV_STOP:
- nsectors += ev->pos - start; f &= ~f_write; break;
+ case EV_STOP: nsectors += ev->pos - start; f &= ~f_write; break;
}
if (ev->pos >= limit) break;
if (f&f_fixup) start = ev->pos;
copy_progress.render = render_copy_progress;
progress_additem(&progress, ©_progress);
- if (nsectors != limit) {
+ if (nsectors == limit - start)
+ { ndone = start; nsectors = limit; }
+ else {
disc_progress.render = render_disc_progress;
progress_additem(&progress, &disc_progress);
}
if (f&f_stats) {
gettimeofday(&tv1, 0); t = tvdiff(&tv0, &tv1);
+ if (nsectors == limit - start) { ndone -= start; nsectors -= start; }
tot = scale_bytes((double)nsectors*SECTORSZ, &totunit);
rate = scale_bytes((double)nsectors*SECTORSZ/t, &rateunit);
moan("all done: %.1f %sB in %s -- %.1f %sB/s",