;;
--disable-rbd) disable_rbd="yes"
;;
- --disable-rbd-blkin) disable_rbd_blkin="yes"
- ;;
--disable-gfapi) disable_gfapi="yes"
;;
--enable-libhdfs) libhdfs="yes"
print_config "rbd_invalidate_cache" "$rbd_inval"
fi
-##########################################
-# check for blkin
-if test "$rbd_blkin" != "yes" ; then
- rbd_blkin="no"
-fi
-cat > $TMPC << EOF
-#include <rbd/librbd.h>
-#include <zipkin_c.h>
-
-int main(int argc, char **argv)
-{
- int r;
- struct blkin_trace_info t_info;
- blkin_init_trace_info(&t_info);
- rbd_completion_t completion;
- rbd_image_t image;
- uint64_t off;
- size_t len;
- const char *buf;
- r = rbd_aio_write_traced(image, off, len, buf, completion, &t_info);
- return 0;
-}
-EOF
-if test "$disable_rbd" != "yes" && test "$disable_rbd_blkin" != "yes" \
- && compile_prog "" "-lrbd -lrados -lblkin" "rbd_blkin"; then
- LIBS="-lblkin $LIBS"
- rbd_blkin="yes"
-fi
-print_config "rbd blkin tracing" "$rbd_blkin"
-
##########################################
# Check whether we have setvbuf
if test "$setvbuf" != "yes" ; then
if test "$rbd_inval" = "yes" ; then
output_sym "CONFIG_RBD_INVAL"
fi
-if test "$rbd_blkin" = "yes" ; then
- output_sym "CONFIG_RBD_BLKIN"
-fi
if test "$setvbuf" = "yes" ; then
output_sym "CONFIG_SETVBUF"
fi
#include "../fio.h"
#include "../optgroup.h"
-#ifdef CONFIG_RBD_BLKIN
-#include <zipkin_c.h>
-#endif
#ifdef CONFIG_RBD_POLL
/* add for poll */
rbd_completion_t completion;
int io_seen;
int io_complete;
-#ifdef CONFIG_RBD_BLKIN
- struct blkin_trace_info info;
-#endif
};
struct rbd_data {
int r;
/* add for rbd poll */
- rbd->fd = eventfd(0, EFD_NONBLOCK);
+ rbd->fd = eventfd(0, EFD_SEMAPHORE);
if (rbd->fd < 0) {
log_err("eventfd failed.\n");
return false;
int event_num = 0;
struct fio_rbd_iou *fri = NULL;
rbd_completion_t comps[min_evts];
+ uint64_t counter;
+ bool completed;
struct pollfd pfd;
pfd.fd = rbd->fd;
pfd.events = POLLIN;
- ret = poll(&pfd, 1, -1);
+ ret = poll(&pfd, 1, wait ? -1 : 0);
if (ret <= 0)
return 0;
-
- assert(pfd.revents & POLLIN);
+ if (!(pfd.revents & POLLIN))
+ return 0;
event_num = rbd_poll_io_events(rbd->image, comps, min_evts);
for (i = 0; i < event_num; i++) {
fri = rbd_aio_get_arg(comps[i]);
io_u = fri->io_u;
+
+ /* best effort to decrement the semaphore */
+ ret = read(rbd->fd, &counter, sizeof(counter));
+ if (ret <= 0)
+ log_err("rbd_iter_events failed to decrement semaphore.\n");
+
+ completed = fri_check_complete(rbd, io_u, events);
+ assert(completed);
+
+ this_events++;
+ }
#else
io_u_qiter(&td->io_u_all, io_u, i) {
-#endif
if (!(io_u->flags & IO_U_F_FLIGHT))
continue;
if (rbd_io_u_seen(io_u))
else if (wait)
rbd->sort_events[sidx++] = io_u;
}
+#endif
if (!wait || !sidx)
return this_events;
}
if (io_u->ddir == DDIR_WRITE) {
-#ifdef CONFIG_RBD_BLKIN
- blkin_init_trace_info(&fri->info);
- r = rbd_aio_write_traced(rbd->image, io_u->offset, io_u->xfer_buflen,
- io_u->xfer_buf, fri->completion, &fri->info);
-#else
r = rbd_aio_write(rbd->image, io_u->offset, io_u->xfer_buflen,
io_u->xfer_buf, fri->completion);
-#endif
if (r < 0) {
log_err("rbd_aio_write failed.\n");
goto failed_comp;
}
} else if (io_u->ddir == DDIR_READ) {
-#ifdef CONFIG_RBD_BLKIN
- blkin_init_trace_info(&fri->info);
- r = rbd_aio_read_traced(rbd->image, io_u->offset, io_u->xfer_buflen,
- io_u->xfer_buf, fri->completion, &fri->info);
-#else
r = rbd_aio_read(rbd->image, io_u->offset, io_u->xfer_buflen,
io_u->xfer_buf, fri->completion);
-#endif
if (r < 0) {
log_err("rbd_aio_read failed.\n");