}
}
+static void
+FIXME_maybe_count_enospc_redirect(td_vbd_t *vbd, td_request_t treq)
+{
+ int write = treq.op == TD_OP_WRITE;
+ if (write &&
+ treq.image == tapdisk_vbd_first_image(vbd) &&
+ vbd->FIXME_enospc_redirect_count_enabled)
+ vbd->FIXME_enospc_redirect_count += treq.secs;
+}
+
static void
__tapdisk_vbd_complete_td_request(td_vbd_t *vbd, td_vbd_request_t *vreq,
td_request_t treq, int res)
if (err)
td_sector_count_add(&image->stats.fail,
treq.secs, write);
+
+ FIXME_maybe_count_enospc_redirect(vbd, treq);
}
if (err) {
} else if (vbd->secondary_mode == TD_VBD_SECONDARY_STANDBY) {
DPRINTF("ENOSPC: failing over to secondary image\n");
list_add(&vbd->secondary->next, leaf->next.prev);
+ vbd->FIXME_enospc_redirect_count_enabled = 1;
}
if (vbd->secondary_mode != TD_VBD_SECONDARY_DISABLED) {
vbd->secondary = NULL;
tapdisk_image_stats(image, st);
tapdisk_stats_leave(st, ']');
+ tapdisk_stats_field(st,
+ "FIXME_enospc_redirect_count",
+ "llu", vbd->FIXME_enospc_redirect_count);
+
tapdisk_stats_leave(st, '}');
}
td_image_t *secondary;
uint8_t secondary_mode;
+ int FIXME_enospc_redirect_count_enabled;
+ uint64_t FIXME_enospc_redirect_count;
+
/* when we encounter ENOSPC on the primary leaf image in mirror mode,
* we need to remove it from the VBD chain so that writes start going
* on the secondary leaf. However, we cannot free the image at that