projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
iolog: ensure proper flushing of compressed logs
[fio.git]
/
engines
/
rbd.c
diff --git
a/engines/rbd.c
b/engines/rbd.c
index aa50c801c3c831eec13a5c212fdc836c7f85e675..4bae425cb3d088efb4b926582b550324a19b178d 100644
(file)
--- a/
engines/rbd.c
+++ b/
engines/rbd.c
@@
-36,6
+36,7
@@
struct rbd_data {
struct io_u **aio_events;
struct io_u **sort_events;
int fd; /* add for poll */
struct io_u **aio_events;
struct io_u **sort_events;
int fd; /* add for poll */
+ bool connected;
};
struct rbd_options {
};
struct rbd_options {
@@
-111,6
+112,8
@@
static int _fio_setup_rbd_data(struct thread_data *td,
if (!rbd)
goto failed;
if (!rbd)
goto failed;
+ rbd->connected = false;
+
/* add for poll, init fd: -1 */
rbd->fd = -1;
/* add for poll, init fd: -1 */
rbd->fd = -1;
@@
-287,7
+290,7
@@
static void _fio_rbd_finish_aiocb(rbd_completion_t comp, void *data)
*/
ret = rbd_aio_get_return_value(fri->completion);
if (ret < 0) {
*/
ret = rbd_aio_get_return_value(fri->completion);
if (ret < 0) {
- io_u->error = ret;
+ io_u->error =
-
ret;
io_u->resid = io_u->xfer_buflen;
} else
io_u->error = 0;
io_u->resid = io_u->xfer_buflen;
} else
io_u->error = 0;
@@
-521,7
+524,7
@@
static int fio_rbd_queue(struct thread_data *td, struct io_u *io_u)
failed_comp:
rbd_aio_release(fri->completion);
failed:
failed_comp:
rbd_aio_release(fri->completion);
failed:
- io_u->error = r;
+ io_u->error =
-
r;
td_verror(td, io_u->error, "xfer");
return FIO_Q_COMPLETED;
}
td_verror(td, io_u->error, "xfer");
return FIO_Q_COMPLETED;
}
@@
-529,6
+532,10
@@
failed:
static int fio_rbd_init(struct thread_data *td)
{
int r;
static int fio_rbd_init(struct thread_data *td)
{
int r;
+ struct rbd_data *rbd = td->io_ops_data;
+
+ if (rbd->connected)
+ return 0;
r = _fio_rbd_connect(td);
if (r) {
r = _fio_rbd_connect(td);
if (r) {
@@
-559,13
+566,8
@@
static int fio_rbd_setup(struct thread_data *td)
rbd_image_info_t info;
struct fio_file *f;
struct rbd_data *rbd = NULL;
rbd_image_info_t info;
struct fio_file *f;
struct rbd_data *rbd = NULL;
- int major, minor, extra;
int r;
int r;
- /* log version of librbd. No cluster connection required. */
- rbd_version(&major, &minor, &extra);
- log_info("rbd engine: RBD version: %d.%d.%d\n", major, minor, extra);
-
/* allocate engine specific structure to deal with librbd. */
r = _fio_setup_rbd_data(td, &rbd);
if (r) {
/* allocate engine specific structure to deal with librbd. */
r = _fio_setup_rbd_data(td, &rbd);
if (r) {
@@
-589,13
+591,19
@@
static int fio_rbd_setup(struct thread_data *td)
log_err("fio_rbd_connect failed.\n");
goto cleanup;
}
log_err("fio_rbd_connect failed.\n");
goto cleanup;
}
+ rbd->connected = true;
/* get size of the RADOS block device */
r = rbd_stat(rbd->image, &info, sizeof(info));
if (r < 0) {
log_err("rbd_status failed.\n");
/* get size of the RADOS block device */
r = rbd_stat(rbd->image, &info, sizeof(info));
if (r < 0) {
log_err("rbd_status failed.\n");
- goto disconnect;
+ goto cleanup;
+ } else if (info.size == 0) {
+ log_err("image size should be larger than zero.\n");
+ r = -EINVAL;
+ goto cleanup;
}
}
+
dprint(FD_IO, "rbd-engine: image size: %lu\n", info.size);
/* taken from "net" engine. Pretend we deal with files,
dprint(FD_IO, "rbd-engine: image size: %lu\n", info.size);
/* taken from "net" engine. Pretend we deal with files,
@@
-610,14
+618,8
@@
static int fio_rbd_setup(struct thread_data *td)
f = td->files[0];
f->real_file_size = info.size;
f = td->files[0];
f->real_file_size = info.size;
- /* disconnect, then we were only connected to determine
- * the size of the RBD.
- */
- _fio_rbd_disconnect(rbd);
return 0;
return 0;
-disconnect:
- _fio_rbd_disconnect(rbd);
cleanup:
fio_rbd_cleanup(td);
return r;
cleanup:
fio_rbd_cleanup(td);
return r;