]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
rbd: Set timeout options for librados
authorWido den Hollander <wido@widodh.nl>
Tue, 25 Feb 2014 09:50:36 +0000 (10:50 +0100)
committerJán Tomko <jtomko@redhat.com>
Tue, 25 Feb 2014 10:14:44 +0000 (11:14 +0100)
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

index abb110e86e09974776739455d551f02ef7ae2f8a..22ed7dea214ce7eb4690c0d7008068e3c1191182 100644 (file)
@@ -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);
@@ -197,6 +200,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) {