[libvirt] [PATCH 3/3] rbd: Set timeout options for librados

Wido den Hollander wido at widodh.nl
Wed Feb 12 14:11:34 UTC 2014


These timeout values make librados/librbd return -ETIMEDOUT when a
operation is blocking due to a failing/unreachable Ceph cluster.

By having the operations time out libvirt will not block.
---
 src/storage/storage_backend_rbd.c |   17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/src/storage/storage_backend_rbd.c b/src/storage/storage_backend_rbd.c
index 8d1e320..2c97bf4 100644
--- a/src/storage/storage_backend_rbd.c
+++ b/src/storage/storage_backend_rbd.c
@@ -60,6 +60,9 @@ static int virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDStatePtr ptr,
     char secretUuid[VIR_UUID_STRING_BUFLEN];
     size_t i;
     char *mon_buff = NULL;
+    const char *client_mount_timeout = "30";
+    const char *mon_op_timeout = "30";
+    const char *osd_op_timeout = "30";
 
     VIR_DEBUG("Found Cephx username: %s",
               pool->def->source.auth.cephx.username);
@@ -198,6 +201,20 @@ static int virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDStatePtr ptr,
         goto cleanup;
     }
 
+    /*
+     * Set timeout options for librados.
+     * In case the Ceph cluster is down libvirt won't block forever.
+     * Operations in librados will return -ETIMEDOUT when the timeout is reached.
+     */
+    VIR_DEBUG("Setting RADOS option client_mount_timeout to %s", client_mount_timeout);
+    rados_conf_set(ptr->cluster, "client_mount_timeout", client_mount_timeout);
+
+    VIR_DEBUG("Setting RADOS option rados_mon_op_timeout to %s", mon_op_timeout);
+    rados_conf_set(ptr->cluster, "rados_mon_op_timeout", mon_op_timeout);
+
+    VIR_DEBUG("Setting RADOS option rados_osd_op_timeout to %s", osd_op_timeout);
+    rados_conf_set(ptr->cluster, "rados_osd_op_timeout", osd_op_timeout);
+
     ptr->starttime = time(0);
     r = rados_connect(ptr->cluster);
     if (r < 0) {
-- 
1.7.9.5




More information about the libvir-list mailing list