]> xenbits.xensource.com Git - people/dstodden/blktap.git/commitdiff
CP-1840: Count ENOSPC redirects.
authorDaniel Stodden <daniel.stodden@citrix.com>
Fri, 15 Oct 2010 01:17:31 +0000 (18:17 -0700)
committerDaniel Stodden <daniel.stodden@citrix.com>
Fri, 15 Oct 2010 01:17:31 +0000 (18:17 -0700)
Signed-off-by: Daniel Stodden <daniel.stodden@citrix.com>
drivers/tapdisk-vbd.c
drivers/tapdisk-vbd.h

index d20a07b48f2a763ad9a290c2a85aaaf65a754d8b..ae52f0c9e10bb028f7c4cdd7f5f370a5fff7e6b0 100644 (file)
@@ -1305,6 +1305,16 @@ tapdisk_vbd_complete_vbd_request(td_vbd_t *vbd, td_vbd_request_t *vreq)
        }
 }
 
+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)
@@ -1322,6 +1332,8 @@ __tapdisk_vbd_complete_td_request(td_vbd_t *vbd, td_vbd_request_t *vreq,
                if (err)
                        td_sector_count_add(&image->stats.fail,
                                            treq.secs, write);
+
+               FIXME_maybe_count_enospc_redirect(vbd, treq);
        }
 
        if (err) {
@@ -1439,6 +1451,7 @@ tapdisk_vbd_complete_td_request(td_request_t treq, int res)
                } 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;
@@ -1875,5 +1888,9 @@ tapdisk_vbd_stats(td_vbd_t *vbd, td_stats_t *st)
                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, '}');
 }
index d69804aa5cc8cde38bb7398180f5fc44dcf41ff4..00bd9662f6c7311eb11286a1930c72c7c841aa9c 100644 (file)
@@ -103,6 +103,9 @@ struct td_vbd_handle {
        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